监听源代码的变化
如何开启watch呢?两种方式
缺点:
webpack-dev-server 在编译之后不会写入到任何输出文件。而是将 bundle 文件保留在内存中。事实上webpack-dev-server使用了一个库叫memfs。
webpack-dev-middleware 是一个封装器(wrapper),它可以把 webpack 处理过的文件发送到一个 server。
const express = require('express');
const webpack = require('webpack');
const webpackDevMiddleware = require('webpack-dev-middleware');
const app = express();
const config = require("./webpack.config");
// 传入配置信息, webpack根据配置信息进行编译
const compiler = webpack(config);
const middleware = webpackDevMiddleware(compiler);
app.use(middleware);
app.listen(3000, () => {
console.log("服务已经开启在3000端口上~");
});
模块热替换是指在应用程序运行过程中,替换、添加、删除模块,而无需重新刷新整个页面;
HMR通过如下几种方式,来提高开发的速度:
开启HMR
devServer: {
hot: true,
},
但是你会发现,当我们修改了某一个模块的代码时,依然是刷新的整个页面:
这是因为我们需要去指定哪些模块发生更新时,进行HMR;
//index.js
if (module.hot) {
module.hot.accept("./math.js", () => {
console.log("math模块发生了更新~");
});
}
Vue的HMR
Vue的加载我们需要使用vue-loader,而vue-loader加载的组件默认会帮助我们进行HMR的处理
安装加载vue所需要的依赖:npm install vue-loader vue-template-compiler -D
const VueLoaderPlugin = require('vue-loader/lib/plugin')
rules:{
test: /\.vue$/i,
use: 'vue-loader',
},
plugins: [
new HtmlWebpackPlugin({
template: './index.html',
}),
//new ReactRefreshWebpackPlugin(),
new VueLoaderPlugin(),
],
那么HMR的原理是什么呢?如何可以做到只更新一个模块中的内容呢?
HMR Socket Server,是一个socket的长连接:
output中的path的作用是告知webpack之后的输出目录
output中还有一个publicPath属性,该属性是指定index.html文件打包引用的一个基本路径
devServer中也有一个publicPath的属性,该属性是指定本地服务所在的文件夹
devServer中contentBase对于我们直接访问打包后的资源其实并没有太大的作用,它的主要作用是如果我们打包后的资源,又依赖于其他的一些资源,那么就需要指定从哪里来查找这个内容:
比如在index.html中,我们需要依赖一个 abc.js 文件,这个文件我们存放在 public文件 中;
在index.html中,我们应该如何去引入这个文件呢
比如代码是这样的:
<script src="./public/abc.js">script>
但是这样打包后浏览器是无法通过相对路径去找到这个文件夹的;
所以代码是这样的:
;
但是我们如何让它去查找到这个文件的存在呢? 设置contentBase即可
当然在devServer中还有一个可以监听contentBase发生变化后重新编译的一个属性:watchContentBase。添加之后才会刷新,否则修改静态资源不会被刷新。
hotOnly是当代码编译失败时,是否刷新整个页面
host设置主机地址
localhost 和 0.0.0.0 的区别
port设置监听的端口,默认情况下是8080
open是否打开浏览器
compress是否为静态文件开启gzip compression
devServer: {
hot: true,
hotOnly: true,
// host: "0.0.0.0",
// port: 7777,
// open: true,
compress: true,
contentBase: path.resolve(__dirname, "./why"),
watchContentBase: true,
// publicPath: "/abc"
},
devServer: {
hot: true,
hotOnly: true,
// host: "0.0.0.0",
// port: 7777,
// open: true,
compress: true,
contentBase: path.resolve(__dirname, "./yihua"),
watchContentBase: true,
// publicPath: "/abc",
proxy: {
"/api-yihua": {
target: "http://localhost:8888",
pathRewrite: {
"^/api-yihua": ""
},
secure: false,
changeOrigin: true
}
},