在其他地方初始化 'mymodule' 后调用 require('mymodule') 是否正确?

Is calling require('mymodule') correct after initializing 'mymodule' somewhere else?

假设我有一个模块通过一些配置连接到数据库。我不想传递配置或加载的模块,我只想在我的主模块(此处为 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

方法正确。 JS模块一般情况下只会求值一次,这种情况下可以用一次。

注意在database模块将在其他模块中使用之前需要初始化配置:

const { init } = require('./database.js');

init(config);

require('some-module-that-uses-database');

是的,没关系。 NodeJS 的 require 和 ES6 的 import 在它们的规范中都定义为只加载给定的模块一次。之后任何试图导入相同代码的 require / import 语句将简单地 return 引用第一次加载的 "cached" 版本,这意味着所有模块which load 它将引用同一个对象,并且可以访问其他模块对其所做的任何更改。