Devtool 配置
devtool
此选项用于控制是否以及如何生成 source map。可以使用 SourceMapDevToolPlugin 进行更细粒度的配置。若需处理已有的 source map,请参阅 Rule.extractSourceMap。
devtool
string = 'eval' Array<{ type: "all" | "javascript" | "css", use: string }> false
选择一种源映射风格来增强调试过程。这些值会显著影响构建(build)和重新构建(rebuild)的速度。
你也可以提供一个对象数组,为不同类型的资源配置不同的 source map 风格:
webpack.config.js
js
export default {
// ...
devtool: [
{ type: "javascript", use: "source-map" },
{ type: "css", use: "inline-source-map" },
],
};
type 字段指定了哪种资源类型应应用对应的 devtool 值:
"all"- 应用于所有资源类型(JavaScript 和 CSS)"javascript"- 仅应用于 JavaScript 文件"css"- 仅应用于 CSS 文件
当使用数组时,每个条目将按顺序处理。如果提供一个字符串值,它将被视为 { type: "all", use: "your-string-value" }。
T> webpack 仓库中包含一个展示所有 devtool 变体效果的示例。这些示例很可能帮助你理解它们之间的差异。
T> 除了使用 devtool 选项,你也可以直接使用 SourceMapDevToolPlugin/EvalSourceMapDevToolPlugin,因为它有更多的选项。切勿同时使用 devtool 选项和插件。devtool 选项会在内部添加插件,因此你会导致插件被应用两次。
| devtool | 性能 | 生产环境 | 质量 | 说明 |
|---|---|---|---|---|
| (none) | 构建:最快 重新构建:最快 |
是 | bundle | 追求极致性能的生产构建推荐选择。 |
eval |
构建:快 重新构建:最快 |
否 | generated | 追求极致性能的开发构建推荐选择。 |
eval-cheap-source-map |
构建:可以 重新构建:快 |
否 | transformed | 开发构建的权衡选择。 |
eval-cheap-module-source-map |
构建:慢 重新构建:快 |
否 | 原始行 | 开发构建的权衡选择。 |
eval-source-map |
构建:最慢 重新构建:可以 |
否 | 原始代码 | 高质量 SourceMap 的开发构建推荐选择。 |
cheap-source-map |
构建:可以 重新构建:慢 |
否 | transformed | |
cheap-module-source-map |
构建:慢 重新构建:慢 |
否 | 原始行 | |
source-map |
构建:最慢 重新构建:最慢 |
是 | 原始代码 | 高质量 SourceMap 的生产构建推荐选择。 |
inline-cheap-source-map |
构建:可以 重新构建:慢 |
否 | transformed | |
inline-cheap-module-source-map |
构建:慢 重新构建:慢 |
否 | 原始行 | |
inline-source-map |
构建:最慢 重新构建:最慢 |
否 | 原始代码 | 发布单个文件时的可能选择。 |
eval-nosources-cheap-source-map |
构建:可以 重新构建:快 |
否 | transformed | 不包含源代码 |
eval-nosources-cheap-module-source-map |
构建:慢 重新构建:快 |
否 | 原始行 | 不包含源代码 |
eval-nosources-source-map |
构建:最慢 重新构建:可以 |
否 | 原始代码 | 不包含源代码 |
inline-nosources-cheap-source-map |
构建:可以 重新构建:慢 |
否 | transformed | 不包含源代码 |
inline-nosources-cheap-module-source-map |
构建:慢 重新构建:慢 |
否 | 原始行 | 不包含源代码 |
inline-nosources-source-map |
构建:最慢 重新构建:最慢 |
否 | 原始代码 | 不包含源代码 |
nosources-cheap-source-map |
构建:可以 重新构建:慢 |
否 | transformed | 不包含源代码 |
nosources-cheap-module-source-map |
构建:慢 重新构建:慢 |
否 | 原始行 | 不包含源代码 |
nosources-source-map |
构建:最慢 重新构建:最慢 |
是 | 原始代码 | 不包含源代码 |
hidden-nosources-cheap-source-map |
构建:可以 重新构建:慢 |
否 | transformed | 无引用,不包含源代码 |
hidden-nosources-cheap-module-source-map |
构建:慢 重新构建:慢 |
否 | 原始行 | 无引用,不包含源代码 |
hidden-nosources-source-map |
构建:最慢 重新构建:最慢 |
是 | 原始代码 | 无引用,不包含源代码 |
hidden-cheap-source-map |
构建:可以 重新构建:慢 |
否 | transformed | 无引用 |
hidden-cheap-module-source-map |
构建:慢 重新构建:慢 |
否 | 原始行 | 无引用 |
hidden-source-map |
构建:最慢 重新构建:最慢 |
是 | 原始代码 | 无引用。当仅出于错误报告目的使用 SourceMap 时的可能选择。 |
| 快捷方式 | 说明 |
|---|---|
| 性能:构建 | devtool 设置对初始构建性能的影响如何? |
| 性能:重新构建 | devtool 设置对增量构建性能的影响如何?较慢的 devtool 可能会降低监视模式下的开发反馈循环。与构建性能相比,其度量标准不同,因为可以预期重新构建会比构建更快。 |
| 生产环境 | 将此 devtool 用于生产构建是否合理?当 devtool 对用户体验产生负面影响时,通常为 no。 |
| 质量:bundle | 你将在单个代码块中看到 chunk 的所有生成代码。这是没有任何开发工具支持的原始输出文件。 |
| 质量:generated | 你将看到生成的代码,但每个模块在浏览器开发工具中显示为单独的代码文件。 |
| 质量:transformed | 你将看到经过 loader 预处理后、但尚未进行 webpack 额外转换的生成代码。仅映射源代码行,列信息将被丢弃或不会生成。这可以防止在行中间设置断点,因为这与压缩器(minimizer)不兼容。 |
| 质量:原始行 | 假设所有 loader 都支持 SourceMapping,你将看到自己编写的原始代码。仅映射源代码行,列信息将被丢弃或不会生成。这可以防止在行中间设置断点,因为这与压缩器不兼容。 |
| 质量:原始代码 | 假设所有 loader 都支持 SourceMapping,你将看到自己编写的原始代码。 |
eval-* 附加 |
为每个模块生成 SourceMap 并通过 eval 附加。由于改善了重新构建性能,推荐用于开发环境。请注意,Windows Defender 问题可能导致病毒扫描导致速度显著降低。 |
inline-* 附加 |
将 SourceMap 内联到原始文件中,而不是创建单独的文件。 |
hidden-* 附加 |
不添加对 SourceMap 的引用。当不部署 SourceMap,但仍应生成时(例如出于错误报告目的),可以使用此选项。 |
nosources-* 附加 |
源代码不包含在 SourceMap 中。当原始文件应被引用(需要更多配置选项)时,这可能很有用。 |
T> 我们期望在验证 devtool 名称时遵循特定模式,请注意不要混淆 devtool 字符串的顺序。该模式是:[inline-|hidden-|eval-][nosources-][cheap-[module-]]source-map。
其中一些值适用于开发环境,另一些适用于生产环境。对于开发环境,你通常希望以包体积为代价换取快速的 Source Map,但对于生产环境,你需要独立且准确并支持压缩的 Source Map。
T> 参见 output.sourceMapFilename 自定义生成的 Source Map 的文件名。
质量
打包代码(bundled code) - 你将看到所有生成的代码作为一大块代码。你无法看到彼此分离的模块。
生成代码(generated code) - 你将看到每个模块彼此分离,并带有模块名称注释。你看到的是 webpack 生成的代码。例如:你不会看到 import {test} from "module"; test();,而是会看到类似 var module__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(42); module__WEBPACK_IMPORTED_MODULE_1__.a(); 的代码。
转换后代码(transformed code) - 你将看到每个模块彼此分离,并带有模块名称注释。你看到的是 webpack 转换之前、但在 Loader 转译之后的代码。例如:你不会看到 import {test} from "module"; class A extends test {},而是会看到类似 import {test} from "module"; var A = function(_test) { ... }(test); 的代码。
原始源代码(original source) - 你将看到每个模块彼此分离,并带有模块名称注释。你看到的是转译之前的代码,即你所编写的代码。这取决于 Loader 的支持。
无源代码内容(without source content) - 源代码内容不包含在 Source Map 中。浏览器通常会尝试从 Web 服务器或文件系统加载源代码。你必须确保正确设置 output.devtoolModuleFilenameTemplate 以匹配源代码 URL。
(仅行映射)(lines only) - Source Map 被简化为每行一个映射。这通常意味着每个语句一个映射(假设你这样编写代码)。这会阻止你在语句级别调试执行,并阻止在行的列上设置断点。结合压缩是不可能的,因为压缩器通常只发出一条单行代码。
开发环境
以下选项非常适合开发环境:
eval - 每个模块都通过 eval() 和 //# sourceURL 执行。这相当快。主要缺点是无法正确显示行号,因为它映射到转译后的代码而不是原始代码(没有来自 Loader 的 Source Map)。
eval-source-map - 每个模块都通过 eval() 执行,并且 SourceMap 作为 DataUrl 添加到 eval() 中。最初构建较慢,但它提供了较快的重新构建速度并产生真实的文件。行号被正确映射,因为它映射到原始代码。它为开发提供了最佳质量的 SourceMap。
eval-cheap-source-map - 类似于 eval-source-map,每个模块都通过 eval() 执行。它很“cheap”(廉价),因为它没有列映射,只映射行号。它忽略来自 Loader 的 Source Map,只显示类似于 eval devtool 的转译后代码。
eval-cheap-module-source-map - 类似于 eval-cheap-source-map,但是,在这种情况下,来自 Loader 的 Source Map 会被处理以获得更好的结果。然而,Loader 的 Source Map 被简化为每行一个映射。
特殊情况
以下选项不适用于开发或生产环境。它们用于某些特殊情况,例如某些第三方工具。
inline-source-map - SourceMap 作为 DataUrl 添加到 bundle 中。
cheap-source-map - 没有列映射的 SourceMap,忽略 loader 的 Source Map。
inline-cheap-source-map - 类似于 cheap-source-map,但 SourceMap 作为 DataUrl 添加到 bundle 中。
cheap-module-source-map - 没有列映射的 SourceMap,将 loader 的 Source Map 简化为每行一个映射。
inline-cheap-module-source-map - 类似于 cheap-module-source-map,但 SourceMap 作为 DataUrl 添加到 bundle 中。
生产环境
这些选项通常在生产环境中使用:
(none)(省略 devtool 选项或设置 devtool: false)- 不生成 SourceMap。这是一个很好的起步选项。
source-map - 生成完整的 SourceMap 作为单独的文件。它会向 bundle 添加一个引用注释,以便开发工具知道在哪里找到它。
W> 你应该配置服务器,禁止普通用户访问 Source Map 文件!
hidden-source-map - 与 source-map 相同,但不会向 bundle 添加引用注释。如果你只想使用 SourceMap 来映射错误报告中的错误堆栈跟踪,但不想将 SourceMap 暴露给浏览器开发工具,则此选项很有用。
W> 你不应该将 Source Map 文件部署到 Web 服务器。相反,仅将其用于错误报告工具。
nosources-source-map - 创建的 SourceMap 不包含 sourcesContent。它可用于在客户端映射堆栈跟踪,而不会暴露所有源代码。你可以将 Source Map 文件部署到 Web 服务器。
W> 它仍然会暴露文件名和结构,这可能导致反编译风险,但它不会暴露原始代码。
T> 如果默认的 webpack minimizer 已被覆盖(例如自定义 minimizer-webpack-plugin 选项),请确保将其替代配置为 sourceMap: true 以启用 SourceMap 支持。
帮助我们改进文档
发现翻译问题或内容错误?请告诉我们。
