devtool选项用于控制是否须要生成source map,以及如何生成source map。源码地址javascript
source map 一个存储源代码与编译代码对应位置的映射信息文件,它是专门给调试器准备的,它主要用于debug,目前我所知的只有Google Dev Tools 和 Fire Fox Debugger 支持source map。css
Google Dev Tools 能够经过如下方式打开JavaScript的source map 和 CSS的source map:html
source map主要用于将压缩混淆后的JavaScript代码和CSS代码映射到源码中,方便debug调试。更多关于source map的知识,你们能够参考阮一峰大神的文章:JavaScript Source Map 详解java
最新的webpack官网中一共有13种devtool可选模式,不一样的模式打包输出的代码和source map以及构建的速度都不同,下面我演示几种比较经常使用的devtool模式。react
表示把每个模块文件都转换为字符串,而且在每个模块代码的尾部添加 //# sourceURL=webpack:/// 文件名.js,并使用eval执行。webpack
一、编写入口文件和依赖代码git
二、编写webpack配置 & 启动webpackgithub
const webpack = require('webpack'); // 建立编译器对象 const compiler = webpack({ mode: 'development', devtool: 'eval' }); // 启动webpack compiler.run((err, stats) => { if (err) { console.error(err); return; } // 输出编译成功信息 console.log(stats.toString({ colors: true })); });
webpack运行结果:web
打包输出的main.js文件npm
从打包出来的main.js文件中咱们能够发现index.js文件和role.js文件的全部代码都被转换成了字符串,使用eval进行执行,代码的最后面都加上了//# sourceURL 指向原始文件的位置,这种模式并不会输出map文件。
浏览器运行结果:
从浏览器的运行结果中,左侧多了一个webpack://,其实这个就是//# sourceURL设置值,若是咱们在代码中修改了这个名字,那么浏览器就会显示的是另一个名字,若是删除它,那么它的源码映射就会消失。并且它映射到的每个源文件的头部都会加上一段webpack的代码,这对于咱们来讲并不友好,这种模式我使用的频率至关少。
没有列映射的source map,同时loader的source map也会被简化为每行一个映射,这个配置比较适合在开发环境使用,react脚手架开发模式下也是使用这个配置。
一、安装css-loader
npm i -D css-loader
二、修改webpack配置
三、建立main.css文件
body { background-color: greenyellow; color: red; }
四、src/index.js导入main.css
五、运行webpack
source-map 适合在生产环境中使用,它会生成一个源代码对应的.map文件,这个文件描述的打包后的代码和源代码的映射关系。代码上线时不能把这个文件上传到线上服务器,能够把它上传到一个只能够内网访问服务器上,这样只要你是在公司内网环境内就能够很方便的进行线上问题定位。
一、将devtool修改source-map
const webpack = require('webpack'); // 建立编译器对象 const compiler = webpack({ mode: 'development', devtool: 'source-map' }); // 启动webpack compiler.run((err, stats) => { if (err) { console.error(err); return; } // 输出编译成功信息 console.log(stats.toString({ colors: true })); });
运行webpack后,能够看到dist文件夹下会多出一个main.js.map文件,这个就是source map源码映射文件
二、将main.js.map文件上传到内网服务器
三、修改sourceMappingURL映射文件的路径
四、在浏览器中运行webpack打包出来的main.js文件
已经成功的跟源码创建了映射,若是此时我把内网的服务器关掉,看看会发生什么事情?
能够发现若是内网服务器关闭了,Google Dev Tools就找不到main.js.map映射文件了,此时浏览器就没有源码映射了,可是也不会报错。
nosources-source-map会生成一个没有源码的source map映射,仅仅能够用来映射浏览器上的堆栈跟踪,而不会暴露源码,这配置选项也很适用生产环境。例如:当你线上环境的代码若是出问题了,报错信息可以告诉我是在哪一个文件的哪一行出现问题了,可是我又不想把个人源码暴露出去,就可使用这种模式。
第一步:将devtool修改成nosources-source-map
第二步:在role.js文件里制做一个错误
第三步:浏览运行
从运行结果能够发现,报错信息详细的描述了是我哪一个源码文件的第几行报错了,可是浏览器却看不到任何的源码。
同时设置devtool和SourceMapDevToolPlugin插件
运行webpack:
打开打包出来的main.js文件,能够看到会同时设置了两个sourceMappingURL
:
这样会致使source map映射失效:
若是只设置devtool
或者SourceMapDevToolPlugin
其中的一个,那么source map就能够正常运行了。
可使用 SourceMapDevToolPlugin
插件进行更细粒度的配置。经过 source-map-loader
来处理已有的 source map。
⚠️注意:devtool的默认值为false,若是传入的不是webpack的可选参数或者false会致使webpack运行报错
source-map:在生产环境使用,可是必须须要使用SourceMapDevToolPlugin插件进行设置,而且不能使用devtool选项,须要把source-map文件发布一台内网服务器,这样只有开发人员可以看到源码映射,外网的人是没法看到的。
nosources-source-map:在生产环境使用,这个选项只有堆栈的映射跟踪,不会暴露源码,方便错误定位。优势是:不须要创建和部署内网的source map服务器,缺点是:没法直接线上debug源码。
cheap-module-source-map:在开发环境使用
这是官网上全部devtool的配置说明,感兴趣的同窗能够对每一个选项进行尝试。