title |
---|
Webpack 带来的极致开发体验 |
上面一讲中提出过一个问题:
刚才我们每次编写一次代码,就要
npm run build
一次,或者说是打包一次,岂不是很麻烦,有没有自动检测文件变化,然后自动打包的?
今天我们就来学习使用 webpack 监听模式
我们继续使用之前的测试项目 webpack-test
在 package.json 里面添加一条 script
// package.json
"script": {
// ...
"watch": "webpack --watch"
}
然后运行 npm run watch
, 你会发现,在命令打包的进程在执行完一次打包之后没有结束,和之前的稍微有点儿区别。
修改测试代码, 在main.js 里面再添加一条语句
// main.js
import './js/b';
alert(123);
这个时候按一下保存按钮,会发现命令行再次进行了一个打包。通过浏览器刷新可以验证,浏览器已经加载到了最新的代码。
第一种方法是通过 CLI 来开启了 监听模式,另外一种就是直接在我们的配置中添加一条属性。
修改webpack.config.js 文件,在最后添加一条:
// webpack.config.js
module.exports = {
//...
watch: true
}
然后运行 npm run build
,也可以达到相同的效果。自己尝试一下。
嗯,自动打包已经实现了
上面的监听模式固然方便可用,每次文件变化都会进行打包,生成一个打包后的文件。
但是,当项目变得超级复杂,以来非常多,最终打包的文件比较大的时候,打包进行会变的非常缓慢,缓慢的一个重要原因是 webpack 进程花了大量的时间来读取以来文件以及写目标文件。这个时候 devServer 的概念就出现了。
devServer 可以把以来缓存在内存中,把打包后的文件也缓存在内存中,当通过浏览器加载目标代码的时候,会直接从内存中读取返回给浏览器。速度上有较大的提升。同时也带来了一定的问题,比较占用内存。
顺便来回顾之前的一个问题:
打包完成之后要验证代码,要手动刷新浏览器,有没有更好的办法?
我们下面就来解决这个开发体验问题。
在使用 devServer 之前,我们需要在项目中安装 webpack-dev-server
包:
npm i -D webpack-dev-server
webpack-dev-server
包在运行之后会为你提供一下非常简单的 web server ,用来为浏览器提供静态资源的服务。
修改 webpack 的配置文件 webpack.config.js , 把 watch 项去掉,在最后面添加 devServer 参数。
// webpack.config.js
module.exports = {
// ...
devServer: {
contentBase: './dist' // 告诉webpack-dev-server 你打包之后的文件在什么地方。
}
}
修改 package.json ,添加启动 webpack-dev-server 的 npm 脚本。
// package.json
"script": {
// ...
"devServer": "webpack-dev-server"
}
然后终端运行 npm run devServer
,编译成功之后,终端会有这样的几行提示:
➜ webpack-test npm run devServer
> [email protected] devServer /Users/Ben/Work/webpack-test
> webpack-dev-server
Project is running at http://localhost:8080/
webpack output is served from /
Content not from webpack is served from ./dist
...
提示告诉我们:项目运行在 http://localhost:8080/ 这个端口下,webpack 的输出文件可以通过如上端口的根目录去访问。
还记得我们之前配置的输出文件叫做 main.bundle.js
,那么按道理我们就应该可以通过 http://localhost:8080/main.bundle.js
访问到这个文件。打开浏览器验证一下。
既然我们可以通过这个URL访问到我们打包之后的文件,那么我们是不是就可以把 html 里面 script 的 src 执行这个地址呢?
修改html 文件,修改 script 的 src指向
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script type="text/javascript" src="http://localhost:8080/main.bundle.js"></script>
</body>
</html>
然后预览这张 html ,验证是否能成功。
改变文件,自动打包,自动刷新
验证能够成功加载到打包后的文件之后,尝试修改我们的源码。通过终端可以发现,当我们保存文件时,会自动打包。而且!!!而且!!!我们没有手动去刷新浏览器,浏览器就已经自动刷新运行了我们最新的代码。
尝试一下。
没有实体文件产生
我们刚才说,devServer 会把打包后的文件保存在内存中,不会产生实体文件,到底是不是这样子的?我们来验证一下。
1、通过 Ctrl + C
杀掉之前的 webpack-dev-server
进程。
2、删除已有的 ./dist
下的打包文件。
3、再次通过 npm run devServer
来开启 webpack-dev-server
进程。
然后多次去修改文件,终端显示已经打包,并且浏览器也能预览到最新的代码,但是,,始终没有在 ./dist
文件夹下看到打包后的目标文件。所以它为我们提供了非常好的开发体验。
- watch 可以监听文件变化自动打包,每次都重新生产目标文件。
- 可以通过 CLI 和 configuration 两种方式来启动 watch 模式。
- 通过 webpack-dev-server 包,启动 devServer 模式,动态打包,浏览器自动刷新。文件保存在内存,速度快。
- webpack 是如何监听文件变化的?
- webpack-dev-server 如何在内存中报错打包内容的?