Node.js 节点模块的根目录
我有一个非常标准的节点模块,使用babel传输我们的代码,然后输出到“lib”文件夹。package.json将“main”指向“lib/index.js”,这样人们就可以Node.js 节点模块的根目录,node.js,npm,babeljs,package.json,Node.js,Npm,Babeljs,Package.json,我有一个非常标准的节点模块,使用babel传输我们的代码,然后输出到“lib”文件夹。package.json将“main”指向“lib/index.js”,这样人们就可以require('my-module') 但是,如果我有一个子目录(例如我的模块/服务器),那么当他们使用我的模块时,他们必须执行require('my-module/lib/server')。我见过有人将package.json复制到lib中的构建后步骤,但这让我觉得有点不对劲。在npm中是否有任何方法可以指定一个主目录,使
require('my-module')
但是,如果我有一个子目录(例如我的模块/服务器),那么当他们使用我的模块时,他们必须执行
require('my-module/lib/server')
。我见过有人将package.json复制到lib中的构建后步骤,但这让我觉得有点不对劲。在npm中是否有任何方法可以指定一个主目录,使模块的任何require()都从该目录开始?然后,我可以让用户在不使用lib部分的情况下进行require('my-module/server')。我认为最好的解决方案是,你有一个index.js作为主索引,上面有所有的子模块,这样你就可以执行类似于require('your-module')的操作。服务器没有看到你的文件夹结构是很困难的,但是你可以:
- 使用
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));
}
})
});
如果我答对了您的问题,那么您唯一需要做的就是将模块的主路径指向package.json内
{
"main": lib/index.js
}
其中index.js是模块的主文件。
有关更多信息,请查看npm文档让我们假设您有一个包我的模块
,其中有一个子文件夹我的子模块
。
您的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");
你有几个选择如何实现你的目标
将其全部导出到lib/index.js中
在主模块的入口点,您可以导出希望从模块中公开的所有内容
+
完全控制什么是公共API的一部分,什么是“私有的”
+
与ES2015模块规范配合得非常好
-
无法满足您通过直接调用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'
my-module
├── lib
│ ├── index.js
│ └── server.js
└── server.js
用法:
'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'
my-module
├── lib
│ ├── index.js
│ └── server.js
└── server.js
为根目录中的组件创建条目文件
您可以在模块的根文件夹中为要作为公共API的一部分公开的每个组件创建单独的文件
+
满足您通过特定路径需要组件的要求
-
结构稍微复杂一些,每个公共组件都需要额外的文件
-
与ES2015模块不兼容(必须使用组件的完整路径,不能使用解构语法)
文件夹结构示例:
'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'
my-module
├── lib
│ ├── index.js
│ └── server.js
└── server.js
my module/server.js文件将仅指向实际实现:
'use strict'
module.exports = require('./lib/server')
一般说明
需要注意的是,虽然技术上可行,但用户依赖完整的模块路径并不是最好的选择,因为文件夹和文件结构现在成为API的一部分,因此移动文件突然成为一个突破性的变化。每当我发现自己需要以这种方式要求模块的组件时,我都会将其视为是在摆弄该模块的内部结构,我希望我的代码能够通过该模块的补丁版本升级达到收支平衡。我认为要求(“我的模块”)更为惯用。服务器,然后让my-module.js显式导出服务器。问题是,webpack将在捆绑包中包含(或尝试包含)服务器代码。至少在2.0发布之前,我会说,如果是这样的话,将我的模块分解成子组件并使用require(“我的模块服务器”)更为惯用,它依赖于require(“我的模块公用”)之类的东西。然后,“我的模块”将是一个超级包,包含一切方便,但个别包可以单独包含。两者都不是你想要的,但都是解决问题的常用方法。是的,你可能是对的。:)我只是希望能简单点这个问题还没有答案?真是个问题。我不想构建索引文件,因为最基本的需求必须执行require('my-module')。main
。我认为需要的子部分要干净得多。这种方法的问题是web包会在包中包含“.server”