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

Node.js中使用pkg编译后加载外部JS配置文件的问题

解决pkg编译后加载外部配置文件的问题

问题根源是pkg编译时会将require()引用的本地文件直接打包进可执行文件,运行时优先使用打包的版本,而非外部目录的文件。要加载用户设备上的配置文件,需要改用文件系统读取的方式,而非require,具体步骤如下:

方法一:使用fs模块读取并解析配置文件

  1. 先获取可执行文件的所在目录,确保定位到用户放置配置的路径
  2. 用fs.readFileSync读取外部配置文件的内容
  3. 解析配置内容(推荐用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:05:40