什么是 schametics

Schematics是Angular团队发布的一个代码生成工具。它提供了API,可以操作文件并在Angular项目中添加新的依赖项,ng cli 创建模板就是用它。 它也可以在非Angular项目中使用,本教程以从Angular项目为例。

使用步骤

安装 Schematics CLI

npm i -g @angular-devkit/schematics-cli

创建空白项目名称为 my-component

schematics blank --name=my-component

命令创建以下文件

λ schematics blank --name=my-component
CREATE my-component/package.json (569 bytes)
CREATE my-component/README.md (639 bytes)
CREATE my-component/tsconfig.json (656 bytes)
CREATE my-component/.gitignore (191 bytes)
CREATE my-component/.npmignore (64 bytes)
CREATE my-component/src/collection.json (231 bytes)
CREATE my-component/src/my-component/index.ts (318 bytes)
CREATE my-component/src/my-component/index_spec.ts (503 bytes)
√ Packages installed successfully.

重要文件介绍

package.json

就是npm的项目描述文件,主要可以处理依赖关系。其中一个属性

  "schematics": "./src/collection.json",

指明项目Schematic的配置文件collection.json的位置

src/collection.json

定义项目元数据,文件内容:

{
"$schema": "../node_modules/@angular-devkit/schematics/collection-schema.json",
"schematics": {
"my-component": {
"description": "自定义 component.",
"factory": "./my-component/index#myComponent"
}
}
}

可以看到声明一个schematics叫my-component。

  • description : 描述命令
  • factory : 指向需要执行的方法。这个schematics将执行my-component目录下index.ts文件下的myComponent方法。

src/my-component/index_spec.ts

是测试文件,忽略。

src/my-component/index.ts

import { Rule, SchematicContext, Tree } from '@angular-devkit/schematics';

export function myComponent(_options: any): Rule {
return (tree: Tree, _context: SchematicContext) => {
return tree;
};
}
  • Tree类:Schematics不对的文件系统执行任何直接操作。通过Tree将真实文件目录(项目中的代码文件)数据拷贝进一个树状结构里。然后对指定对树的操作。Tree有两个部分,一个是base(真实文件目录),一个是staging area(沙盒),变动都会发生在staging area,除非写入了base部分
  • Rule类:一个Rule是一个方法。它获取一个Tree,并返回经过改变的一个新的Tree。因此我们对Tree的操作也基本上在Rule中发生。所以可以说,一个Schematic就是一个Rule。

接下来对 src/my-component/index.ts文件简单修改创建一个文件

import { Rule, SchematicContext, Tree } from '@angular-devkit/schematics';

export function myComponent(_options: any): Rule {
return (tree: Tree, _context: SchematicContext) => {
//根据参数filename创建一个html文件,内容为 <h1>Hello, World</h1>
tree.create(`${_options.filename}.html`, '<h1>Hello, World</h1>');
return tree;
};
}

这里需要输入参数filename指定文件名。为了防止使用时遗漏,应当做友好交互提示。在schematics声明时可以用scema指定。回到src/collection.json做如下修改:

{
"$schema": "../node_modules/@angular-devkit/schematics/collection-schema.json",
"schematics": {
"my-component": {
"description": "自定义 component.",
"factory": "./my-component/index#myComponent",
"schema": "./my-component/schema.json",
"aliases":["nh"]
}
}
}

(这里顺便用aliases属性去了个别名为nh。ng generate component name能缩写成 ng g c name 就是用了别名。别名可以取多个。)

在my-component中添加声明"schema": "./my-component/schema.json";

然后在对应目录添加schema.json文件,对参数进行声明。

{
"$schema": "http://json-schema.org/schema",
"id": "myAngularComponent",
"title": "my-componemt的参数声明",
"type": "object",
"properties": {
"filename": {
"type": "string",
"description": "文件名:",
"x-prompt": "请输入文件名:"
}
},
"required": ["filename"]
}

id:一个独一无二字符串

title:一个描述字符串

type:类型

properties:参数的属性,就是_options的声明。

required:指定properties中声明的那些属性为必须项。如果命令不给出将提供提示【x-prompt】,提示用户输入。

接下来编译一下项目,然后把当前schematics项目连接到全局上。

# 编译项目 将ts编译成js
npm run build
# 当前项目连接到全局 类似 npm install -g xxx 的效果,另外link一次就够了,以后改动不需要link。
npm link

过程如下:

λ npm run build
> my-component@0.0.0 build D:\WorkFile\wjz\my-component
> tsc -p tsconfig.json λ npm link
npm WARN my-component@0.0.0 No repository field.
up to date in 0.773s C:\Users\xxx\AppData\Roaming\npm\node_modules\my-component -> D:\WorkFile\wjz\my-component

完成 !!!

angualr项目中使用自定义的schematics

(假设你已经安装 ng cli 不复述)

# 创建ng项目 名称 ng-test
ng new ng-test # 进入目录
cd ng-test #安装一下依赖
npm install # 重点来了 将自己的my-component schematics加入
npm link my-component # 输出类似如下内容 说明成功link
# D:\WorkFile\wjz\templ\ng-test\node_modules\my-component -> C:\Users\xxx\AppData\Roaming\npm\node_modules\my-component -> D:\WorkFile\wjz\my-component # 创建自定组件
ng g my-component:nh #输出如下,由于generate 没有给出必须参数filename,提示需要输入文件名,就是./my-component/schema.json中的所声明
? 请输入文件名: test-schematics
CREATE test-schematics.html (21 bytes) #由于未指定位置 test-schematics.html创建在ng项目的更目录下。

简单高级玩法

实践开发过程中,我并不会自己写模本。而是在原有的angular模板上改造成自己需要的。回调my-component项目中。

安装 @schematics/angular

这是个 angualr 组件模板,ng cli使用的。

npm i @schematics/angular --save-dev

在项目的目录node_modules@schematics\angular下可以看到模板。现在将component目录和所依赖的third_party目录,utility目录拷贝到src目录下,并将component修改为custom-component或你需要的名称。

ls
collection.json
custom-component/
my-component/
third_party/
utility/

修改 collection.json 文件

{
"$schema": "../node_modules/@angular-devkit/schematics/collection-schema.json",
"schematics": {
"my-component": {
"description": "自定义 component.",
"factory": "./my-component/index#myComponent",
"schema": "./my-component/schema.json",
"aliases":["nh"]
},
"custom-component": {
"description": "custom angualr component.",
"factory": "./custom-component",
"schema": "./custom-component/schema.json",
"aliases":["cc"]
}
}
}

这里新增了一个 schematics 叫 custom-component,别名为cc。

接下里在 ./src/custom-component目录下看到files/__name@dasherize@if-flat__目录,里头有四个文件,分别是:

  • name@dasherize.type@dasherize.style.template :样式文件模板
  • name@dasherize.type@dasherize.html.template :html文件模板
  • name@dasherize.type@dasherize.spec.ts.template :spec文件模板
  • name@dasherize.type@dasherize.ts.template :组件ts文件模板

只需要按自己的需求修改模板文件即可。

其他组件雷同。

现在回到先前创建的ng项目测试

#进入 ng项目的app目录,因为创建ng组件需要NgModel
cd src\app\ #创建自定义组件 custom-component 创建一个名为custom的组件
ng g my-component:cc custom #输出如下内容 创建成功
CREATE src/app/custom/custom.component.html (21 bytes)
CREATE src/app/custom/custom.component.spec.ts (628 bytes)
CREATE src/app/custom/custom.component.ts (275 bytes)
CREATE src/app/custom/custom.component.css (0 bytes)
UPDATE src/app/app.module.ts (396 bytes)

angular schametics 使用记录的更多相关文章

  1. angular采坑记录

    在angular中会遇到一些莫名的问题,导致不能完成想要的功能,可能是某项用法使用错误,或许是angular相对应不支持,或者是我们功力根本就没有达到.为了在每次采坑之后能有所收获,再遇到时能理解其根 ...

  2. python , angular js 学习记录【2】

    1.不同scope之间的通信 (1)无父子关系的scope通信: 在需要操作的scope里面定义一个事件,名称为delete_host,参数为data $rootScope.$on('delete_h ...

  3. python , angular js 学习记录【1】

    1.日期格式化 Letter Date or Time Component Presentation Examples G Era designator Text AD y Year Year 199 ...

  4. angular 项目迭代+记录采坑

    年中的时候 正在做的项目来了新的领导 给我们的NG4项目来了一次大整顿. 我们公司项目基本都是敏捷开发--> 开发出一个成熟的shared目录(里面有所有的公用组件 公用服务 公用工具类) 然后 ...

  5. Angular学习知识点记录

    问:版本直接跳转到Angular4? 答:为了遵循严格的版本策略.在angular2.x的时候,angular route的版本已经是版本3了.因此为了版本统一,angular直接从2跳到了4,.参考 ...

  6. python , angular js 学习记录【3】

    1.Alembic是SQLAlchemy作者编写的Python数据库迁移工具.用它实现模型类和数据库的同步更新.(安装以及操作步骤 使用Alembic迁移数据库) 使用Alembic添加数据库字段操作 ...

  7. Angular报错记录

    一 找不到Controller 出现这种错误,一般都是没有找到需要的Controller,需要仔细检查是否所需的Controller已经正确引入

  8. angular踩坑记录

    ng-repeat和ng-click同时使用的时候,注意不能直接在ng-click当中写代码,必须在当前$scope中绑定一个事件,转为调用该事件.否则会出现意想不到的情况.具体原因点击这里. 使用自 ...

  9. 分享一个简单程序(webApi+castle+Automapper+Ef+angular)

    前段时间在周末给朋友做了一个小程序,用来记录他们单位的一些调度信息(免费,无版权问题).把代码分享出来.整个程序没有做任何架构.但是麻雀虽小,用到的技术也没少.WebApi+Castle+AutoMa ...

随机推荐

  1. java不同基本类型之间的运算

    一.不同基本类型在JAVA中,基本类型(除了boolean外)可以自动转换的,转换形式为:byte,short,char – int --long–float–double这就是自动转换的顺序了,其中 ...

  2. Terminal终端控制台常用操作命令

    新建文件夹和文件 cd .. 返回上一级 md test 新建test文件夹 md d:\test\my d盘下新建文件夹 cd test 进入test文件夹 cd.>cc.txt 新建cc.t ...

  3. MySQL组复制MGR(二)-- 组复制搭建

    (一)主机操作 (1)路由信息vmnet5 192.168.10.0 (2)主机信息 主机名称 IP地址 操作系统版本 数据库版本 mgr-node1 192.168.10.11 centos 7.4 ...

  4. pandas之数值计算与统计

    数值计算与统计 对于DataFrame来说,求和.最大.最小.平均等统计方法,默认是按列进行统计,即axis = 0,如果添加参数axis = 1则会按照行进行统计. 如果存在空值,在统计时默认会忽略 ...

  5. Java容器学习之List

    List接口继承了Collcetion接口,Collection接口又继承了超级接口Iterable,List是有序列表,实现类有ArrayList.LinkedList.Vector.Stack等. ...

  6. 如何单页面不引用移动端的适配 (postcss)

    由于pc端移动端同时开发所以同时有vant跟elementui,我的pc端登录界面直接引用之前项目做的 因为postcss全局引用,全局的px会自动转换自适应,然后页面的布局就呈现了放大的趋势, 查阅 ...

  7. cmd 安装第三方库问题

    pip install 包名 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 一定要指定 信任豆瓣源,不然就算换了源 ...

  8. Python time strftime()方法

    描述 Python time strftime() 函数接收以时间元组,并返回以可读字符串表示的当地时间,格式由参数format决定.高佣联盟 www.cgewang.com 语法 strftime( ...

  9. C/C++编程笔记:一张思维导图,带你总结C语言全部知识点!

    很多小伙伴想要好好地学习一下C语言的知识,但是又不知道怎么学,应该学哪一些C语言的知识,笔者在网上看到了这一张C语言的比较完善的C语言的学习路线图,有兴趣的小伙伴可以保存起来哈! C语言是面向过程的, ...

  10. Android 的Fragment组件(写完放假。。。)

    今天写的有点晚,做个题目有点慢,然后搞其他事搞定就到了0点,总结下就差不多该睡了. 今天学长讲的是Fragment: 一个可以将activity拆分成几个完全独立封装的可重用的组件,每个组件有自己的生 ...