分享

webpack教程七:source map

 小小小舟 2019-12-09

目录

一、source map简介

二、使用source map


一、source map简介

    现在先让我们清理原先的src文件夹,只留下index.js和template.html:

    并且修改index.js:

    index.js:

consele.log('hello world!');

    很明显这是一个错误语句,因为console写成了consele。

    再修改webpack.config.js让项目只有一个入口文件:

    webpack.config.js:  

  1. const path = require('path');
  2. const HtmlWebpackPlugin = require('html-webpack-plugin'); // 导入HtmlWebpackPlugin
  3. const CleanWebpackPlugin = require('clean-webpack-plugin'); // 导入CleanWebpackPlugin
  4. module.exports = {
  5. mode: 'development',
  6. devtool: 'none',
  7. entry: {
  8. main: './src/index.js',
  9. },
  10. output: {
  11. filename: '[name].js',
  12. path: path.resolve(__dirname, 'dist')
  13. },
  14. module: {
  15. rules: [
  16. {
  17. test: /\.(png|svg|jpg|gif$)/, // 文件后缀名匹配通配符
  18. use: [{
  19. loader: 'url-loader', // 使用的loader
  20. options: {
  21. limit: 10240 // 当图片小于10kb时,使用base64的方式进行打包
  22. }
  23. }]
  24. },
  25. {
  26. test: /\.scss$/,
  27. use: [
  28. 'style-loader',
  29. {
  30. loader: 'css-loader',
  31. options: {
  32. importLoaders: 2
  33. }
  34. },
  35. 'sass-loader',
  36. 'postcss-loader'
  37. ]
  38. },
  39. {
  40. test: /\.(woff|woff2|eot|ttf)$/,
  41. use: [
  42. 'file-loader'
  43. ]
  44. }
  45. ]
  46. },
  47. plugins: [
  48. new HtmlWebpackPlugin({
  49. filename: 'dist.html', // 将自动生成的html文件的文件名改为dist.html
  50. template: './src/template.html' // 模板
  51. }),
  52. new CleanWebpackPlugin()
  53. ]
  54. };

    注意上面的devtool: 'none',这是将source map功能关闭,因为development模式下会默认开启source map功能。   

    现在进行打包操作:

    打包成功,然后用浏览器打开dist.html,并打开控制台:

    我们可以发现控制台的错误信息中,只含有错误在出口文件中的位置信息,却没有错误在源代码中(index.js)的位置信息。

    当webpack打包源代码时,可能会很难追踪到错误和警告在源代码中的原始位置。例如,在本例中,将index.js打包到一个main.js中,而index.js中包含一个错误,那么堆栈跟踪就会简单地指向到main.js。这通常并没有太多帮助,因为我们可能需要准确地知道错误来自于哪个源文件。

    为了更容易地追踪错误和警告,webpack提供了source map功能,将编译后的代码映射会原始源代码。如果错误来自于index.js,source map就会明确的告诉你。

二、使用source map

    在上面我们在webpack.config.js中设置devtool: 'none'来关闭source map功能,那怎么开启source map功能呢?

    其实devtool属性可以接受以下值:

    不同的值会明显影响到构建(build)和重新构建(rebuild)的速度。

    其中一些值适用于开发环境,一些适用于生产环境。对于开发环境,通常希望更快速的source map,需要添加到bundle中以增加体积为代价,但是对于生产环境,则希望更精准的source map,需要从bundle中分离并独立存在。

   下面让我们来一一探索这些值的不同效果:

    ①souece-map

    将webpack.config.js中的devtool修改为devtool: 'source-map',然后进行打包:

    生成了一个main.js.map文件,其实这个文件里面就包含了错误信息的映射关系。

    我这里用谷歌浏览器打开显示不出准确错误信息,还没找到原因,这一部分先放着吧。

    ②inline-source-map

    将webpack.config.js中的devtool修改为devtool:'inline-source-map',然后进行打包:

    这次没有生成main.js.map文件,那么使用浏览器打开dist.html:

    可以发现控制台仍然打印了错误位置的详细信息,也就是定位了错误信息在index.js文件,而不是在main.js。

    那么原先是通过main.js.map这个文件实现了映射关系,那么现在没有生成main.js.map文件,那么映射功能是如何实现的呢?

    打开main.js文件,可以发现这么一部分内容:

    原来,wepback将映射关系以Base64的形式放在main.js中!

    ③cheap-inline-source-map

    将webpack.config.js中的devtool修改为devtool: 'cheap-inline-source-map',然后进行打包:

    使用浏览器打开dist.html:

    貌似跟之前的配置的效果没什么区别。

    在代码量很大的项目中,如果devtool中没有加入cheap关键字(这些cheap、inline等关键字都可以自由组合),则错误信息会精确到哪一行哪一列发生错误,但是这样打包耗费的时间肯定比较长。而加入了cheap关键字(例如这里的cheap-inline-source-map),则错误信息只会定位到哪一行,打包时间就会相对短一些。

    另外,cheap-inline-source-map的配置使得webpack只负责映射业务代码的错误信息,而不管第三方模块,所以会定位不到第三方模块的错误位置。

    ④cheap-module-souce-map

    将webpack.config.js中的devtool修改为devtool:'cheap-module-souce-map',则webpack不仅负责映射业务代码的错误信息,也映射第三方模块的错误信息。

    ⑤eval

    将webpack.config.js中的devtool修改为devtool:'eval',然后进行打包操作,然后打开main.js,可以发现这一部分代码:

    这种配置情况下,webpack会借助eval()方法构建映射关系,而且构建速度是所有devtool选项种最快的。

    但是因为构建速度快,提示的的内容可能并不全面。

    ⑥cheap-module-eval-souce-map(开发模式下的最佳选择)

    前面提到多mode:'devlopment'情况下,会默认开启souce map功能,这是一个不错的选择。

    但是综合构建速度、错误信息的质量等因素,最佳的选择应该是devtool: 'cheap-module-eval-souce-map'

    ⑦cheap-module-souce-map(生产环境下的最佳选择)

    这个选项与前面的开发模式的最佳选择的差异是没有eval关键字,所以错误信息构建速度将会更慢,但是错误信息将会更完备,更容易定位到错误代码位置。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多