【问题标题】:How do I package a node module with optional submodules?如何打包带有可选子模块的节点模块?
【发布时间】:2015-06-25 21:32:32
【问题描述】:

我正在编写一个 javascript 库,其中包含一个核心模块和几个 扩展核心模块的可选子模块。我的目标是浏览器 环境(使用 Browserify),我希望我的模块的用户只会 想要使用我的一些可选子模块,而不必将其余的下载到 客户端——就像在lodash 中工作的自定义构建一样。

我想象的这种工作方式:

// Require the core library
var Tasks = require('mymodule');
// We need yaks
require('mymodule/yaks');
// We need razors
require('mymodule/razors');

var tasks = new Tasks();    // Core mymodule functionality
var yak = tasks.find_yak(); // Provided by mymodule/yaks
tasks.shave(yak);           // Provided by mymodule/razors

现在,假设mymodule/* 命名空间有数十个这样的子模块。这 mymodule 库的用户只需要承担 她使用的子模块,但不需要像这样的离线构建过程 lodash 使用:像 Browserify 这样的工具为我们解决依赖关系图 只包含所需的代码。

是否可以使用 Node/npm 以这种方式打包某些东西?我有错觉吗?

更新:答案 over here 似乎表明这是可能的,但我无法从 npm 文档中弄清楚如何实际构建文件和 package.json

假设我有这些文件:

./lib/mymodule.js
./lib/yaks.js
./lib/razors.js
./lib/sharks.js
./lib/jets.js

在我的package.json 中,我将拥有:

  "main": "./lib/mymodule.js"

但是node如何知道./lib/下的其他文件呢?

【问题讨论】:

    标签: javascript node.js npm browserify


    【解决方案1】:

    它比看起来更简单——当你需要一个包的名字时,它会得到“主”文件。所以require('mymodule') 返回"./lib/mymodule.js"(根据你的 package.json “main” prop)。要直接要求可选子模块,只需通过文件路径要求它们。

    所以要获取 yaks 子模块:require('mymodule/lib/yaks')。如果你想做require('mymodule/yaks'),你需要改变你的文件结构以匹配它(将 yaks.js 移动到根文件夹)或者在根目录有一个 yaks.js 的地方做一些棘手的事情,它只是做一些类似的事情: module.exports = require('./lib/yaks');

    祝这个牦牛库好运。听起来毛茸茸的:)

    【讨论】:

    • 遗憾的是,所有内容都必须存在于根文件夹中,但它必须这样做。谢谢!
    • @DavidEyk 同意,我也希望有一种方法可以在 package.json 中指定可导出的子模块,而不是让你的模块中无论如何都需要任何东西。
    猜你喜欢
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多