文章目录

  • demo
    • 代码结构
    • 原始源代码
    • 编译后的代码
    • source map
      • source map是什么
      • 启用source map
  • devtool
    • 值为source-map
    • 值为inline-source-map
    • 值为hidden-source-map
    • 值为cheap-source-map
    • 小结
    • 参考文章

demo

代码结构

原始源代码

  • math.js
//math.js
function add(x,y){return x+y;
}
function sub(x,y){return x-y;
}export {add,sub
}
  • index.js
//index.js
import {add,sub} from "./math.js";
var sum = add(1,2);
var diff = sub(2,1);
document.querySelector("#root").textContent = [sum,diff].join("||");
  • index.html
//index.html
<body><div id="root"></div><script src="./dist/bundle.js"></script>
</body>
  • webpack.config.js
//webpack.config.js
const path = require("path");
const {CleanWebpackPlugin} = require("clean-webpack-plugin");
module.exports = {mode:"development",devtool:"source-map",entry:"./index.js",output:{filename:"bundle.js",path:path.resolve(__dirname,"dist")},plugins:[new CleanWebpackPlugin()]
}
  • package.json
//package.json
{"name": "test","version": "1.0.0","description": "","main": "index.js","scripts": {"build": "webpack --config webpack.config.js"},"keywords": [],"author": "","license": "ISC","devDependencies": {"clean-webpack-plugin": "^3.0.0","webpack": "^4.43.0","webpack-cli": "^3.3.11"}
}

编译后的代码

npm run build

  • bundle.js
//bundle.js
//省略了......
//# sourceMappingURL=bundle.js.map
  • bundle.js.map
//bundle.js.map
{"version": 3,"sources": ["webpack:///webpack/bootstrap","webpack:///./index.js","webpack:///./math.js"],"names": [],"mappings": ";QAAA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;;;QAGA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA,0CAA0C,gCAAgC;QAC1E;QACA;;QAEA;QACA;QACA;QACA,wDAAwD,kBAAkB;QAC1E;QACA,iDAAiD,cAAc;QAC/D;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,yCAAyC,iCAAiC;QAC1E,gHAAgH,mBAAmB,EAAE;QACrI;QACA;;QAEA;QACA;QACA;QACA,2BAA2B,0BAA0B,EAAE;QACvD,iCAAiC,eAAe;QAChD;QACA;QACA;;QAEA;QACA,sDAAsD,+DAA+D;;QAErH;QACA;;;QAGA;QACA;;;;;;;;;;;;;AClFA;AAAA;AAAkC;AAClC,UAAU,oDAAG;AACb,WAAW,oDAAG;AACd,oE;;;;;;;;;;;;ACHA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA","file": "bundle.js","sourcesContent": [" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./index.js\");\n","import {add,sub} from \"./math.js\";\r\nvar sum = add(1,2);\r\nvar diff = sub(2,1);\r\ndocument.querySelector(\"#root\").textContent = [sum,diff].join(\"||\");","function add(x,y){\r\n    return x+y;\r\n}\r\nfunction sub(x,y){\r\n    return x-y;\r\n}\r\n\r\nexport {\r\n    add,\r\n    sub\r\n}"],"sourceRoot": ""
}

source map

source map是什么

source map(源映射),是一种文本格式,扩展名是.map
上面的bundle.js.map就是source map。
source map本质上是一个 JSON文本文档,保存着 编译后的代码原始源代码位置映射关系
编译后代码的第几列 对应 哪个原始源文件中的第几行第几列,bundle.js.map中的mappings属性记录着这些位置对应关系。

启用source map
  • source map ,更准确地说,是浏览器的能力。想用source map,首先得Enable JavasScript source maps
  • //# sourceMappingURL=bundle.js.map
    bundle.js的最后一行是//# sourceMappingURL=bundle.js.map。这一行告诉浏览器,bundle.js的映射文件是bundle.js.map,所以浏览器会自动加载bundle.js.map,并根据该map文件提供的位置映射关系计算bundle.js中每行代码对应原始源代码中的哪个文件的哪一行。如此一来,调试bundle.js时,在某行打断点,就会跳到对应原始源文件所在行,就和调试原始源文件一样。

devtool

source map可以将 编译后的代码 映射到 原始源代码。
但要不要生成 source map、怎么生成 source map,devtool说了算。

值为source-map

可以在开发环境用用,生产环境别想了

  • 调试很方便
    source map独立成文件bundle.js.mapbundle.js最后一行的//# sourceMappingURL=bundle.js.map告诉浏览器,bundle.js的映射文件是bundle.js.map
    调试bundle.js时,在某行打断点,就会跳到对应原始源文件所在行,就和调试原始源文件一样。
//bundle.js
//# sourceMappingURL=bundle.js.map
//bundle.js.map
{"mappings": ";QAAA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;;;QAGA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA,0CAA0C,gCAAgC;QAC1E;QACA;;QAEA;QACA;QACA;QACA,wDAAwD,kBAAkB;QAC1E;QACA,iDAAiD,cAAc;QAC/D;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,yCAAyC,iCAAiC;QAC1E,gHAAgH,mBAAmB,EAAE;QACrI;QACA;;QAEA;QACA;QACA;QACA,2BAA2B,0BAA0B,EAAE;QACvD,iCAAiC,eAAe;QAChD;QACA;QACA;;QAEA;QACA,sDAAsD,+DAA+D;;QAErH;QACA;;;QAGA;QACA;;;;;;;;;;;;;AClFA;AAAA;AAAkC;AAClC,UAAU,oDAAG;AACb,WAAW,oDAAG;AACd,oE;;;;;;;;;;;;ACHA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA","file": "bundle.js"
}
  • 构建速度很慢
    生成的source map很详细,所以它的构建速度会很慢。
    开发过程中要频繁修改,在"source-map"的情况下npm run build,会让你 等到 花儿 谢了。如果能忍受它的慢,可以在开发环境玩一玩。暴脾气的人们,和它就此别过吧。
  • 不安全
    调试确实很方便,但整个源码都暴露出来了,不安全,所以生产环境还是别想了。

值为inline-source-map

可以在开发环境用用,生产环境别想了

  • 调试很方便
    source map不独立成文件,而是以base64的格式嵌在bundle.js里。
    调试bundle.js时,在某行打断点,就会跳到对应原始源文件所在行,就和调试原始源文件一样。
//bundle.js
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbWF0aC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9EOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSx5Q0FBeUMsaUNBQWlDO1FBQzFFLGdIQUFnSCxtQkFBbUIsRUFBRTtRQUNySTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDJCQUEyQiwwQkFBMEIsRUFBRTtRQUN2RCxpQ0FBaUMsZUFBZTtRQUNoRDtRQUNBO1FBQ0E7O1FBRUE7UUFDQSxzREFBc0QsK0RBQStEOztRQUVySDtRQUNBOzs7UUFHQTtRQUNBOzs7Ozs7Ozs7Ozs7O0FDbEZBO0FBQUE7QUFBa0M7QUFDbEMsVUFBVSxvREFBRztBQUNiLFdBQVcsb0RBQUc7QUFDZCxvRTs7Ozs7Ozs7Ozs7O0FDSEE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImJ1bmRsZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vaW5kZXguanNcIik7XG4iLCJpbXBvcnQge2FkZCxzdWJ9IGZyb20gXCIuL21hdGguanNcIjtcclxudmFyIHN1bSA9IGFkZCgxLDIpO1xyXG52YXIgZGlmZiA9IHN1YigyLDEpO1xyXG5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI3Jvb3RcIikudGV4dENvbnRlbnQgPSBbc3VtLGRpZmZdLmpvaW4oXCJ8fFwiKTsiLCJmdW5jdGlvbiBhZGQoeCx5KXtcclxuICAgIHJldHVybiB4K3k7XHJcbn1cclxuZnVuY3Rpb24gc3ViKHgseSl7XHJcbiAgICByZXR1cm4geC15O1xyXG59XHJcblxyXG5leHBvcnQge1xyXG4gICAgYWRkLFxyXG4gICAgc3ViXHJcbn0iXSwic291cmNlUm9vdCI6IiJ9
  • 构建速度很慢
    devtool:"inline-source-map"的构建速度也很慢,如果能忍受,可以在开发环境中用用。
  • 不安全、包体积大
    调试倒是方便了,整个源码都暴露了,不安全。
    另外,由于source map以base64的格式嵌在bundle.js里,所以bundle.js的体积会变大,所以生产环境还是别想了。

值为hidden-source-map

不适合开发环境,生产环境可以用用

  • 调试稍有不便
    source map独立成文件bundle.js.map,但bundle.js最后一行没有//# sourceMappingURL=bundle.js.map。也就是说,虽然有映射文件,但浏览器并不知道映射文件在哪儿。因此,调试bundle.js时不会跳到原始源文件,稍稍增加了一点调试难度。
//bundle.js.map
{"mappings": ";QAAA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;;;QAGA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA,0CAA0C,gCAAgC;QAC1E;QACA;;QAEA;QACA;QACA;QACA,wDAAwD,kBAAkB;QAC1E;QACA,iDAAiD,cAAc;QAC/D;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,yCAAyC,iCAAiC;QAC1E,gHAAgH,mBAAmB,EAAE;QACrI;QACA;;QAEA;QACA;QACA;QACA,2BAA2B,0BAA0B,EAAE;QACvD,iCAAiC,eAAe;QAChD;QACA;QACA;;QAEA;QACA,sDAAsD,+DAA+D;;QAErH;QACA;;;QAGA;QACA;;;;;;;;;;;;;AClFA;AAAA;AAAkC;AAClC,UAAU,oDAAG;AACb,WAAW,oDAAG;AACd,oE;;;;;;;;;;;;ACHA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA","file": "bundle.js",
}
  • 构建速度很慢
    devtool:"hidden-source-map"的构建速度也很慢。
  • 安全
    源码被隐藏,所以增加了一点点调试难度,但也因此保证了源码安全

值为cheap-source-map

推荐开发环境中使用,生产环境别想了

  • 调试很方便
    source map独立成文件bundle.js.mapbundle.js最后一行的//# sourceMappingURL=bundle.js.map告诉浏览器,bundle.js的映射文件是bundle.js.map
    调试bundle.js时,在某行打断点,就会跳到对应原始源文件所在行,就和调试原始源文件一样。
    )
//bundle.js
//# sourceMappingURL=bundle.js.map
//bundle.js.map
{"mappings": ";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AClFA;AAAA;AAAA;AACA;AACA;AACA;;;;;;;;;;;;ACHA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;A","file": "bundle.js",
}
  • 构建速度比较快
bundle.js.map的size
source-map 3.98KiB
hidden-source-map 3.98KiB
cheap-source-map 3.89KiB

"cheap-source-map"时生成的source map体积小点儿,因为不包含列信息,所以构建速度快一些。

  • 不安全
    调试倒是方便了,但暴露了源码,不安全,所以不适合生产环境。

小结

devtool 特点 使用场景
source-map 调试方便,构建速度慢,不安全 脾气好的,可以在开发环境上用用,生产环境上别用
inline-source-map 调试方便,构建速度慢,不安全,包体积大 脾气好的,可以在开发环境上用用,生产环境上别用
hidden-source-map 调试稍有不便,构建速度慢,安全 不适合开发环境,生产环境上可以用用
cheap-source-map 调试方便,构建速度比较快,不安全 推荐在开发环境上使用,生产环境上别用

参考文章

JavaScript Source Map 详解
JavaScript的Source Map (sourceURL / sourceMappingURL)
使用source map
devtool
devtool demo

webpack的source map相关推荐

  1. webpack之source map

    webpack之source map 前言 一.什么是source map 二.在webpack中启用source map 三.关于source map的各种模式 前言 通过构建编译之类的操作,我们可 ...

  2. 记录webpack的source map使用详细说明

    common.js export const show = () => {console.log(1212121)();document.write('hello webpack 11') } ...

  3. webpack与Source Map

    前端工程化 安装webpack npm install webpack webpack-cli -D ![在这里插入图片描述](https://img-blog.csdnimg.cn/73a55320 ...

  4. Webpack——调试工具Source Map

    Source Map是一个信息文件,里面存储这位置信息 并不是我们生活中的卫星定位信息,是指定代码的位置信息,可以清晰的获取到指定代码所处在的行数 为什么需要Source Map呢?难道我们打开终端看 ...

  5. webpack打包生成的map文件_Webpack的source map

    一.webpack中source map是什么 目前我们的例子都是在浏览器里运行编译打包后的代码,编译后的代码会把我们的原始代码做压缩整合等操作.这样的代码与原始代码差别非常大,对于我们开发时是没有帮 ...

  6. webpack source map详解

    1. 什么是source map ? 根据名字可以推测出source map就是我们编译后的源文件映射.当使用webpack 编译前端项目时,配置项devtool控制是否生成source map. 2 ...

  7. 【转】webpack中关于source map的配置

    Webpack中sourcemap的配置 sourcemap是为了解决开发代码与实际运行代码不一致时帮助我们debug到原始开发代码的技术.尤其是如今前端开发中大部分的代码都经过编译,打包等工程化转换 ...

  8. 一文看懂 webpack 的所有 source map !

    一直以来对source map 都懵懵懂懂, 被webpack 所提供的多样的source 给乱花了眼. 这次就决定来一一尝试一下各种source map的区别 什么是source map 现代的前端 ...

  9. webpack:devtool配置中的source map

    webpack:devtool配置中的source map 一.功能作用 二.配置文件 三.source map格式 (1)source-map (2)inline-source-map (3)hid ...

最新文章

  1. CSS Tricks网站创始人作序推荐,这本书助你成为Web开发高手
  2. Xamarin iOS开发实战上册-----2.2.2 使用代码添加视图
  3. 前端php解密,转发:RSA实现JS前端加密,PHP后端解密
  4. AIC-赤池信息准则、BIC-贝叶斯信息准则
  5. 什么时候能用Δs判断反应进行方向_化学反应原理复习 第二章
  6. #研发解决方案#数据移山:接入、迁移、同步一站式
  7. 1×pbs缓冲液配方_PBS缓冲液的配制
  8. hbase hmaster一会就没了_浅析HBase
  9. 原生js封装table表格操作,获取任意行列td,任意单行单列方法
  10. Hibernate中主键生成策略
  11. Python连接MySQL数据库(pymysql),DataFrame写入 MySQL(create_engine)- Python代码
  12. jq在html中添加dom元素,使用jQuery添加DOM元素的最佳方法
  13. SpringCloud入门之应用程序上下文服务(Spring Cloud Context)详解
  14. javascript : instanceof,typeof,constructor
  15. 关于angular开发中报错Cannot find module ‘webpack/lib/node/NodeTemplatePlugin‘问题的解决办法若干
  16. esxi6.7.0最新版本下载
  17. markdown文本居中
  18. 360浏览器浏览网页字体模糊的解决方法
  19. 【mmdetection3d】——3D 目标检测 NuScenes 数据集
  20. 计算机双代号网络图,双代号网络图计算机自动绘制研究.pdf

热门文章

  1. 野黄芩素,CAS 529-53-3SCUTELLAREIN
  2. 智能蓝牙挂锁方案开发
  3. 安卓Permission权限请求
  4. McAfee Endpoint Security for Mac(防病毒软件)
  5. lego-loam代码分析(1)-地面提取和点云类聚
  6. Authorized users only. All activity may be monitored and reported.
  7. [转]浅析淘宝数据魔方技术架构
  8. 【涵子来信python大全】——第二季——opencv第二篇
  9. Bootstrap笔记(九) 排版 - 清單
  10. C++算法篇 模拟算法