View视图

将api接口返回的数据传入渲染引擎并渲染对应的模板文件,输出html到浏览器端

模板目录

所有的模板文件都存放在viewDir中。可以自行配置viewDir指向目录。

模板数据来源

模板中可用的数据来源于3个合并的结果:

const data = Object.assign({ ctx }, ctx.state, ctx.apiData);

合并后的data将传入模板引擎的渲染方法中。模板中可以引用到ctx对象。

默认引擎和多引擎

maty框架默认内置nunjucks模板引擎,其使用方法可以参见官方文档

nunjucks的模板文件后缀为 .njk。因此模板文件应该是这样的/views/home.njk,/views/login.njk等。

默认引擎是通过 app.set('view engine', extName)来设置的,比如maty内部是:

app.set('view engine', 'njk');

默认引擎的的作用是配置路由时,可以省略view配置项的地址后缀。比如 view: 'main/list.njk' 可以省略为 view: 'main/list'。若不是默认引擎,比如又使用了jade引擎,则不可省略后缀,必须是 view: 'main/list.jade'.

通过app.engine方法可以设置多个引擎,并通过set('view engine')来修改默认引擎,例如修改为jade: app.set('view engine', 'jade');

Nunjucks模板引擎其他设置

maty内部对于nunjucks模板的相关设置如下:

const nunjucksEnv = nunjucks.configure(viewDir, {
  autoescape: true,   // 默认自动转义
  noCache: env.isDev, // 开发环境默认无缓存
  watch: env.isDev    // 开发环境自动监听并加载文件更新
});
app.set('nunjucks', nunjucks);  
app.set('nunjucksEnv', nunjucksEnv);

通过app.get('nunjucks')获取nunjucks对象,app.get('nunjucksEnv')获取nunjucksEnv对象,然后根据需要和官方文档的指导可以定制需求。

实际常用到自定义nunjucks的filters过滤器。处理方式如下:

app.js
const nunjucksEnv = app.get('nunjucksEnv');
nunjucksEnv.addFilter(filterName, (value) => { 
  let newValue;
  // ... 
  return newValue 
});

自动渲染

分为以下几种情况:

  1. 在无匹配route地址的情况下,可直接请求一个模板路径进行渲染。 例如 存在模板文件 views/home/about-us.njk ,在未配置路由的情况下,浏览器访问 /home/about-us 则会直接渲染home/about-us.njk文件的内容。 所以,这种情况适合静态内容的模板。

  2. 若配置了无参route地址,如:/article/rules ,可省略配置view项,可直接渲染 article/rules.njk 模板文件。

  3. 若配置了view: /article/list ,但找不到 article/list.njk 模板文件,会尝试寻找 article/list/index.njk文件来渲染。

Last updated