Node.js公用程序模块结构

在处理许多不同的Node.js项目时,我开始在一个新的Node.js包中移出通用代码,以便不会多次重写相同的代码。 我有一个新的Node.js模块,我正在使用npm link在我的项目中使用它。

现在,我对如何构build这个通用库以便对其进行正确模块化有点困惑。 这就是我现在在我的共同图书馆里所拥有的:

 // "my-common-lib"'s app.js module.exports = { math: require("./math/mathLib"), network: require("./network/networkLib") }; 

 //mathLib.js exports.pi = 3.14; 

这工作,我可以在另一个node.js项目中做到以下几点:

 var commonLibrary = require("my-common-lib"); var commonMath = commonLibrary.Math; console.log("Pi: " + commonMath.pi); 

虽然这解决了这个问题,但我更喜欢类似于lodash的方式:

 var commonMath = require("my-common-lib/math"); console.log("Awesome pi: " + commonMath.pi); 

我不太清楚lodash是怎么做到的,而且我一定希望避免拥有一个巨大的主js文件 。

TL; DR我想模块化一个node.js模块,所以我可以要求子模块( require("my-common-lib\myCommonMathLib") ),我该怎么做?

lodash采用专门的模块化构build。 以ES6构build为例。 每个“子项目”都有一个专用的“.js”文件。 汇总文件(lodash.js)只是导入所有其他模块。

如果你想要很好的lib/module约定,只需要在顶层有一个lib.js文件(聚合器),在保存所有内部模块的同一个目录旁边。

require("lib")部分的另一个选项是在你的package.json有一个"main": "lib.js"configuration

例如,如果您想使用lodash/array ,LoDash有一个array.js文件,其中包含以下内容:

 module.exports = { 'chunk': require('./array/chunk'), 'compact': require('./array/compact'), 

所以你可以很容易地在你的主文件夹里有math.js ,里面有这样的东西:

 module.exports = { pi: 3.14 // OR pi: require('./math/pi'); // and have file pi.js inside math folder } 

这样你可以使用它作为一个简短的:

 var math = require('my-common-lib/math'); math.pi; // 3.14