webpack之devtool详解


Posted in Javascript onFebruary 10, 2018

关于Devtool

该选项控制是否以及如何生成源映射。官网上给出的可选值有:

webpack之devtool详解

其中一些值适合开发,一些用于生产。对于开发,您通常需要快速的Source Maps,以bundle的大小为代价,但是对于生产,您需要独立的Source Maps,这是精确的,并且支持最小化。

选择一种源映射样式,以增强调试过程。这些值可以显著地影响构建和重建速度。而不是使用devtool选项还可以使用SourceMapDevToolPlugin / EvalSourceMapDevToolPlugin直接有了更多的选择。不要同时使用devtool选项和插件。devtool选项在内部添加了插件,所以你最终会得到应用两次的插件。

实例详解

1.新建print.js

export default function printMe() {
 console.log('武昌鱼@222');
}

2.新建index.js

import printMe from './print.js';
function component() {
 var element = document.createElement('div');
 var btn = document.createElement('button');
 btn.innerHTML = 'Click 1me and check 1the console!';
 btn.onclick = printMe;
 element.appendChild(btn);
 return element;
}
document.body.appendChild(component());

3.新建webpack.config.js

const path = require('path');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
 entry: './src/index.js',
 output: {
  filename: '[name].js',
  path: path.resolve(__dirname, 'dist')
 },
 plugins: [
  new CleanWebpackPlugin(['dist']),
  new HtmlWebpackPlugin({
   title: ' webpack之devtool'
  })
 ]
};

4.使用不同的devtool选项

 none

打包后点击打印按钮,console显示main.js:96,生成代码如下所示:

webpack之devtool详解webpack之devtool详解

eval

eval 模式会把每个 module 封装到 eval 里包裹起来执行,并且会在末尾追加注释。

Each module is executed withevaland//@ sourceURL.

打包之后点击打印按钮,console显示print.js:3,生成代码如下所示:

webpack之devtool详解webpack之devtool详解

source-map

打包之后你会发现你的 output 目录下多了一个 index.js.map 文件,此文件记录了sourceMap 行列信息如何映射源代码的信息。点击打印按钮,console显示print.js:3,生成代码如下所示:

webpack之devtool详解

main.js

webpack之devtool详解

main.js.map

hidden-source-map

打包后main.js与 source-map 选项相比少了末尾注释,但 output 目录下的 index.js.map 没有少。点击打印按钮,console显示main.js:96。

inline-source-map

打包后可以看到末尾的注释 sourceMap 作为 DataURL 的形式被内嵌进了 bundle中,由于 sourceMap 的所有信息都被加到了bundle中,整个 bundle 文件变得硕大无比。点击打印按钮,console显示print.js:3,生成代码如下所示:

webpack之devtool详解

main.js

eval-source-map

和 eval 类似,但是把注释里的 sourceMap 都转为了 DataURL。console显示print.js?dc38:2,生成代码如下所示:

webpack之devtool详解

main.js

cheap-source-map

和 source-map 生成结果差不多。output 目录下的index.js内容一样。但是 cheap-source-map 生成的 index.js.map 的内容却比 source-map 生成的 index.js.map 要少很多代码,我们对比一下上文 source-map 生成的 index.js.map 的结果,发现 source 属性里面少了列信息,如下所示:

webpack之devtool详解

main.js.map

cheap-module-source-map

在一个单独的文件中生成一个不带列映射的map,不带列映射提高了打包速度,但是也使得浏览器开发者工具只能对应到具体的行,不能对应到具体的列(符号),会对调试造成不便;

总结

 开发环境推荐使用:

1.eval :每个模块使用eval()和//@ sourceURL执行。这是非常快。主要缺点是,它没有正确显示行号,因为它被映射到转换代码而不是原始代码(没有来自加载器的源映射)。

2.eval-source-map:每个模块使用eval()执行,而SourceMap作为DataUrl添加到eval()中。最初它是缓慢的,但是它提供快速的重建速度和产生真实的文件。行号被正确映射,因为它被映射到原始代码。它产生了最优质的开发资源。

3.cheap-eval-source-map:与eval-source-map类似,每个模块都使用eval()执行。它没有列映射,它只映射行号。它忽略了来自加载器的源代码,并且只显示与eval devtool相似的经过转换的代码。

4.cheap-module-eval-source-map:类似于cheap-eval-source-map,在本例中,来自加载器的源映射被处理以获得更好的结果。然而,加载器源映射被简化为每一行的单个映射。

生产环境推荐使用:

1.(none) :(省略devtool选项)-不触发SourceMap。这是一个很好的选择。

2.source-map:一个完整的SourceMap是作为一个单独的文件。它为bundle 添加了引用注释,因此开发工具知道在哪里找到它。

3.hidden-source-map:与source-map相同,但不向bundle 添加引用注释。如果您只希望SourceMaps从错误报告中映射错误堆栈跟踪,但不想为浏览器开发工具暴露您的SourceMap,可以使用此选项。

4.nosources-source-map:一个SourceMap是在没有源代码的情况下创建的。它可以用于在客户机上映射堆栈跟踪,而不暴露所有源代码。您可以将源映射文件部署到webserver。

Javascript 相关文章推荐
JS中批量给元素绑定事件过程中的相关问题使用闭包解决
Apr 15 Javascript
JavaScript中的单引号和双引号报错的解决方法
Sep 01 Javascript
一个检测表单数据的JavaScript实例
Oct 31 Javascript
JavaScript生成随机数的4种自定义函数分享
Feb 28 Javascript
JS实现设置ff与ie元素绝对位置的方法
Mar 08 Javascript
angular+ionic 的app上拉加载更新数据实现方法
Jan 16 Javascript
JS出现失效的情况总结
Jan 20 Javascript
浅谈Express异步进化史
Sep 09 Javascript
用最少的JS代码写出贪吃蛇游戏
Jan 12 Javascript
Angular通过指令动态添加组件问题
Jul 09 Javascript
部署vue+Springboot前后端分离项目的步骤实现
May 31 Javascript
在实例中重学JavaScript事件循环
Dec 03 Javascript
React组件refs的使用详解
Feb 09 #Javascript
详解vue-cli项目中的proxyTable跨域问题小结
Feb 09 #Javascript
使用express搭建一个简单的查询服务器的方法
Feb 09 #Javascript
js自定义trim函数实现删除两端空格功能
Feb 09 #Javascript
JavaScript运行原理分析
Feb 09 #Javascript
vue 全选与反选的实现方法(无Bug 新手看过来)
Feb 09 #Javascript
详解如何在项目中使用jest测试react native组件
Feb 09 #Javascript
You might like
php Rename 更改文件、文件夹名称
2011/05/24 PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
2013/05/23 PHP
codeigniter教程之多文件上传使用示例
2014/02/11 PHP
PHP与MYSQL中UTF8编码的中文排序实例
2014/10/21 PHP
PHP实现对数字分隔加千分号的方法
2019/03/18 PHP
javascript 学习之旅 (2)
2009/02/05 Javascript
JS页面延迟执行一些方法(整理)
2013/11/11 Javascript
jquery ztree异步搜索(搜叶子)实践
2016/02/25 Javascript
JavaScript中对JSON对象的基本操作示例
2016/05/21 Javascript
JavaScript第一篇之实现按钮全选、功能
2016/08/21 Javascript
给Easyui-Datebox设置隐藏或者不可用的解决方法
2017/05/26 Javascript
Vue实现textarea固定输入行数与添加下划线样式的思路详解
2018/06/28 Javascript
微信小程序适配iphoneX的实现方法
2018/09/18 Javascript
原生javascript制作的拼图游戏实现方法详解
2020/02/23 Javascript
[02:10]2018DOTA2亚洲邀请赛赛前采访-Liquid
2018/04/03 DOTA
Python中删除文件的程序代码
2011/03/13 Python
从局部变量和全局变量开始全面解析Python中变量的作用域
2016/06/16 Python
python3.7.0的安装步骤
2018/08/27 Python
深入浅析Python2.x和3.x版本的主要区别
2018/11/30 Python
Python给定一个句子倒序输出单词以及字母的方法
2018/12/20 Python
Python面向对象总结及类与正则表达式详解
2019/04/18 Python
深入学习python多线程与GIL
2019/08/26 Python
用CSS3打造HTML5的Logo(实现代码)
2016/06/16 HTML / CSS
ECCO爱步加拿大官网:北欧丹麦鞋履及皮具品牌
2017/07/08 全球购物
中科软笔试题和面试题
2014/10/07 面试题
护理自我鉴定范文
2013/10/06 职场文书
警察思想汇报
2014/01/04 职场文书
租赁协议书范本
2014/04/22 职场文书
2014年廉洁自律承诺书
2014/05/26 职场文书
少先队活动总结
2014/08/29 职场文书
九一八事变纪念日演讲稿
2014/09/14 职场文书
2014派出所所长群众路线对照检查材料思想汇报
2014/09/18 职场文书
2014年销售人员工作总结
2014/11/27 职场文书
小学庆六一主持词
2015/06/30 职场文书
《包身工》教学反思
2016/02/23 职场文书
青年岗位能手事迹材料(2016推荐版)
2016/03/01 职场文书