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
ing它。(默认的require
变量是对全局对象的引用,如浏览器上的global
,因此在其上创建的任何属性都将成为全局变量。) 我不建议这样做,因为这样模块之间的依赖关系就不再明确定义了window
module.exports = function(app, passport) {
app.get('/', (req, res) => {
res.json('some route');
});
}
然后,您将在app.js/server.js中只需要passport一次,并将相同的对象传递给每个路由好吧,从技术上讲,您可以扩展
全局
对象。但是你为什么需要它?这些文件是如何使用passport模块的?您能在启动脚本中调用一次将其设置为中间件吗?