如何在node.js中将文件定义为模块
而不是相对require
代码,即以./
或..
开头,我想定义一个模块“全球”。 例如,采取以下封装结构:
/src /index.js /a.js /b.js /lib /index.js ...
当在src/a.js
或src/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,你可以使用像这样的global
variables。
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。