Nodejs expressjs делает пакет npm доступным на протяжении всего проекта - PullRequest
2 голосов
/ 28 мая 2019

У меня такая структура папок.

/app.js
/src
 /routes
 /controllers

В папке маршрутов у меня куча js-файлов.Все эти файлы должны требовать такой паспорт js-пакет, как этот

const passport = require('passport');

Вместо этого, могу ли я потребовать пакет в одном месте (скорее всего, в app.js) и каким-то образом передать его всем и каждомуфайл в папке маршрутов вместо того, чтобы требовать его для каждого файла.

Ответы [ 3 ]

3 голосов
/ 28 мая 2019

Может быть решение для конкретного паспорта / Express (например, установка паспорта один раз в качестве промежуточного программного обеспечения), но ответ на вопрос о модулях в целом:

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

Вместо того, чтобы сделать это, могу ли я потребовать пакет в одном месте (скорее всего, в app.js) и каким-то образом передать его каждому файлу в папке маршрутов вместо того, чтобы требовать его в каждом файле.

У вас есть несколько вариантов:

  • Если у всех этих файлов есть и другие вещи, которые они также импортируют, вы можете создать накопительный модуль, который требует все эти вещи, а затем делает их доступными для экспорта. Тогда ваши файлы будут делать:

    const {passport, anotherThing, yetAnotherThing} = require("./the-rollup-module");
    

    вместо

    const passport = require("passport");
    const anotherThing = require("another-thing");
    const yetAnotherThing = require("yet-another-thing");
    

    Накопительный пакет будет выглядеть так:

    module.exports.passport = require("passport");
    module.exports.anotherThing = require("another-thing");
    module.exports.yetAnotherThing = require("yet-another-thing");
    
  • (я не рекомендую это.) Вы можете сделать его глобальным, добавив это в свой скрипт входа:

    global.passport = require("passport");
    

    Это выставляет passport как глобальную переменную, поэтому ваши модули могут просто использовать passport без require. (Переменная global по умолчанию является ссылкой на глобальный объект, например window в браузерах, поэтому любое свойство, которое вы создаете для него, становится глобальной переменной.)

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

1 голос
/ 28 мая 2019

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

0 голосов
/ 28 мая 2019

Если файлы в папке маршрутов не используют экспресс-маршрутизатор, вы можете или экспортировать функцию, которая принимает объекты паспорта и приложения, такие как

module.exports = function(app, passport) {
  app.get('/', (req, res) => {
      res.json('some route');
  });
}

Тогда вам понадобится паспорт только один раз в app.js / server.js и передача одного и того же объекта на каждый маршрут

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...