source map 开发优化工具

什么是 Source map

简单来说 Source map 就是一个存储信息的文件,里面储存着位置信息。

Source map 英文释义:源程序映射。

位置信息:转换后的代码 对应的 转换前的代码 位置映射关系。

有了 Source map,就算线上运行的是转换后的代码,调试工具中也可以直接显示转换前的代码。这极大的方便了我们开发者调试和排错。

Source map 文件介绍

就以上述案例生成的 main.js.map 为例,我们来了解一下,它的内容结构是怎样的。

{
  // version:Source map 的版本,目前为 3。
  "version": 3,

  // file:转换后的文件名。
  "file": "main.js",

  // sourceRoot:转换前的文件所在的目录。如果与转换前的文件在同一目录,该项为空。
  "sourceRoot": "",

  // sources:转换前的文件。该项是一个数组,表示可能存在多个文件合并。
  "sources": ["webpack://app/./main.js"],

  // sourcesContent:原始代码
  "sourcesContent": ["alert('tomato')\r\n"],

  // names:转换前的所有变量名和属性名。
  "names": ["alert"],

  // mappings:记录位置信息的字符串,下文详细介绍。
  "mappings": "AAAAA,MAAM"
}

webpack 中 devtool 的多种配置

查看官方文档,可以了解到,devtools 的配置项可以达到 10-20 种左右的情况。其实并不需要记住那么多情况,本质上是一些配置项的排列组合。

配置项如下:

  1. source-map:生成 sourcemap 文件,可以配置 inline,会以 dataURL 的方式内联,可以配置 hidden,只生成 sourcemap,不和生成的文件关联;
  2. hidden:是否会在打包后文件的末尾增加 sourceURL;
  3. inline:不产生独立的 .map 文件,把 source-map 的内容以 dataURI 的方式追加到目标文件末尾;
  4. eval:浏览器 devtool 支持通过 sourceUrl 来把 eval 的内容单独生成文件,还可以进一步通过 sourceMappingUrl 来映射回源码,webpack 利用这个特性来简化了 sourcemap 的处理,可以直接从模块开始映射,不用从 bundle 级别。
  5. cheap:只映射到源代码的某一行,不精确到列,可以提升 sourcemap 生成速度;
  6. nosources:不生成 sourceContent 内容,可以减小 sourcemap 文件的大小;
  7. module: sourcemap 生成时会关联每一步 loader 生成的 sourcemap,可以映射回最初的源码;

不同的配置之间可以排列组合

eval

eval: 每一个模块都执行eval()过程,并且会追加//@ sourceURL

eval-source-map:每一个模块在执行eval()过程之后,并且会为每一个模块生成sourcemap文件,生成的sourcemap文件通过DataURL的方式添加

eval会将每一个module模块,执行eval,执行后不会生成sourcemap文件,仅仅是在每一个模块后,增加sourceURL来关联模块处理前后的对应关系。举例来说:

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?"
    )
  },
...])

上述是一个指定devtool:eval的压缩后的代码,我们发现压缩后的代码的每一个模块后面都增加了一端包含sourceURL的注释,sourceURL的值是压缩前的代码,这样就通过sourceURL关联了压缩前后的代码,并没有为每一个模块生成相应的sourcemap。

因为不需要生成模块的sourcemap,因此打包的速度很快。

注意!

eval-source-map组合使用是指将.map以DataURL的形式引入到打包好的模块中,类似于inline属性的效果,我们在生产中,使用eval-source-map会使打包后的文件太大 ,因此在生产环境中不会使用eval-source-map。但是因为eval的rebuild速度快,因此我们可以在本地环境中增加eval属性

相关推荐
逐·風3 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
Devil枫3 小时前
Vue 3 单元测试与E2E测试
前端·vue.js·单元测试
尚梦4 小时前
uni-app 封装刘海状态栏(适用小程序, h5, 头条小程序)
前端·小程序·uni-app
GIS程序媛—椰子4 小时前
【Vue 全家桶】6、vue-router 路由(更新中)
前端·vue.js
前端青山5 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
毕业设计制作和分享5 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
清灵xmf7 小时前
在 Vue 中实现与优化轮询技术
前端·javascript·vue·轮询
大佩梨7 小时前
VUE+Vite之环境文件配置及使用环境变量
前端
GDAL7 小时前
npm入门教程1:npm简介
前端·npm·node.js
小白白一枚1118 小时前
css实现div被图片撑开
前端·css