webpack4322系列教程03-devtool

5次阅读

共计 2156 个字符,预计需要花费 6 分钟才能阅读完成。

简介

​ devtool 选项用于控制是否需要生成 source map,以及如何生成 source map。源码地址

什么是 source map?

​ source map 一个存储源代码与编译代码对应位置的映射信息文件,它是专门给调试器准备的,它主要用于 debug,目前我所知的只有 Google Dev Tools 和 Fire Fox Debugger 支持 source map。

​ Google Dev Tools 可以通过以下方式打开 JavaScript 的 source map 和 CSS 的 source map:

​ source map 主要用于将压缩混淆后的 JavaScript 代码和 CSS 代码映射到源码中,方便 debug 调试。更多关于 source map 的知识,大家可以参考阮一峰大神的文章:JavaScript Source Map 详解

演示

​ 最新的 webpack 官网中一共有 13 种 devtool 可选模式,不同的模式打包输出的代码和 source map 以及构建的速度都不一样,下面我演示几种比较常用的 devtool 模式。

eval

​ 表示把每一个模块文件都转换为字符串,并且在每一个模块代码的尾部添加 //# sourceURL=webpack:/// 文件名.js,并使用 eval 执行。

1、编写入口文件和依赖代码

2、编写 webpack 配置 & 启动 webpack

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 运行结果

打包输出的 main.js 文件

​ 从打包出来的 main.js 文件中我们可以发现 index.js 文件和 role.js 文件的所有代码都被转换成了字符串,使用 eval 进行执行,代码的最后面都加上了 //# sourceURL 指向原始文件的位置,这种模式并不会输出 map 文件。

浏览器运行结果:

​ 从浏览器的运行结果中,左侧多了一个 webpack://,其实这个就是 //# sourceURL 设置值,如果我们在代码中修改了这个名字,那么浏览器就会显示的是另外一个名字,如果删除它,那么它的源码映射就会消失。而且它映射到的每一个源文件的头部都会加上一段 webpack 的代码,这对于我们来说并不友好,这种模式我使用的频率相当少。

cheap-module-source-map

​ 没有列映射的 source map,同时 loader 的 source map 也会被简化为每行一个映射,这个配置比较适合在开发环境使用,react 脚手架开发模式下也是使用这个配置。

1、安装 css-loader

npm i -D css-loader

2、修改 webpack 配置

3、创建 main.css 文件

body {
    background-color: greenyellow;
    color: red;
}

4、src/index.js 导入 main.css

5、运行 webpack

source-map

​ source-map 适合在生产环境中使用,它会生成一个源代码对应的.map 文件,这个文件描述的打包后的代码和源代码的映射关系。代码上线时不能把这个文件上传到线上服务器,可以把它上传到一个只可以内网访问服务器上,这样只要你是在公司内网环境内就可以很方便的进行线上问题定位。

1、将 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 源码映射文件

2、将 main.js.map 文件上传到内网服务器

3、修改 sourceMappingURL 映射文件的路径

4、在浏览器中运行 webpack 打包出来的 main.js 文件

已经成功的跟源码建立了映射,如果此时我把内网的服务器关掉,看看会发生什么事情?

可以发现如果内网服务器关闭了,Google Dev Tools 就找不到 main.js.map 映射文件了,此时浏览器就没有源码映射了,但是也不会报错。

总结

​ 可以使用 SourceMapDevToolPlugin 插件进行更细粒度的配置。通过 source-map-loader 来处理已有的 source map。

​ source-map:在生产环境使用

​ cheap-module-source-map:在开发环境使用

​ 这是官网上所有 devtool 的配置说明,感兴趣的同学可以对每个选项进行尝试。

正文完
 0