Javascript Nodejs expressjs使npm包在整个项目中都可用

Javascript Nodejs expressjs使npm包在整个项目中都可用,javascript,node.js,express,Javascript,Node.js,Express,我有这个文件夹结构 /app.js /src /routes /controllers 在routes文件夹中,我有一堆js文件。所有这些文件都需要像这样的passport js包 const passport = require('passport'); 我可以不这样做,而是在一个地方(很可能在app.js中)要求该包,并以某种方式将其传递到routes文件夹中的每个文件,而不是在每个文件上要求它。无论您多么频繁地require()一个模块,它都只会加载一次。在多个文件中需要一个模块没

我有这个文件夹结构

/app.js
/src
 /routes
 /controllers
在routes文件夹中,我有一堆js文件。所有这些文件都需要像这样的passport js包

const passport = require('passport');

我可以不这样做,而是在一个地方(很可能在app.js中)要求该包,并以某种方式将其传递到routes文件夹中的每个文件,而不是在每个文件上要求它。

无论您多么频繁地
require()
一个模块,它都只会加载一次。在多个文件中需要一个模块没有什么错,实际上这基本上就是模块系统设计的工作方式。

可能有一个特定于passport/Express的解决方案(例如,将passport作为中间件安装一次),但回答了关于模块的一般问题:

在使用它的模块中需要一个模块是标准实践,并且清楚地表达了模块之间的依赖关系,因此通常您不希望避免这样做

我可以在一个地方(最有可能在app.js中)要求该包,并以某种方式将其传递到routes文件夹中的每个文件,而不是在每个文件上要求它,而不是这样做

您有两个选择:

  • 如果所有这些文件都有其他要导入的内容,则可以创建一个汇总模块,该模块需要所有这些内容,然后将它们作为导出提供。然后,您的文件将执行以下操作:

    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
    ing它。(默认的
    global
    变量是对全局对象的引用,如浏览器上的
    window
    ,因此在其上创建的任何属性都将成为全局变量。)

    我不建议这样做,因为这样模块之间的依赖关系就不再明确定义了


如果routes文件夹中的文件未使用express router,您可以选择或导出接受passport和app对象的功能,如

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

然后,您将在app.js/server.js中只需要passport一次,并将相同的对象传递给每个路由

好吧,从技术上讲,您可以扩展
全局
对象。但是你为什么需要它?这些文件是如何使用passport模块的?您能在启动脚本中调用一次将其设置为中间件吗?