Node环境运行Jasmine报错:自动解析无关的非法package.json文件
问题原因
该报错并非Jasmine主动读取无关package.json导致,触发逻辑来自Node.js内置的CommonJS模块加载机制:
Node加载任意JS模块文件时,会从该文件所在目录开始逐层向上遍历,读取路径下所有package.json文件,用于判断模块类型、解析导入路径规则。你的测试用例存放在packages/local/foo/spec/目录下,加载测试文件时Node会向上遍历到packages/local/foo/目录,读取该目录下带块注释的非标准package.json,因为JSON语法非法直接抛出解析异常。
你在Jasmine的spec_files配置中用排除语法不生效,是因为该文件读取发生在Node加载测试文件的阶段,早于Jasmine的文件规则校验逻辑,不属于Jasmine的扫描匹配范围。
解决方案
可根据你的项目约束选择以下任意方案:
- 方案1(改造成本最低,最推荐):修改非npm用途的
package.json文件名,例如改为package.config.json等自定义名称。Node的模块加载器仅会识别名为package.json的文件作为模块配置,改名后就不会被自动读取。 - 方案2(不允许修改文件名时可选):在
runtests.js的最开头添加补丁代码,拦截非法package.json的读取请求,直接返回合法的空JSON:
const fs = require('fs'); const path = require('path'); const invalidPkgPath = path.resolve(__dirname, '../packages/local/foo/package.json'); // 拦截异步读取 const originalReadFile = fs.readFile; fs.readFile = function (readPath, ...args) { if (readPath === invalidPkgPath) { return args.pop()(null, '{}'); } return originalReadFile.call(fs, readPath, ...args); }; // 拦截同步读取 const originalReadFileSync = fs.readFileSync; fs.readFileSync = function (readPath, ...args) { if (readPath === invalidPkgPath) { return '{}'; } return originalReadFileSync.call(fs, readPath, ...args); };
- 方案3(允许修改该文件内容时可选):移除
packages/local/foo/package.json中的块注释,修正为合法JSON格式即可直接解决问题。
内容的提问来源于stack exchange,提问作者Coderino Javarino
相关产品推荐
相关产品推荐

