在 Fastify 中该如何给“视图引擎”内置自定义模块?
这不是在写 NEXT 的新功能:模板引擎支持吗,考虑到应该对开发者的友好化,那就得内置一些有利于开发的方法,比如一个 moment()
方法
由于 NEXT 的服务端使用的是 NestJS,而使用 Express 平台的话非常简单,就只需要使用 app.setlocals
再引入模块即可,但是如果使用 fastify
, 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(); // 调用下一个钩子
});
简单描述下上面的代码做了什么:
- 使用
getInstance()
方法拿到单例 - 用
decorateReply()
方法先将 locals 挂载到 reply 上,因为返回视图引擎渲染的使用的是res.view()
方法 - 接着即是
addHook()
创建一个 Hook,可以在请求处理前执行 - 别忘了,先得初始化locals,接着就是将你的方法挂到 locals 上就可以了,比如
require("moment");
,当然你也可以比如说require("React");
什么的 - 绝对不能忘记的是
next()
如果你没有了这个就不会向下处理了!
在 ejs 中使用它
比如,我引入了一个 moment 库,我就可以在 ejs 里面任何地方使用它了,比如说:
<time class="date">
<%= moment(doc.created.toString()).format('YYYY-MM-DD') %>
</time>
其他的用法就等你探索了!