是否可以将ES6基类与节点模块一起使用?

时间:2015-11-19 16:01:25

标签: node.js npm

考虑一个可以通过插件扩展的节点模块(superModule);这样的插件可以如下所示实现似乎是合理的:

const superModule = require("super-module");

class SpecialPlugin extends superModule.Plugin {
    foo() {
    }
}

module.exports = SpecialPlugin;

这意味着项目同时使用"超级模块" "超级模块特别插件"模块看起来如下:

{project}/
  |-node_modules/
  |   |-super-module/                 <----
  |   |   |-index.js                      |
  |   |   |-package.json                  |
  |   |                                   |-- Included Twice?!
  |   |-super-module-special-plugin/      |
  |   |   |-node_modules/                 |
  |   |   |   |-super-module/         <----
  |   |   |   |   |-index.js
  |   |   |   |   |-package.json
  |   |   |   |
  |   |   |-index.js
  |   |   |-package.json
  |   |
  |-index.js
  |-package.json

目录结构包含相同的&#34;超级模块&#34;实施两次。

Q1。 NPM在这种情况下的表现如何?

Q2。是否根本不可能暴露基础&#34;插件&#34;类?

更新/事后补充:

或许正确的方法是做一些像以下那样的&#34;超级模块&#34;被调用者注入其插件。

module.exports.setup = function(superModule) {
    return class SuperPlugin extends superModule.Plugin {
        foo() {
        }
    }
};

1 个答案:

答案 0 :(得分:1)

  

NPM在这种情况下的表现如何?

取决于版本。如果可能的话,npm @ 3会使所有依赖项变平。因此,如果两个软件包都引用相同的版本,则super-module只会包含一次。如果存在版本冲突,super-module-special-plugin将安装它自己的副本,就像在您的示例中一样。

npm @ 2默认不进行重复数据删除,因此在这种情况下,它将存储同一模块的两个副本。

  

是否根本无法公开基础“插件”类?

当然可以。将基类注入依赖项是有效的,而不是不常见的方法。

super-module-special-plugin也可以将super-module声明为peer dependency。在这种情况下,“父”包的责任是提供super-module。在考虑这个用例的情况下设计了对等依赖关系。

对等依赖关系处理从npm @ 2改为npm @ 3。如果它不存在,npm @ 2将始终安装对等依赖项。 npm @ 3不再这样做了,所以你必须明确地安装它。