问题排查

使用 Webpack 的过程中可能会出现各种运行时警告或错误。通常,都是由于某种原因导致了特定部分的构建失败。我们可以使用下面列出的基本过程来开排查问题:

  1. --display-error-details 标志传递给 Webpack 以获得更准确的错误信息。示例:npm run build -- --display-error-details
  2. 仔细推敲错误的根源。有时您可以推断出上下文有什么问题。如果 Webpack 无法解析模块,它可能不会像您期望的那样把模块传递给 loader。
  3. 尝试了解错误的来源。它来自您的代码、依赖项,还是 Webpack?
  4. 删除代码直到错误消失再添加代码,直到它再次出现。通过隔离的形式将问题尽可能的简化。
  5. 如果代码在另一个项目中工作,那么找出不同的东西。项目之间的依赖关系可能会有所不同,或者设置会有所不同。在最糟糕的情况下,你依赖的包可能回退了版本。出于这个原因,使用 lockfile 是一个好主意。
  6. 仔细研究相关的包。有时候查看 package.json 文件可以发现一些更深入的信息。有可能,您正在使用的包无法按预期方式解析。
  7. 在线搜索错误,也许其他人遇到过它。Stack Overflow官方 issue tracker 是比较好的在线途径。
  8. 启用 stats: "verbose" 以从 Webpack 获取更多信息。官方文档介绍了更多的相关信息。
  9. 在错误附近添加临时 console.log 以更深入地了解问题。还有一个更重量级的方式,通过 Chrome Dev Tools 调试 Webpack
  10. 在 Stack Overflow 上提问使用官方 Gitter 频道
  11. 如果上述方法都无济于事并且您确信您发现了 bug,请在官方 issue tracker 或其他适当位置报告问题。另外,请仔细遵循问题模板,并提供最小的可运行示例,因为它有助于解决问题。

有时通过搜索引擎搜索错误提示信息并以此方式获得答案是最快的。除此之外,上面是一个很好的调试顺序。如果您的设置过去有效,您还可以考虑使用 git bisect 之类的命令来确定已知工作状态和当前已损坏工作状态之间的变化。

接下来,您将了解一些最常见的错误并学习如何处理它们。

找不到 Entry 模块的错误

如果入口模块的路径不存在,则最终可能会出现此错误。该错误消息告诉您,Webpack 无法找到的路径。

ERROR… 未找到模块

该错误可能出于两个原因。loader 定义存在问题,使其指向一个不存在的加载器,或者通过代码导入路径错误,使它指向了不存在的模块。错误消息指出了要修复的内容。

模块解析失败

即使 Webpack 可以很好地解析你的模块,它仍然无法构建它们。如果您使用的是 loader 无法理解的语法,则可能会发生这种情况。您可能在处理过程中遗漏了某些内容。

找不到 loader

还有另一个微妙与 loader 相关的错误。如果一个包与一个 loader 的名称匹配上了,但是却没有实现 loader 接口,此时 Webpack 会匹配它们并抛出一个错误:这个包不是 loader。

这个错误可能是由于 loader: "eslint" 之类的写法造成的,正常情况应该是 loader: "eslint-loader"。如果 loader 根本不存在,则会引发错误 Module not found

模块构建失败:Unknown word

此错误与上一个错误类似。解析文件成功,但有未知的语法。很可能问题是拼写错误,但是当 Webpack 正常导入并遇到它不理解的语法时,也会发生此错误。这很可能意味着该特定文件类型缺少相应的 loader。

SyntaxError:Unexpected token

SyntaxError是上述类别的另一种错误。如果您使用尚未与 terser 一起编译的 ES2015 语法,则可能出现此错误。当遇到它无法识别的语法结构时,就会引发这个错误。

DeprecationWarning

尤其是在 Webpack 更新为新的主要版本之后,Node 可能会抛出这个错误。您正在使用的插件或 loader 可能需要更新。通常所需的更改很少。请通过 Node 运行 webpack : node --trace-deprecation node_modules/.bin/webpack --env production,以找出警告的来源。

--trace-deprecation 标志传递给 Node 非常重要,这样可以查看警告源自何处。使用 --trace-warnings 是另一种方式,它将捕获所有警告的跟踪信息,而不仅仅是过时信息。

总结

这些只是错误的例子。一些是因为 Webpack 方面发生了特定错误,但其余错误来自 loader 和插件。简化您的项目是一个很好的步骤,因为它可以更容易地理解错误发生的位置。

在大多数情况下,如果您知道了错误发生的位置,错误很快就会解决。最坏的情况是,您使用的工具本身除了问题。在这种情况下,您应该向该工具项目提供高质量的报告并帮助解决它。

用户头像
登录后发表评论