Pug 和 Parcel 不可用的动态局部变量

Dynamic locals unavailable with Pug and Parcel

我有一个 Express 应用程序,它使用 Pug 模板和 Parcel 作为我的捆绑器。根据 Parcel docs,我可以有一个配置文件来存储我的局部变量 pug.config.js,但是,我需要在运行时动态地将局部变量添加到我的模板中。可以这样做吗?

这是我的文件:

index.pug

...
h1 #{isAuthenticated}
h1 #{env}
...

pug.config.js

module.exports = {
  locals: {
    env: process.env.NODE_ENV
  }
}

app.js

const Bundler = require('parcel-bundler')
const bundler = new Bundler(path.resolve(__dirname, 'views/index.pug'))

app
.set('views', path.join(__dirname, 'views'))
.set('view engine', 'pug')
.use(function(req, res, next) {
     res.locals.isAuthenticated = 'true'
     next()
})
.use(bundler.middleware())  

在这里,我试图将局部变量 isAuthenticated 设置为 'true',但是在渲染 index.pug 时变量为空,同时,我的 env 变量pug.config.js 文件存在。

现在,如果我尝试使用 res.render('index', {isAuthenticated: 'true'}) 在我的控制器函数中呈现页面,变量 isAuthenticated 现在存在,但是 env 是空的。

我想知道我是否遗漏了什么,或者这是否按预期工作?

我已经简单试用了包裹。开箱即用的体验很棒,但在高级配置方面,就很糟糕了。这是设计使然,包裹只是反对配置的想法。一切以约定俗成。

所以我检查了 source code。结果 parcel 只从 '.pugrc', '.pugrc.js', 'pug.config.js'.

获取哈巴狗配置

如果您选择坚持使用包裹方式,您可以尝试将您的 locals 值写回磁盘上的这些文件之一。需要测试一下,可能有一些异步问题需要调试。

我个人比较喜欢下面的方法。你用pug作为一个真正的模板引擎,直接使用pug.compile/renderAPI来制作html。然后,您将这些 html 进一步传送到 parcel,它仍然会完成 "bundling" 部分工作。