每一個 module 會經過 eval() 來執行,並在後面添加 //# sourceURL
javascript
webpackJsonp([1],[ function(module,exports,__webpack_require__){ eval( ... //# sourceURL=webpack:///./src/js/index.js?' ) }, function(module,exports,__webpack_require__){ eval( ... //# sourceURL=webpack:///./src/static/css/app.less?./~/.npminstall/css-loader/0.23.1/css-loader!./~/.npminstall/postcss-loader/1.1.1/postcss-loader!./~/.npminstall/less-loader/2.2.3/less-loader' ) }, function(module,exports,__webpack_require__){ eval( ... //# sourceURL=webpack:///./src/tmpl/appTemplate.tpl?" ) }, ...])
eval
有最好的性能,可是它只映射到每一個模塊源碼文件,沒有行列信息。css
打包代碼同時建立一個新的 sourcemap 文件, 並在打包文件的末尾添加 //# sourceURL
註釋行告訴 JS 引擎文件在哪兒java
webpackJsonp([1],[ function(e,t,i){...}, function(e,t,i){...}, function(e,t,i){...}, function(e,t,i){...}, ... ]) //# sourceMappingURL=index.js.map
source-map 不能爲模塊和須要從新生成的代碼塊緩存SourceMaps,它適用於生產環境。webpack
爲每個文件添加 sourcemap 的 DataUrl,注意這裏的文件是打包前的每個文件而不是最後打包出來的,同時這個 DataUrl 是包含一個文件完整 souremap 信息的 Base64 格式化後的字符串,而不是一個 urlgit
webpackJsonp([1],[ function(e,t,i){...}, function(e,t,i){...}, function(e,t,i){...}, function(e,t,i){...}, ... ]) //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9...
能夠看到末尾的註釋 sourceMap 做爲 DataURL 的形式被內嵌進了 bundle 中,因爲 sourceMap 的全部信息都被加到了 bundle 中,整個 bundle 文件變得碩大無比。github
這個就是把 eval
的 sourceURL 換成了完整 souremap 信息的 DataUrlweb
webpackJsonp([1],[ function(module,exports,__webpack_require__){ eval( ... //# sourceMappingURL=data:application/json;charset=utf-8;base64,... ) }, function(module,exports,__webpack_require__){ eval( ... //# sourceMappingURL=data:application/json;charset=utf-8;base64,... ) }, function(module,exports,__webpack_require__){ eval( ... //# sourceMappingURL=data:application/json;charset=utf-8;base64,... ) }, ... ]);
結合了eval和source-map的特色,eval將每一個模塊包起來,而且最後添加source-map的base64信息,能夠知道行列,能夠爲模塊緩存它能夠更快的重建SourceMaps。chrome
不包含列信息,不包含 loader 的 sourcemap,(譬如 babel 的 sourcemap)npm
不包含行信息,會減少map大小,不支持loader的sourcemap,好比從jsx映射到js,最終你只能訪問到js文件,看不了源碼的jsx文件。json
不包含列信息,同時 loader 的 sourcemap 也被簡化爲只包含對應行的。最終的 sourcemap 只有一份,它是 webpack 對 loader 生成的 sourcemap 進行簡化,而後再次生成的。
相較於cheap-source-map,能夠支持loader的sourcemap
和 source-map 同樣,但不會在 bundle 末尾追加註釋.
webpackJsonp([1],[ function(e,t,i){...}, function(e,t,i){...}, function(e,t,i){...}, function(e,t,i){...}, ... ])
與 source-map 相比少了末尾的註釋,但 output 目錄下的 index.js.map
沒有少
注1:webpack 不只支持這 7 種,並且它們仍是能夠任意組合上面的 eval、inline、hidden 關鍵字,就如文檔所說,你能夠設置 souremap 選項爲 cheap-module-inline-source-map。
注2:若是你的 modules 裏面已經包含了 SourceMaps ,你須要用 source-map-loader來和合並生成一個新的 SourceMaps
github上關於調試的問題:Source Maps don't work on Chrome
chrome裏可否調試源碼 x:不行 o:能夠
eval-source-map x(刷新斷點被忽略)
cheap-source-map x(不是源碼)
cheap-module-eval-source-map x(刷新斷點被忽略)
cheap-module-source-map x(斷點位置不對)
source-map o
inline-source-map o
eval: 更快
inline:內聯
cheap:不含列信息,不支持loader sourcemap(譬如 babel 的 sourcemap,從jsx到js的映射)
cheap-module:不含列信息,支持loader sourcemap
source-map:包含行列信息,支持loader sourcemap