假设我有一个使用某种配置连接到数据库的模块。我不想传递配置或加载的模块,我只想在我的主模块(此处为app.js)中初始化database.js模块,然后可以在代码的其他地方使用它而无需初始化或传递配置。
我的问题是,就此link
中所说的而言,这种方法是否正确?这里是例子。
// database.js
const mongodb
let config = null;
exports.init = (conf) {
config = conf;
}
exports.getConnection = () {
const MongoClient = mongodb.MongoClient;
return new MongoClient(config.mongodb.url);
}
// app.js
const { init } = require('./database.js');
// load config ...
init(config);
// lib文件夹中的某些模块
const { getConnection } = require('../../database.js');
// do something with getConnection
答案 0 :(得分:1)
方法是正确的。正常情况下,JS模块只评估一次,这种情况只能使用一次。
请注意,在将database
模块用于其他模块之前,必须先初始化配置:
const { init } = require('./database.js');
init(config);
require('some-module-that-uses-database');
答案 1 :(得分:1)
是的,很好。 NodeJS的require
和ES6的import
都在其规范中定义为仅加载给定模块一次。尝试导入相同代码的语句之后的任何require
/ import
语句都将仅返回对第一次加载的内容的“缓存”版本的引用,这意味着所有加载它的模块都将引用同一对象,并可以访问其他模块对其所做的任何更改。