You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将变量从Pug模板文件传递到外部脚本文件?

嘿,我之前也碰到过一模一样的问题!外部JS文件没法直接访问模板里的locals变量,本质原因是两者运行的上下文完全不同——模板是在服务器端渲染时处理的,而外部脚本是浏览器加载后在客户端执行的,自然拿不到服务器端的变量。给你几个实用的解决办法:

方法1:把变量挂载到全局window对象(最直接)

在你的Pug模板里,在引入外部JS之前,先把locals变量序列化成JSON并挂载到window上,这样外部脚本就能访问到了:

// 在Pug模板中添加这段脚本
script.
  // 用!{...}来直接输出序列化后的JSON,避免转义问题
  window.appLocals = !{JSON.stringify(locals)};

// 然后再引入你的外部脚本
script(src='/file/Index.js')

之后在Index.js里,就可以直接通过window.appLocals(或者直接写appLocals)来使用变量了:

// Index.js里的代码
console.log(appLocals); // 直接访问全局变量

注意:如果locals里包含函数、循环引用或者其他不能被JSON序列化的内容,JSON.stringify会报错。这时候建议只序列化你实际需要的字段,比如!{JSON.stringify({ user: locals.user, config: locals.config })}。

方法2:通过DOM属性传递(更优雅,不污染全局)

如果只是需要传递少量变量,或者不想污染全局作用域,可以把变量存在某个DOM元素的自定义属性里,然后外部JS去读取:

// 在Pug模板里给根元素添加data属性
div(id='app-container' data-app-locals=JSON.stringify(locals))

script(src='/file/Index.js')

然后在Index.js里读取这个属性并解析:

// Index.js里的代码
const appContainer = document.getElementById('app-container');
const appLocals = JSON.parse(appContainer.dataset.appLocals);
console.log(appLocals);

这种方式更符合前端开发的最佳实践,不会给全局作用域添乱。

方法3:通过AJAX请求获取(适合敏感数据)

如果你的locals里包含敏感信息,不想直接暴露在HTML源码里,可以在后端加一个接口来返回数据,然后外部JS发起请求获取:
首先在Express里新增一个路由:

// Express后端代码
app.get('/api/app-locals', (req, res) => {
  // 在这里可以过滤掉敏感数据,只返回需要的内容
  const safeLocals = {
    userName: req.locals.userName,
    appConfig: req.locals.appConfig
  };
  res.json(safeLocals);
});

然后在Index.js里用fetch请求这个接口:

// Index.js里的代码
fetch('/api/app-locals')
  .then(response => response.json())
  .then(locals => {
    // 在这里使用获取到的变量
    console.log(locals.userName);
  })
  .catch(err => console.error('获取数据失败:', err));

这种方式更安全,但会多一次HTTP请求,适合数据敏感或者内容比较大的场景。

内容的提问来源于stack exchange,提问作者Pol.H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:25:56