节点模块的根目录

我有一个漂亮的标准节点模块使用巴贝尔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的一部分,所以移动文件突然间是一个突破性的改变。 每当我发现自己需要以这种方式需要一个模块的组件时,我就把它当作是在搞模块的内部工作,而且我希望我的代码能够在该模块的补丁版本升级的时候达到平衡。