Node.js中使用pkg编译后加载外部JS配置文件的问题
解决pkg编译后加载外部配置文件的问题
问题根源是pkg编译时会将require()引用的本地文件直接打包进可执行文件,运行时优先使用打包的版本,而非外部目录的文件。要加载用户设备上的配置文件,需要改用文件系统读取的方式,而非require,具体步骤如下:
方法一:使用fs模块读取并解析配置文件
- 先获取可执行文件的所在目录,确保定位到用户放置配置的路径
- 用
fs.readFileSync读取外部配置文件的内容 - 解析配置内容(推荐用vm模块保证安全,或用eval快速实现)
示例代码:
const path = require('path'); const fs = require('fs'); const vm = require('vm'); // 获取当前可执行文件的目录 const appRoot = path.dirname(process.execPath); // 读取config.js const configFilePath = path.join(appRoot, 'config.js'); const configCode = fs.readFileSync(configFilePath, 'utf8'); // 用vm模块安全解析配置(避免eval的安全风险) const context = { module: {} }; vm.runInNewContext(configCode, context); const { var1, var2, var3, var4 } = context.module.exports; // 读取config2.js同理 const config2FilePath = path.join(appRoot, 'config2.js'); const config2Code = fs.readFileSync(config2FilePath, 'utf8'); const context2 = { module: {} }; vm.runInNewContext(config2Code, context2); const { var1: var1_2, var2: var2_2 } = context2.module.exports;
方法二:修改require路径为绝对路径(不推荐)
如果坚持要用require,可以通过动态生成绝对路径的方式,但需要确保pkg不会将该路径下的文件打包。可在package.json的pkg配置中添加"pkg": {"assets": "!*.js"}排除配置文件,但这种方式不如fs读取可靠,因为pkg的打包规则可能有变动。
注意事项
- 需告知用户将
config.js和config2.js放在可执行文件的同一目录下 - 若配置文件来自不可信来源,务必使用
vm模块解析,避免eval带来的代码注入风险
内容的提问来源于stack exchange,提问作者profoundwatcher
相关产品推荐
相关产品推荐

