前面我们学习了如何创建自己的schema,以及Angular Cli中component
的源代码解读。现在来实践一下,来创建一个我们自己的schame,可以用来创建“page”类型的componet
。
为什么要创建“page”类型的组件?
比如我们有一个angular项目,在项目的开发过程中,我们会创建一些路由,这些路由需要绑定到对应的组件,做为页面的承载,然后我们会根据页面上部分不同的功能,抽取为单独的组件,最后可以随意自由组合组件来输出我们的页面。虽然说一切都是组件,但是我们的组件多起来后,一眼看去,无法分辨出来到底哪些只是个组件,而哪些是作为页面的。由此,我们需要创建”page“类型的组件,这些组件,一看就知道是作为一个独立的页面,而且它不会作为组件出现在别的组件中的。
比如,我们有一个home
组件是个页面,那么我们需要创建的内容有:
home.page.ts
home.page.less
home.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
。
完~ 😷