模板渲染
本组件用于在 midway 体系使用服务端渲染 ejs,nunjucks 模板。
使用 ejs
安装依赖
选择对应的模板安装依赖。
$ npm i @midwayjs/view-ejs@2 --save
引入组件
首先,引入组件,在 configuration.ts  中导入:
import { Configuration } from '@midwayjs/decorator';
import * as view from '@midwayjs/view-ejs';
import { join } from 'path';
@Configuration({
  imports: [
    view, // 导入 ejs 组件
  ],
  importConfigs: [join(__dirname, 'config')],
})
export class ContainerLifeCycle {}
配置
// src/config/config.default.ts
export const view = {
  defaultViewEngine: 'ejs',
  mapping: {
    '.ejs': 'ejs',
  },
};
// ejs config
export const ejs = {};
使用
注意,默认的 view 目录为 ${appRoot}/view ,在其中创建一个 hello.ejs 文件。
目录结构如下:
➜  my_midway_app tree
.
├── src
│   └── controller                 ## Controller 目录
│       └── home.ts
├── view                           ## 模板目录
│   └── hello.ejs
├── test
├── package.json
└── tsconfig.json
我们在模板里写一些 ejs 格式的内容,比如:
// view/hello.ejs
hello <%= data %>
在 Controller 中渲染。
import { Inject, Provide } from '@midwayjs/decorator';
import { Context } from '@midwayjs/koa';
@Provide()
@Controller('/')
export class HomeController {
  @Inject()
  ctx: Context;
  @Get('/')
  async render() {
    await this.ctx.render('hello.ejs', {
      data: 'world',
    });
  }
}
使用 Nunjucks
和 ejs 类似,引入对应组件即可。
1、选择对应的模板安装依赖。
$ npm i @midwayjs/view-nunjucks --save
2、引入组件,在 configuration.ts  中导入:
import { Configuration } from '@midwayjs/decorator';
import * as view from '@midwayjs/view-nunjucks';
import { join } from 'path';
@Configuration({
  imports: [
    view, // 导入 nunjucks 组件
  ],
  importConfigs: [join(__dirname, 'config')],
})
export class ContainerLifeCycle {}
3、增加 nunjucks 的配置,比如默认使用 nunjucks。
// src/config/config.default.ts
export const view = {
  defaultViewEngine: 'nunjucks',
  mapping: {
    '.nj': 'nunjucks',
  },
};
4、在 view 目录增加模板
// view/test.ejs
hi, {{ user }}
在 Controller 中渲染。
import { Inject, Provide } from '@midwayjs/decorator';
import { Context } from '@midwayjs/koa';
@Provide()
@Controller('/')
export class HomeController {
  @Inject()
  ctx: Context;
  @Get('/')
  async render() {
    await ctx.render('test.nj', { user: 'midway' });
  }
}
访问后会输出 hi, midway 。
如果有自定义 filter 的需求,可以在入口处增加,比如下面增加了一个名为 hello 的 filter。
import { App, Configuration, Inject } from '@midwayjs/decorator';
import * as view from '@midwayjs/view-nunjucks';
import { join } from 'path';
@Configuration({
  imports: [view],
  importConfigs: [join(__dirname, 'config')],
})
export class AutoConfiguration {
  @App()
  app;
  @Inject()
  env: view.NunjucksEnvironment;
  async onReady() {
    this.env.addFilter('hello', (str) => {
      return 'hi, ' + str;
    });
  }
}
在模板里可以使用
{
  {
    name | hello;
  }
}
然后渲染
// controller
// ...
await ctx.render('test.nj', { name: 'midway' });
也会输出 hi, midway 。
注意事项
如需在 egg(@midwayjs/web) 场景下使用,请在 plugint.ts 中关闭 view 和其相关插件。
import { EggPlugin } from 'egg';
export default {
  // ...
  view: false,
} as EggPlugin;
否则会出现下面类似的错误。
TypeError: Cannot set property view of #<EggApplication> which has only a getter