将npm程序包与相等的devDependencies和peerDependencies链接会破坏使用Webpack开发的应用程序

时间:2018-12-14 07:01:54

标签: node.js npm webpack webpack-dev-server

我有以下情况:

  

前端的 package.json

{
  "dependencies": {
     "lib" : "1.0.0",
     "foo" : "1.0.0"
  }
}
     

lib的 package.json

{
  "devDependencies": {
     "foo" : "1.0.0"
  },
   peerDependencies": {
     "foo" : "1.0.0"
  }
}

虽然我正在使用webpack-dev-server进行一些前端开发,但我正在将模块foonpm link链接到 Frontend的依赖树中

├── foo@1.0.0  
└─┬ lib@1.0.0                
  └── foo@1.0.0

而不是像这样:

├── foo@1.0.0  
└── lib@1.0.0                

我已经发现webpack在我的foo的{​​{1}}文件夹中的lib中找到了模块node_modules,因为我将此包定义为devDependencies我的单元测试。现在,捆绑源中有两次该软件包,这会导致一些错误。

问题:如何强制 webpacknpm使用我父母的模块foolib一样在我的peerDependencies中使用> Frontend )?

1 个答案:

答案 0 :(得分:0)

我假设您已经在两个不同的文件夹中本地检出了frontend和lib,并使用cd frontend && npm link lib之类的东西将lib链接到了前端。因此,您的目标是在两个软件包上同时工作(在两个编辑器中更改代码),但同时也希望能够分别在前端和lib中运行编译器和单元测试。

答案是:不可能(那么容易)。这是因为依赖关系始终始终首先解析到程序包的文件夹中。这意味着,如果在lib中安装了foo,它将始终选择lib:foo,而不是root:foo。

最简单的解决方案是根本不安装lib:foo或将其删除。您可以根据需要使用root:foo。但是,如果您使用npm link,它将首先安装所有lib的依赖项。

因此,对于在前端中进行一次构建,您只需删除该lib:foo软件包,然后进行构建。但是,从lib软件包的角度来看,由于其依赖关系被搞砸,因此没有任何作用。

更强大的解决方案是将lib安装在root中,并且只安装foo的实际依赖项,而这些依赖项不在peer / devDependencies中

为此,您可以在https://github.com/marcj/npm-local-development上使用npm-local-development

它与npm link基本上具有相同的作用,但是通过设置文件观察程序并在后台自动同步文件更改(不包括所有devDependencies / peerDependencies)来解决devDependency限制。

  1. 您安装npm-local-development:npm i -g npm-local-development
  2. 您在根包中创建了名为.links.json的文件。
  3. 您像这样将每个程序包名称及其本地相对文件夹路径写入其中

    {     “ @ shared / core”:“ ../../my-library-repo/packages/core” }

  4. 打开控制台,然后在该根软件包中运行npm-local-development。让它在后台运行。

免责声明:我是这个免费的开源项目的作者。