这不是在写 NEXT 的新功能:模板引擎支持吗,考虑到应该对开发者的友好化,那就得内置一些有利于开发的方法,比如一个 moment() 方法

由于 NEXT 的服务端使用的是 NestJS,而使用 Express 平台的话非常简单,就只需要使用 app.setlocals 再引入模块即可,但是如果使用 fastify, app 中就不存在这个方法了

app 没有这个方法

自定义适配器

在 NestJS 中一般是直接使用 FastifyAdapter 创建应用,使用它来创建上文已经说了,行不通,而 FastifyAdapter 也可以使用它来自定义创建 app

const app: FastifyAdapter = new FastifyAdapter({
    trustProxy: true,
});

创建后你可以对 app 做很多一般无法实现的东西,我们把这步成为:自定义适配器

添加钩子

app.getInstance().decorateReply("locals", null); // 将locals挂载到reply上
app.getInstance().addHook("preHandler", (req, res: any, next) => { // 在请求处理前执行
    res.locals = {}; // 初始化locals
    res.locals.moment = require("moment"); // 将moment挂载到locals上
    next(); // 调用下一个钩子
});

简单描述下上面的代码做了什么:

  1. 使用 getInstance() 方法拿到单例
  2. 用 decorateReply() 方法先将 locals 挂载到 reply 上,因为返回视图引擎渲染的使用的是 res.view() 方法
  3. 接着即是 addHook() 创建一个 Hook,可以在请求处理前执行
  4. 别忘了,先得初始化locals,接着就是将你的方法挂到 locals 上就可以了,比如 require("moment");,当然你也可以比如说 require("React"); 什么的
  5. 绝对不能忘记的是 next() 如果你没有了这个就不会向下处理了!

在 ejs 中使用它

比如,我引入了一个 moment 库,我就可以在 ejs 里面任何地方使用它了,比如说:

<time class="date">
  <%= moment(doc.created.toString()).format('YYYY-MM-DD') %>
                  </time>

其他的用法就等你探索了!