Правильно ли вызывать require ('mymodule') после инициализации 'mymodule' где-то еще? - PullRequest
0 голосов
/ 14 января 2019

Давайте предположим, что у меня есть модуль, который подключается к базе данных с использованием некоторой конфигурации. Я не хочу передавать конфигурацию или загруженный модуль, я просто хочу инициализировать модуль database.js в моем основном модуле (здесь app.js), а затем иметь возможность использовать его в другом месте моего кода без инициализации или передачи конфигурация.

Мой вопрос: правильный ли этот подход в отношении того, что было сказано здесь в этой ссылке

Вот пример.

// 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

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Да, все в порядке. И NodeJS require, и ES6 import определены в своих спецификациях, чтобы загружать данный модуль только один раз. Любой оператор require / import после того, который пытается импортировать тот же код, просто возвращает ссылку на «кэшированную» версию того, что было загружено в первый раз, то есть все модули, которые его загружают, будут ссылаться на один и тот же объект и могут получить доступ к любым изменениям, внесенным в него другими модулями.

0 голосов
/ 14 января 2019

Подход правильный. Модули JS оцениваются только один раз при нормальных обстоятельствах, это можно использовать в подобных ситуациях один раз.

Обратите внимание, что конфигурация должна быть инициализирована до того, как модуль database будет использоваться в других модулях:

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

init(config);

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