Непосредственное использование require () в Express вместо помещения в переменную - PullRequest
0 голосов
/ 27 января 2020

Я создаю приложение с express и использую паспортный логин на Facebook

Пример приложения: https://github.com/passport/express-4.x-facebook-example/blob/master/server.js

И от него дошло мое внимание, что я могу пропустить формат const / var = require ... и сделать это напрямую, если мне больше не придется ссылаться на него: например,

const createError = require('http-errors'),
session = require('cookie-session');

...

app.use(session({ secret: process.env.cookie_secret, resave: true, saveUninitialized: true }));
app.use(function(req, res, next) {
    next(createError(404));
});

становится

app.use(require('cookie-session')({ secret: process.env.cookie_secret, resave: true, saveUninitialized: true }));
app.use(function(req, res, next) {
    next(require('http-errors')(404));
});

Это работает, отлично, мой файл теперь вдвое длиннее, но ... Я беспокоюсь о влиянии на производительность этого?

1 Ответ

2 голосов
/ 27 января 2020

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

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

Если при загрузке возникли проблемы зависимости, вы, вероятно, также хотите, чтобы они обнаруживались во время запуска сервера, а не после того, как сервер уже обслуживает клиентов.

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

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


Вот еще одна вещь, которую следует рассмотреть. Javascript с течением времени меняется с require() на import, и вы не можете использовать import, кроме как на верхнем уровне модуля. Вы не можете использовать его внутри оператора.


Сводка:

  1. Вы хотите загружать зависимости при запуске, чтобы не блокировать событие l oop во время фактическая обработка запросов.
  2. Вы хотите загружать зависимости при запуске, чтобы обнаруживать любые недостающие зависимости при запуске сервера, а не во время его работы.
  3. Код обычно считается более удобным для чтения, если зависимости очевидны и их легко увидеть для всех, кто работает с этим модулем.
  4. В будущем, когда мы все будем использовать import вместо require(), import будет разрешено только на верхнем уровне.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...