JavaScript如何合并重复require导入实现公共依赖统一引入
实现方案
完全可以把重复的导入、初始化逻辑抽成公共文件,每个测试文件只需要单行引用即可,推荐用无全局污染的函数传参方案,兼容性最好:
方案实现步骤
- 新建公共初始化文件
在项目的公共工具目录(比如根目录下新建test-common文件夹),创建module-test-init.js文件,写入以下公共逻辑:
const path = require('path'); const { formatData } = require('utils'); /** * 初始化单模块测试所需的依赖与预处理数据 * @param {string} moduleDir 当前模块所在目录的绝对路径,传__dirname即可 * @returns 测试需要用到的所有变量 */ module.exports = function(moduleDir) { const runAnalysis = require(path.resolve(moduleDir, 'index.js')); const { data } = require(path.resolve(moduleDir, 'data.js')); const formattedData = formatData(data); return { runAnalysis, data, formattedData } }
- 改造各模块的
index.test.js
原来的4行重复代码全部删除,只需要保留1行引用+初始化的代码即可:
// 注意调整相对路径,匹配你公共文件的实际存放位置 const { runAnalysis, data, formattedData } = require('../../test-common/module-test-init')(__dirname); // 后面直接写原有测试逻辑即可,所有变量和之前写4行代码时完全一致
注意事项
- 不要在公共文件里直接写
require('./index')、require('./data'):CommonJS的require路径是相对于当前执行require的文件所在目录解析的,公共文件不在模块文件夹内,直接写相对路径会找不到对应模块文件,必须通过传入的__dirname(当前测试文件所在的模块目录绝对路径)拼接路径加载。 - 不推荐用全局变量挂载的方式抽离逻辑:把变量挂到
global对象上会造成全局污染,多测试文件并行执行时容易出现变量串改的问题,排查成本极高,用函数返回解构的方式依赖清晰,没有副作用。 - 如果是ESM规范的项目(package.json中配置
"type": "module"),只需要把公共文件的require替换为import,调用时传入path.dirname(fileURLToPath(import.meta.url))代替__dirname即可,核心逻辑不变。
内容的提问来源于stack exchange,提问作者s-hunter
相关产品推荐
相关产品推荐

