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

如何在Pug文件中访问外部JavaScript对象以生成datalist?

解决Pug无法读取外部JS文件对象的问题

你遇到的核心问题是:Pug-cli编译模板时,默认不会自动加载外部JS文件中的变量,所以wiz1在你的Pug模板里是undefined,导致each循环尝试读取undefined的length属性而抛出错误。下面提供两种无需修改wizardSpells.js的解决方案:

方案一:使用Pug的include指令加载JS文件

Pug的include指令可以直接导入并执行JS文件,将文件内的变量注入到模板作用域中。只需在你的datalist.pug开头添加一行include语句(注意路径要匹配你的文件实际位置):

// datalist.pug
include ../wizardSpells.js  // 示例路径:若wizardSpells.js和pug目录同级则用此路径,根据实际调整
datalist(id='wiz1-spells')
  each val, key in wiz1
    option(value=val.school) key

比如如果wizardSpells.js放在pug目录下,路径就改成./wizardSpells.js。执行原来的编译命令:

pug .\pug\datalists.pug -o ./html -P

就能生成包含所有选项的datalist了。

方案二:用Node.js的vm模块读取变量(兼容更复杂场景)

如果include指令因为某种原因不生效(比如JS文件里有特殊语法),可以用Node的vm模块手动执行JS文件并提取变量,同样不需要修改原JS文件:

// datalist.pug
- const fs = require('fs');
- const vm = require('vm');
// 读取外部JS文件内容
- const spellFileContent = fs.readFileSync('../wizardSpells.js', 'utf8');
// 在独立上下文执行文件,获取变量
- const context = {};
- new vm.Script(spellFileContent).runInNewContext(context);
- const wiz1 = context.wiz1;

datalist(id='wiz1-spells')
  each val, key in wiz1
    option(value=val.school) key

这个方法通过读取文件内容、在隔离的上下文执行代码,把wiz1变量提取到模板作用域中,灵活性更高。

原理说明

Pug-cli在Node环境下编译模板,模板的作用域是独立的——外部JS文件的变量不会自动进入模板,必须通过显式的加载(include或手动读取执行)才能让Pug访问到这些变量。

内容的提问来源于stack exchange,提问作者Black_bull

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 21:22:39