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 相关文章推荐
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
Mar 28 Javascript
javascript真的不难-回顾一下基础知识
Jan 15 Javascript
把字符串按照特定的字母顺序进行排序的js代码
Jan 28 Javascript
jQuery实现单击按钮遮罩弹出对话框(仿天猫的删除对话框)
Apr 10 Javascript
js实现遮罩层划出效果是生成div而不是显示
Jul 29 Javascript
jQuery事件绑定方法学习总结(推荐)
Nov 21 Javascript
微信小程序(三):网络请求
Jan 13 Javascript
Angular.js中ng-if、ng-show和ng-hide的区别介绍
Jan 20 Javascript
angular实现图片懒加载实例代码
Jun 08 Javascript
Javascript实现运算符重载详解
Apr 07 Javascript
Vue.js中使用Vuex实现组件数据共享案例
Jul 31 Javascript
理解JavaScript中的对象
Aug 25 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
Session服务器配置指南与使用经验的深入解析
2013/06/17 PHP
php实现上传图片保存到数据库的方法
2015/02/11 PHP
php编程每天必学之表单验证
2016/03/01 PHP
php使用正则表达式获取字符串中的URL
2016/12/29 PHP
thinkphp3.2实现在线留言提交验证码功能
2017/07/19 PHP
php利用ZipArchive类操作文件的实例
2020/01/21 PHP
jQuery 表单验证扩展(四)
2010/10/20 Javascript
Jquery.addClass始终无效原因分析
2013/09/08 Javascript
node.js中的console.info方法使用说明
2014/12/09 Javascript
js控制网页背景音乐播放与停止的方法
2015/02/06 Javascript
JavaScript encodeURI 和encodeURIComponent
2015/12/04 Javascript
jquery对所有input type=text的控件赋值实现方法
2016/12/02 Javascript
Vue.js 2.0中select级联下拉框实例
2017/03/06 Javascript
Angular多选、全选、批量选择操作实例代码
2017/03/10 Javascript
Express使用html模板的详细代码
2017/09/18 Javascript
详解angularjs实现echart图表效果最简洁教程
2017/11/29 Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
2019/02/12 Javascript
vue通过video.js解决m3u8视频播放格式的方法
2019/07/30 Javascript
JavaScript运行机制实例分析
2020/04/11 Javascript
vue页面引入three.js实现3d动画场景操作
2020/08/10 Javascript
bpython 功能强大的Python shell
2016/02/16 Python
Python制作exe文件简单流程
2019/01/24 Python
python3爬虫学习之数据存储txt的案例详解
2019/04/24 Python
python计算无向图节点度的实例代码
2019/11/22 Python
如何打包Python Web项目实现免安装一键启动的方法
2020/05/21 Python
Django微信小程序后台开发教程的实现
2020/06/03 Python
什么是python类属性
2020/06/10 Python
Keras自动下载的数据集/模型存放位置介绍
2020/06/19 Python
python使用Word2Vec进行情感分析解析
2020/07/31 Python
Max&Co官网:意大利年轻女性时尚品牌
2017/05/16 全球购物
伦敦所有西区剧院演出官方票务代理:Theatre Tickets Direct
2017/05/26 全球购物
都柏林通行卡/城市通票:The Dublin Pass
2020/02/16 全球购物
如何掌握自荐信格式呢
2013/11/19 职场文书
推广普通话的宣传语
2015/07/13 职场文书
小学运动会入场词
2015/07/18 职场文书
2016幼儿园毕业感言
2015/12/08 职场文书