如何在node.js中将文件定义为模块

而不是相对require代码,即以./..开头,我想定义一个模块“全球”。 例如,采取以下封装结构:

 /src /index.js /a.js /b.js /lib /index.js ... 

当在src/a.jssrc/b.js ,要求lib ,我必须每次require('../lib') 。 当你开始嵌套的时候,这会让人讨厌,因为你必须手动parsing../lib../../lib../../../lib

我希望能够做到require('lib') 。 我可以这样做吗? 还是应该使用全局variables?

使用非相对path来要求您的源文件不是节点的要求是如何工作的! 不要尝试通过在node_modules目录中放置任意代码文件或通过更改NODE_PATH环境variables来解决此限制。

如果你想使用不带path的require,你应该提取所需的代码作为节点模块,并依赖于这个节点模块。 这导致更好的结构化代码,不太复杂的模块,封装的function,更好的可testing性和更容易的代码重用。

您可以在http或git中包含软件包依赖关系,因此不需要发布您在npm中使用的节点模块。 看看npm依赖关系了解更多细节。

在index.js文件中使用module.exports。 并将其放置在node_modules文件夹中

如果相对path烦你,你想在你的应用程序中总是使用lib,你可以使用像这样的globalvariables。

 var lib = require('./lib'); global.lib = lib; 

你可以在你的入口点将lib设置为全局variables。 之后你可以访问只是lib 。 但是它污染了全球范围。 所以你必须小心使用。

将你的模块放在node_modules中不要求你包含path或相对path

编辑:

如果将一个名为package.json的文件放置在模块目录中,Node将尝试parsing该文件并查找并使用main属性作为入口点的相对path。 例如,如果你的

./myModuleDir/package.json

文件看起来如下所示,Node将尝试使用path加载文件

./myModuleDir/lib/myModule.js

 { "name" : "myModule", "main" : "./lib/myModule.js" } 

如果该文件夹不包含名为package.json的包定义文件,则包入口点将采用index.js的默认值,在这种情况下,Node将查找path./myModuleDir/index下的文件。 JS。