Подтвердить что ты не робот

Ленивая загрузка в node.js

Мне было интересно, если использование require() в node.js было эквивалентом ленивой загрузки?

Например, если у меня была функция, требующая определенного пакета node.js, который не нужен нигде в моем коде, я лучше всего использовать require() внутри этой функции, чтобы включить необходимый пакет только тогда, когда вызывается функция.

Я также не уверен, что это обеспечит какие-либо улучшения производительности, учитывая мое отсутствие понимания вокруг архитектуры node.js? Я предполагаю, что он будет использовать меньше памяти для каждого подключения к моему серверу. Однако будет ли он увеличивать ввод-вывод на диск, когда он должен прочитать пакет, или это будет один, чтобы получить его в памяти?

Если это так, как далеко я должен это сделать, должен ли я пытаться писать пакеты node.js для большего количества кода, чем я могу?

4b9b3361

Ответ 1

require() - загрузка по требованию. После загрузки модуля он не будет перезагружен, если вызов require() снова будет запущен. Поместив его внутри функции вместо кода модуля верхнего уровня, вы можете отложить его загрузку или потенциально избежать, если вы никогда не вызываете эту функцию. Тем не менее, require() является синхронным и загружает модуль с диска, поэтому наилучшей практикой является загрузка любых модулей, которые вам нужны при запуске приложения, прежде чем приложение начнет обслуживать запросы, которые затем гарантируют, что во время работы вашего приложения произойдет только асинхронный ввод-вывод.

Node имеет однопоточную резьбу, поэтому объем памяти, загружаемый модулем, не предназначен для каждого соединения, а для каждого процесса. Загрузка модуля является одноразовым, чтобы получить его в памяти.

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

Ответ 2

Если вы хотите использовать ленивые модули загрузки, теперь это возможно с ES6 (Node v6)

Изменить: это не будет работать, если вам нужно получить доступ к свойствам require (например, require.cache).

module.js

console.log('Module was loaded')
exports.d=3

main.js

var _require = require;
var require = function (moduleName) {
    var module;
    return new Proxy(function () {
        if (!module) {
            module = _require(moduleName)
        }
        return module.apply(this, arguments)
    }, {
        get: function (target, name) {
            if (!module) {
                module = _require(moduleName)
            }
            return module[name];
        }
    })
};

console.log('Before require');
var a = require('./module')
console.log('After require');
console.log(a.d)
console.log('After log module');

Выход

Before require
After require
Module was loaded
3
After log module

Ответ 3

Пример для отложенной загрузки jQuery в ES6:

import('jquery').then((jquery) => {
    window.$ = jquery.default; // Because jquery is the module, here is the new syntax for using this
    window.$('#id');
});