了解Webpack Source Map配置与实践

1,844 阅读3分钟

        Source Map是浏览器对于混淆压缩代码与源码之间做转换的技术,方便开发者调试的。浏览器默认是不加载的Source Map文件的,只有在浏览器弹出调试控制台的时候才会加载。所以线上要使用单独的.map文件存储Source Map,才能保证页面性能。(后边会讲到具体的配置方式)。

       Webpack的Source Map可以通过配置项devtools配置。也可以通过webpack自带的SourceMapDevToolPlugin来处理一些特殊的情况。

      sourcemap的配置项

  1. eval:生成代码 每个模块都被eval执行,并且存在@sourceURL。

  2. cheap-eval-source-map:在eval的基础上,包含一个使用base64编码的代码作为DataUrl。

  3. cheap-module-eval-source-map:比cheap-eval-source-map包含了loader生成Source Map。

  4. eval-source-map:原始代码 同样道理,但是最高的质量和最低的性能。

  5. cheap-source-map:生成没有列号的Soure Map文件。

  6. cheap-module-source-map:生成包含loader的Source Map。

  7. source-map:质量最高,最完整的Source Map,但是生成速度也是最慢的。

看上去有很多个选项,实际上是单项的组合,单项具体意思如下:

eval:生成代码 每个模块都被eval执行

cheap:生成Source Map 不包含列的信息,也不包含loader的Source Map信息。

module:生成的Source Map包含loader的信息。

source-map:生成最完整,最高质量的Source Map,并产生.map文件。

inline:将.map文件昨晚DataUrl嵌入,不单独生成.map文件(配置比较少见)

实践

eval:如果把webpack的devtool配置成eval,每一个模块被包裹在了eval函数中。

source-map:当把配置项eval替换成为了source-map时,相应位置中的eval消失了。eval部分变成了匿名函数了。

在文件最后还增加了.map文件的引用(线上该位置应该是一个完整的地址)。去构建目录中观察发现对应的.map文件时已经生成。

eval-source-map:接着将eval与source-map一起使用,比eval模式多了sourceMappingURL。sourceMappingURL的内容是将生成的Source Map使用base64进行编码后的内容。

cheap-eval-source-map:接下来在浏览器中看加入了cheap模式的结果

源码:

<template>  
<div class="page"> 
 </div>
</template>
<script>
console.log(123123);
export default {  
  components: {    
  // TypeTableColumn,  
  },  
  name: "component-test",  
  data() {    
   return {      
      text: "测试1",    
   };  
  },  
  created() {  
  },  
  methods: {    
    async counter() {  
    },  
  },
};
</script>

不加入cheap:浏览器展示为下图

加入cheap:浏览器展示为

发现加入cheap后vue的template标签中的内容不见了。这是因为cheap在不生成列信息的同时去掉loader生成的Source Map信息。所以丢失了template标签的内容。通过浏览器控制台使用快捷键command + o 输入行列信息定位,由于缺少列信息,是没法跳到指定位置的,跳转演示。如果只输入行信息则是可以跳转的。

由于列信息并不是特别重要,那么既不想要列信息,又想要loader生成的Source Map怎么办哪,这个时候需要module模式,该模式就是让生成的Source Map信息包含loader生成Source Map。

cheap-module-eval-source-map:

加入了module就可以看到完成的源码了。

一些经验

线下开发环境需要能够看到对应的信息,又不是很重视页面性能信息,所以线下使用cheap-module-eval-source-map更好

线上环境由于注重页面性能eval并不高效所以去掉eval,线上使用**cheap-module-source-map更好。**而线上需要source-map可能会被存储在静态资源云上,需要配置公共路径信息。所以webpack往往线上使用SourceMapDevToolPlugin插件进行更为精细的source-map配置。

资料跳转