2015-11-19 29 views
0

考虑一个可通过插件扩展的节点模块(superModule);它似乎是合理的,这样的插件可以实现像图所示:是否可以将ES6基类与节点模块一起使用?

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 

目录结构包含两次相同的“超级模块”实现。

Q1。 NPM在这种情况下的行为如何? Q2302。是不是可以公开一个基础的“插件”类?

更新/教育反思:

或许正确的办法是做类似如下,其中“超级模块”是被调用者注入到它的插件。

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

回答

1

如何NPM在这种情况下的行为?

取决于版本。如果可能,npm @ 3会展平所有依赖关系。因此,如果两个软件包都提及同一版本,super-module将只包含一次。如果存在版本冲突,则super-module-special-plugin将像您的示例一样安装自己的副本。

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

是不是可以公开一个基类“插件”类?

当然可以。将基类作为依赖项注入是有效的并非罕见的方法。

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

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

+0

这真的很有用;谢谢! –

+0

**另外:**我发现我必须更新到最新的npm才能使对等方依赖性正常工作。 –

相关问题