前面我们学习了如何创建自己的schema,以及Angular Cli中component的源代码解读。现在来实践一下,来创建一个我们自己的schame,可以用来创建“page”类型的componet。
为什么要创建“page”类型的组件?
比如我们有一个angular项目,在项目的开发过程中,我们会创建一些路由,这些路由需要绑定到对应的组件,做为页面的承载,然后我们会根据页面上部分不同的功能,抽取为单独的组件,最后可以随意自由组合组件来输出我们的页面。虽然说一切都是组件,但是我们的组件多起来后,一眼看去,无法分辨出来到底哪些只是个组件,而哪些是作为页面的。由此,我们需要创建”page“类型的组件,这些组件,一看就知道是作为一个独立的页面,而且它不会作为组件出现在别的组件中的。
比如,我们有一个home组件是个页面,那么我们需要创建的内容有:
home.page.tshome.page.lesshome.page.html
这样,可以和其他的单纯的组件相互区分开来。
创建schema项目
可以参考文章:angular 自定义shema(一),我们会创建tcs-schema这个自定义shema项目。
创建好项目之后,我们需要创建一个自定义的shema:page。
先看下文件目录:

files文件夹为模板文件夹,我们只需要创建必须的ts文件、html文件以及样式文件。
schema.json文件
schema.json文件定义了执行这个原理图的时候需要什么参数,以及我们可以传递什么参数。
直接来看:
1 | { |
需要特别注意的是这个type类型,我们这里设定为page。这样,我们模板接受到的__type__参数的值为page,我们即可创建page类型的组件。
index.ts 文件
直接看代码:
1 | import { |
files模板文件
首先,files下面是一个大的文件夹:__name@dasherize@if-flat__,我们使用原理图创建这个文件夹,然后这个文件夹里面是我们需要的三个文件。
html文件
html文件为:__name@dasherize__.__type@dasherize__.html.template。这里主要是两个参数:name以及type。
里面的内容我们可以自定义,比如我们只需要简单的一个标记:
1 | <p><%= dasherize(name) %></p> |
我们希望在page组件里面对样式有个约束,希望在这个组件里面定义的样式不要影响其他组件,那么我们需要给这个组件的顶层加个选择器,然后这个组件的样式定义在这个组件选择器的下面,我们可以生成这样的html:
1 | <div class="<%= dasherize(name) %>-page"> |
样式文件
样式文件为:__name@dasherize__.__type@dasherize__.__style__.template。这里除过name和type以外,还接受style参数,比如当我们的项目中的样式文件为less或scss时,创建的样式文件的文件类型就为less或scss。当然,默认是css。
结合上面的需求,我们可以将样式文件中写入约束的类:
1 | .<%= dasherize(name) %>-page { |
ts文件
ts文件为:__name@dasherize__.__type@dasherize__.ts.template。生成的ts文件中需要有组件的定义,以及一些其他操作,直接看代码:
1 | import { Component, OnInit<% if(!!viewEncapsulation) { %>, ViewEncapsulation<% }%><% if(changeDetection !== 'Default') { %>, ChangeDetectionStrategy<% }%> } from '@angular/core'; |
测试
在angular项目中测试:
1 | ng g ../tcs-schema/src/collection.json:page components/tony-best |
分析上面这个命令,我的原理图项目和angular项目是同级的,我在angular 项目中运行上面的命令,所以需要../tsc-schema。
在tcs-schema/src/collection.json中使用page来在angular项目中的src/app/components/路径里面创建page类型组件,名字为tony-best。
最后运行结果:

发布&使用
到目前为止,我们都是本地调试的,正式使用的时候,我们需要把它发布为一个npm的包。引入后进行使用。
发包之前需要登录npm:
1 | npm adduser |
然后按照提示输入用户名、密码、邮箱,即可登录。(忘记用户名可以去npmjs.com查看)
然后发布:
1 | npm publish |
发布成功后,回到我们的angular项目,然后安装包:
1 | npm i tcs-schema --save-dev |
安装成功后,可以直接使用:
1 | ng g tcs-schema:page components/tony-best |
这样,即可在src/app/components下面创建好page类型组件tony-best。
完~ 😷