节点模块的根目录

时间:2016-02-09 00:49:08

标签: node.js npm babeljs package.json

我有一个非常标准的节点模块,使用babel来转换我们的代码,然后输出到&#lib;'夹。 package.json指向' main' to' lib / index.js'这样人们就可以require('my-module')

但是,如果我有一个子目录(例如my-module / server),那么当他们使用my-module时,他们必须require('my-module/lib/server')。我已经看到人们把post.buson复制到lib中的post构建步骤,但这对我来说只是感觉hacky和错误。在npm中是否有任何方法可以指定一个主目录,其中我的模块的任何require()都将从该目录开始?那么我可以让用户在没有lib部分的情况下需要(' my-module / server')...

5 个答案:

答案 0 :(得分:1)

我认为最好的解决方案是你有一个主要的index.js和所有子模块,所以你可以做一些像queue_runners=tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS) filename_queue_runners=[qr for qr in queue_runners if 'input_producer' in qr.name] for qr in filename_queue_runners: for k in prebuffer_amount: sess.run(qr._enqueue_ops[0])

这样的事情。

答案 1 :(得分:0)

在没有看到您的文件夹结构的情况下很难,但您可以:

  • 使用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));
    }
  })
});

答案 2 :(得分:0)

如果我的问题是正确的,那么你唯一需要的就是将你的模块主路径指向package.json。

{
   "main": lib/index.js 
}

其中index.js是模块的主文件。 有关更多信息,请查看npm文档here

答案 3 :(得分:0)

让我们假设您有一个包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");

答案 4 :(得分:0)

您有多种选择如何实现目标。

lib / index.js

中导出所有内容

在主模块的入口点,您可以导出要从模块中公开的所有内容。

  • +完全控制公共API的一部分以及被视为“私有”的内容
  • +玩ES2015模块规范非常好
  • -不满足您要求组件(server)通过直接require()调用服务器模块的路径
  • 的要求

示例:

'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'

为根

中的组件创建条目文件

您可以为要在模块的根文件夹中公开API的一部分公开的每个组件创建单独的文件。

  • +满足您通过特定路径要求组件的要求
  • -结构略微复杂,每个公共组件需要额外的文件
  • -与ES2015模块不兼容(您必须使用组件的完整路径,不能使用解构语法)

示例文件夹结构:

my-module
├── lib
│   ├── index.js
│   └── server.js
└── server.js

my-module / server.js 文件只会指向实际的实现:

'use strict'

module.exports = require('./lib/server')

一般说明

应该注意的是,虽然技术上可行,但消费者依赖完整的模块路径并不是最佳选择,因为文件夹和文件结构现在已成为API的一部分,因此移动文件突然发生了重大变化。每当我发现自己需要以这种方式需要模块的组件时,我就把它视为我正在搞乱该模块的内部构件,并且我希望我的代码能够通过该模块的补丁版升级来实现收支平衡。