Skip to content
Have a clear structure

提升开发体验

SourceMap

为什么

开发时我们运行的代码是经过 webpack 编译后的,例如下面这个样子:

js
/\*

- ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
- This devtool is neither made for production nor for readable output files.
- It uses "eval()" calls to create a separate source file in the browser devtools.
- If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
- or disable the default devtool with "devtool: false".
- If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
  \*/
  /**\*\***/ (() => { // webpackBootstrap
  /**\*\***/ "use strict";
  /**\*\***/ var **webpack_modules** = ({

/**_/ "./node_modules/css-loader/dist/cjs.js!./node_modules/less-loader/dist/cjs.js!./src/less/index.less":
/_!**************************************************\*\*\*\*****************************************************!\*\
 !**_ ./node_modules/css-loader/dist/cjs.js!./node_modules/less-loader/dist/cjs.js!./src/less/index.less _**! \*****************************************************\*****************************************************/
/\*\*\*/ ((module, **webpack_exports**, **webpack_require**) => {

eval("**webpack_require**.r(**webpack_exports**);\n/_ harmony export _/ **webpack_require**.d(**webpack_exports**, {\n/_ harmony export _/ \"default\": () => (**WEBPACK_DEFAULT_EXPORT**)\n/_ harmony export _/ });\n/_ harmony import _/ var \_node_modules_css_loader_dist_runtime_noSourceMaps_js**WEBPACK_IMPORTED_MODULE_0** = **webpack_require**(/_! ../../node_modules/css-loader/dist/runtime/noSourceMaps.js _/ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\");\n/_ harmony import _/ var \_node_modules_css_loader_dist_runtime_noSourceMaps_js**WEBPACK*IMPORTED_MODULE_0***default = /_#**PURE**_/**webpack_require**.n(\_node_modules_css_loader_dist_runtime_noSourceMaps_js**WEBPACK_IMPORTED_MODULE_0**);\n/_ harmony import _/ var \_node_modules_css_loader_dist_runtime_api_js**WEBPACK_IMPORTED_MODULE_1** = **webpack_require**(/_! ../../node_modules/css-loader/dist/runtime/api.js _/ \"./node_modules/css-loader/dist/runtime/api.js\");\n/_ harmony import _/ var \_node_modules_css_loader_dist_runtime_api_js**WEBPACK*IMPORTED_MODULE_1***default = /_#**PURE**_/**webpack_require**.n(\_node_modules_css_loader_dist_runtime_api_js**WEBPACK_IMPORTED_MODULE_1**);\n// Imports\n\n\nvar **_CSS_LOADER_EXPORT_** = \_node_modules_css_loader_dist_runtime_api_js**WEBPACK*IMPORTED_MODULE_1***default()((\_node_modules_css_loader_dist_runtime_noSourceMaps_js**WEBPACK*IMPORTED_MODULE_0***default()));\n// Module\n**_CSS_LOADER_EXPORT_**.push([module.id, \".box2 {\\n width: 100px;\\n height: 100px;\\n background-color: deeppink;\\n}\\n\", \"\"]);\n// Exports\n/_ harmony default export _/ const **WEBPACK_DEFAULT_EXPORT** = (**_CSS_LOADER_EXPORT_**);\n\n\n//# sourceURL=webpack://webpack5/./src/less/index.less?./node_modules/css-loader/dist/cjs.js!./node_modules/less-loader/dist/cjs.js");

/\*\*\*/ }),
// 其他省略

所有 css 和 js 合并成了一个文件,并且多了其他代码。此时如果代码运行出错那么提示代码错误位置我们是看不懂的。一旦将来开发代码文件很多,那么很难去发现错误出现在哪里。

所以我们需要更加准确的错误提示,来帮助我们更好的开发代码。

是什么

SourceMap(源代码映射)是一个用来生成源代码与构建后代码一一映射的文件的方案。

它会生成一个 xxx.map 文件,里面包含源代码和构建后代码每一行、每一列的映射关系。当构建后代码出错了,会通过 xxx.map 文件,从构建后代码出错位置找到映射后源代码出错位置,从而让浏览器提示源代码文件出错位置,帮助我们更快的找到错误根源。

怎么用

通过查看 Webpack DevTool 文档可知,SourceMap 的值有很多种情况.

但实际开发时我们只需要关注两种情况即可:

  • 开发模式:cheap-module-source-map

优点:打包编译速度快,只包含行映射

缺点:没有列映射

js
module.exports = {
  // 其他省略
  mode: 'development',
  devtool: 'cheap-module-source-map'
}
  • 生产模式:source-map

    优点:包含行/列映射

缺点:打包编译速度更慢

js
module.exports = {
  // 其他省略
  mode: 'production',
  devtool: 'source-map'
}