webpack构建失败:明显的依赖项不匹配,如何解决?

时间:2018-04-25 18:11:21

标签: webpack babeljs yarnpkg

我将一个较大的项目转换为webpack并遇到构建错误(实际上不同的错误取决于我尝试解决的方式)。我还没有熟练使用webpack,并希望能帮助解决这些问题的典型解决方案。

某些依赖项之间似乎存在冲突:

"@babel/core": "^7.0.0-beta.42",
"@babel/preset-env": "^7.0.0-beta.42",
"backbone.radio": "2.0.0",

Webpack抱怨:Cannot find module 'babel-preset-es2015'。看起来像backbone.radio有一个带有"presets": ["es2015"]的.babelrc文件,babel似乎试图尊重它,即使它是一个依赖项,但是它将babel-preset-env列为devDependency,所以它'找不到。

好的,所以我尝试将babel-preset-es2015@6.3.13(同一个backbone.radio引用)显式安装为顶级依赖项,以便找到它。然后它找到它但webpack(或真正的babel)抱怨:Error: Plugin/Preset files are not allowed to export objects, only functions.

很好,所以我尝试安装与babel 7兼容的预设的新版本,希望与backbone.radio兼容。似乎名称已经改变,所以我安装了@ babel / preset-es2015 @ 7.0.0-beta.42。当然这个名字并不匹配,所以我添加了一个webpack别名,但是它不起作用,但仍然无法找到;我认为babel并没有使用babel加载预设的依赖关系而是自己加载。

所以现在我被卡住了。人们通常采取什么措施来解决这些问题?其他我可能无法确定的潜在想法是可能的:

  • 告诉babel(不知何故?)别名babel-preset-es2015到@ babel / preset-es2015?
  • 配置yarn(以某种方式?)省略/删除backbone.radio的.babelrc文件(如果该文件消失,问题就完全消失了,但我不能手动将其从node_modules中删除所有当然是时间)

1 个答案:

答案 0 :(得分:0)

在Babel 6的原始生命周期中编译node_modules中的内容并不是真的,所以它可能很痛苦。直到最近,我们明确建议用户在exclude: /node_modules/配置中设置babel-loader,因为在任意第三方代码上运行Babel时,现在仍然有点危险。

针对您的具体问题,您有两种选择:

  1. 使用exclude: /node_modules/,以便Babel只处理您自己的代码。
  2. 升级到beta.46,因为我们现在已经添加了对Node包概念的一流支持,这是我们之前没有的。 Babel> = beta.45只会搜索“root”包中的.babelrc个文件。
  3. 我还要补充一点,如果您的Babel配置现在位于.babelrc,这不会影响node_modules中的内容,所以如果您打算编译第三方代码,那么'我想将您的配置移动到项目根目录中的babel.config.js文件,或直接将其放入webpack.config.js。您可能还希望明确地将sourceType: 'unambiguous'作为Babel选项传递。

    最后,如果您正在使用测试版,我们绝对仍在进行重大更改,因此您不应在package.json中使用^,因为这样可以让您获取所有内容的最新版本,与早期版本相比,我们可能已经破解了。

相关问题