Node.js中index.js定义的变量能否直接传递到其他引入的脚本
Node.js模块变量共享方案说明
你担心多次require引入classdata.js会重复执行脚本是不必要的,Node.js内置的模块缓存机制会避免这个问题,以下是三种可选实现方案:
方案1:直接在data.js中引入classdata.js(最推荐)
Node.js会对每个加载过的模块按照绝对路径进行缓存,同一个模块无论被require多少次,仅在第一次加载时执行一次脚本,后续调用require都会直接返回缓存的导出对象,不会重复执行代码。
你可以直接修改data.js代码如下:
// data.js顶部直接引入,不会重复执行classdata.js const ClassData = require("./classdata.js"); var data = {}; console.log("hello1"); // 正常输出 module.exports = data; // 注意你原有代码少写了s,module.export是错误写法 console.log("hello2"); // 正常输出 console.log(ClassData); // 可正常输出,不会报未定义错误
方案2:依赖注入(适合需要解耦模块的场景)
如果你不想在data.js中写require语句,可以通过导出工厂函数的方式将ClassData从index.js注入到data.js中:
- 修改
data.js代码:
// data.js导出一个接收ClassData参数的函数 module.exports = (ClassData) => { var data = {}; console.log("hello1"); console.log(ClassData); // 直接使用传入的ClassData console.log("hello2"); return data; }
- 修改
index.js的引入逻辑:
var ClassData = require("./server/classdata.js"); // 调用data导出的函数,将ClassData作为参数传入 var data = require("./server/data.js")(ClassData);
方案3:全局挂载(极不推荐)
你也可以将ClassData挂载到Node.js的global全局对象上,这样所有模块都可以直接访问,但该方式会污染全局作用域,提升模块调试和维护成本,除非特殊场景否则不建议使用:
index.js中先挂载全局变量再引入data.js:
global.ClassData = require("./server/classdata.js"); var data = require("./server/data.js");
data.js中可以直接访问ClassData变量。
内容的提问来源于stack exchange,提问作者Kitty Craft0
相关产品推荐
相关产品推荐

