Node.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中是否有任何方法可以指定一个主目录,使

我有一个非常标准的节点模块,使用babel传输我们的代码,然后输出到“lib”文件夹。package.json将“main”指向“lib/index.js”,这样人们就可以
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”