节点模块的根目录
我有一个漂亮的标准节点模块使用巴贝尔transpile我们的代码,然后输出到一个'lib'文件夹。 package.json将'main'指向'lib / index.js',这样人们可以只require('my-module')
但是,如果我有一个子目录(比如说我的模块/服务器),那么当他们使用我的模块时,他们必须require('my-module/lib/server')
。 我已经看到人们把后期制作步骤,将package.json复制到lib,但只是觉得哈克和错误的我。 在npm中有没有什么方法来指定一个主目录 ,从而我的模块的任何require()将从那个目录开始? 然后我可以让用户确实需要('我的模块/服务器')没有lib部分…
我认为最好的解决scheme是你有一个主要的index.js和所有的子模块,所以你可以做一些像require('your-module').server
没有看到您的文件夹结构很难,但您可以:
- 使用
module.exports =
导出babel输出 - 将其他文件符号链接到目录中
的package.json
{ "main": "lib" }
LIB / index.js
module.exports = require('./path-to-transpiled-code.js'); // Now also export all the other stuff in this folder dynamically fs.readdirSync(DIRECTORY_TO_EXPORT, function (err, files) { if (err) { throw err; } files.forEach(function (file) { if (file !== 'index.js') { fs.symlinkSync(path.join(__dirname, file), path.join(DIRECTORY_TO_EXPORT, file)); } }) });
如果我的问题得到了解决,唯一需要的是将你的模块主path指向package.json。
{ "main": lib/index.js }
其中index.js是你的模块的主文件。 欲了解更多信息,请在这里查看npm文档
假设你有一个软件包my-module
,里面有一个子文件夹my-submodule
。 您的my-module/package.json
文件将包含以下行:
{ ..., "main": "lib/index.js", ... }
这将允许您的包裹被要求的线
var myMod = require('my-module');
要允许对子模块使用相同的语法,只需将package.json文件放在子模块文件夹中即可。 它应该包含以下内容:
{ "main": "lib/index.js" }
之后,您可以使用简单的require语法:
var mySubMod = require("my-module/my-submodule");
你有几个select如何实现你的目标。
将其全部导出到lib / index.js中
在主模块的入口点,您可以导出您希望从模块公开的所有内容。
-
+
完全控制什么是公共API的一部分,什么被认为是“私人” -
+
玩ES2015模块规格非常好 -
-
不满足您的要求,通过与服务器模块的path直接调用require()
调用组件(server
)
例:
'use strict' // this is whatever is the primary export of your module - be it a // function, object or anything else which can have other properties // assigned to it const main = require('./main') const server = require('./server') module.exports = main module.exports.server = server // ...
用法:
'use strict' const mymodule = require('my-module') const server = require('my-module').server const { server } = require('my-module') import { server } from 'my-module'
为根中的组件创build条目文件
您可以为每个要在您的模块的根文件夹中公开的API公开的API创build单独的文件。
-
+
满足您能够通过特定path需要组件的要求 -
-
结构稍微复杂一些,每个公共组件需要额外的文件 -
-
与ES2015模块不兼容(您必须使用组件的完整path,不能使用解构语法)
示例文件夹结构:
my-module ├── lib │ ├── index.js │ └── server.js └── server.js
my-module / server.js文件只能指向实际的实现:
'use strict' module.exports = require('./lib/server')
一般注意事项
应该注意的是,虽然技术上可行,但依靠消费者完整的模块path不是最好的select,因为文件夹和文件结构现在成为API的一部分,所以移动文件突然间是一个突破性的改变。 每当我发现自己需要以这种方式需要一个模块的组件时,我就把它当作是在搞模块的内部工作,而且我希望我的代码能够在该模块的补丁版本升级的时候达到平衡。