阅读本小节,你需要先了解webpack

前面我们提到了 业务逻辑视图逻辑 的分离,是为了解决JS逻辑过分膨胀的问题。通过前面的例子我们发现一个不够优雅的地方,那就是模板中使用的组件必须在组件逻辑中注入。其实模板要使用什么组件跟组件的逻辑没有一点关系,秉着业务逻辑与视图逻辑分离的原则,我们应该将组件的注入移入模板。

利用webpack可以很方便地做到。首先你需要安装以下编译工具

  1. npm install webpack babel-core babel-loader \
  2. babel-preset-env \
  3. vdt vdt-loader --save-dev

如果你要使用修饰器decorator已经类的静态属性static等新语法,还需要使用以下包

  1. npm install babel-preset-stage-0 babel-plugin-transform-decorators-legacy --save-dev

.babelrc配置如下:

  1. {
  2. "presets": ["env", "stage-0"],
  3. "plugins": [
  4. "transform-decorators-legacy"
  5. ]
  6. }

vdt-loader

vdt-loader用于将Vdt模板编译成模板函数,webpack配置如下:

  1. module.exports = {
  2. ...
  3. module: {
  4. rules: [
  5. {
  6. test: /\.vdt$/,
  7. use: [
  8. {
  9. loader: 'babel-loader',
  10. },
  11. {
  12. loader: 'vdt-loader',
  13. options: {
  14. // 去掉with语法
  15. noWith: true,
  16. // 去掉标签间的空白字符
  17. skipWhitespace: true,
  18. // 定义模板分隔符
  19. // delimiters: ['{{', '}}']
  20. }
  21. }
  22. ]
  23. }
  24. ]
  25. }
  26. ...
  27. };

将模板经过babel-loader处理,我们可以在vdt模板中使用es6语法

模板文件

有了vdt-loader,我们可以将vdt定义成单独的文件,并在模板中引入所需的组件。例如:user.vdt定义如下:

  1. // @file user.vdt
  2. // 可以直接使用import引入模板所需依赖
  3. import Button from './components/buttton';
  4. import Menu from './components/menu';
  5. <div>
  6. <Button>按钮</Button>
  7. <Menu />
  8. </div>

然后user.js文件中引入模板文件:

  1. // @file user.js
  2. import template from './user.vdt';
  3. export defaults extends Intact {
  4. @Intact.template()
  5. static template = template;
  6. // 或者,不使用static属性
  7. // get template() { return template; }
  8. }

除了在模板中引入组件外,你还可以引入另一个模板,例如,在继承layout.vdt时:

  1. import layout from './layout.vdt';
  2. <t:layout>
  3. <b:content>content</b:content>
  4. </t:layout>

CSS文件

css文件,可以通过css-loader & style-loader引入,如果你需要可编译css工具,例如:stylus,还可以使用stylus-loader。首先安装它们。

  1. npm install css-loader style-loader stylus-loader --save-dev

然后加入以下配置:

  1. module.exports = {
  2. ...
  3. module: {
  4. rules: [
  5. ...
  6. {
  7. test: /\.(styl|css)$/,
  8. use: [
  9. {
  10. loader: 'style-loader'
  11. },
  12. {
  13. loader: 'css-loader'
  14. },
  15. {
  16. loader: 'stylus-loader',
  17. options: {
  18. 'include css': true
  19. }
  20. },
  21. ]
  22. }
  23. ]
  24. }
  25. ...
  26. };

在组件逻辑文件user.js中引入样式文件,假设为user.styl

  1. import template from './user.vdt';
  2. import css from './user.styl';
  3. ...

你甚至可以在模板文件中引入样式文件,这对于纯模板组件很有用,例如:layout.vdt需要定义全局样式,假设样式文件为layout.styl

  1. // @file layout.vdt
  2. import './layout.styl';
  3. <div>
  4. <b:content />
  5. </div>