webpack-dev-server 从入门到实战
古有云:“工欲善其事,必先利其器”。作为一个前端开发,搭建一个便捷的开发环境,将会为我们的开发工作带来极大的效率提升。而Webpack
作为如今前端工程打包必不可少的工具,很多人却不知道从Webpack 4
开始提供的DevServer
功能。
让我们一起来学习下吧!
1 什么是webpack-dev-server
DevServer
是Webpack 3
开放的一个实验功能,使用webpack-dev-middleware
中间件,提供热更新的开发服务器,旨在帮助开发者在开发阶段快速进行环境搭建。
最新Webpack 5
还支持反向代理、防火墙、Socket
、gzip
压缩等功能。
2 反向代理配置
与Nginx
类似,webpack-dev-server
也是通过url正则匹配的方式进行url代理配置,常用配置参考如下代码:
{
"/rest/": {
"target": "http://127.0.0.1:8080",
"secure": false
}
}
还可以通过用JavaScript
定义此配置,把多个条目代理到同一个目标。将代理配置文件设置为proxy.conf.js
(代替proxy.conf.json
),并指定如下例子中的配置文件。
module.exports = {
//...
devServer: {
proxy: [
{
context: ['/auth', '/api'],
target: 'http://localhost:3000',
},
],
},
};
2.1 基本配置项介绍
proxy
:devServer
代理配置/api
: 表示需要代理的请求urltarget
:反向代理的地址pathRewrite
:请求地址重写,类似Nginx
的Rewite
功能
其他写法参考:
"pathRewrite": {
"^/old/api": "/new/api"
}
// remove path
pathRewrite: {
'^/remove/api': ''
}
// add base path
pathRewrite: {
'^/': '/basepath/'
}
// custom rewriting
pathRewrite: function (path, req) {
return path.replace('/api', '/base/api');
}
// custom rewriting, returning Promise
pathRewrite: async function (path, req) {
const should_add_something = await httpRequestToDecideSomething(path);
if (should_add_something) path += 'something';
return path;
}
2.2 其他配置参考
logLevel
:日志打印等级,支持['debug', 'info', 'warn', 'error', 'silent']
,silent
不打印日志logProvider
: 自定义日志打印中间件secure
:是否关闭https
安全认证changeOrigin
:修改代理请求host
protocolRewrite
:协议重写,http
与https
请求互转cookieDomainRewrite
:修改cookieDomain
的值headers
:给所有请求添加headers配置proxyTimeout
:请求超时时间
2.3 高级代理机制
- onError: 对请求状态码进行处理
function onError(err, req, res, target) {
res.writeHead(500, {
'Content-Type': 'text/plain',
});
res.end('Something went wrong. And we are reporting a custom error message.');
}
- onProxyRes: 对代理接口的
Response
处理,这里常用来获取cookie
、重定向等
function onProxyRes(proxyRes, req, res) {
proxyRes.headers['x-added'] = 'foobar'; // 添加一个header
delete proxyRes.headers['x-removed']; // 删除一个header
}
- onProxyReq:对代理接口
request
处理,执行在请求前,常用来设置cookie
、header
等操作
function onProxyReq(proxyReq, req, res) {
// add custom header to request
proxyReq.setHeader('x-added', 'foobar');
// or log the req
}
3 域名白名单配置
配置该配置后,只有匹配的host
地址才可以访问该服务,常用于开发阶段模拟网络网络防火墙对访问IP进行限制。当该配置项被配置为all
时,会跳过host
检查,但不建议这样做,因为有DNS
攻击的风险。
- webpack配置项配置
module.exports = {
//...
devServer: {
allowedHosts: [
'host.com',
'subdomain.host.com',
'subdomain2.host.com',
'host2.com',
],
},
};
- cli 启动命令配置
npx webpack serve --allowed-hosts .host.com --allowed-hosts host2.com
4 端口配置
- webpack配置项配置
module.exports = {
//...
devServer: {
port: 8080,
},
};
- cli 启动命令配置
npx webpack serve --port 8080
5 Angular 实战 —— 通过webpack devServer代理REST接口到本地服务器
在Angular框架中,由于对webpack进行了封装,proxy配置文件默认使用的是proxy.config.json。(js格式配置文件需要到angular.json配置文件中修改),这里以proxy.config.json为例。
- 代理所有以/rest/开头的接口到127.0.0.1:8080,并且将/rest/请求地址转为/
{
"/rest/": {
"target": "http://127.0.0.1:8080",
"secure": false,
"pathRewrite": {
"/rest/": "/"
},
"changeOrigin": true,
"logLevel": "debug",
"proxyTimeout": 3000
}
}
访问启动地址测试{{ host地址}}/rest/testApi
- 给所有的/rest/接口加上cftk的header
这个需要使用js格式的proxy配置文件,修改angular.json中的proxyConfig为 proxy.config.js,在proxy.config.js中添加如下内容:
const PROXY_CONFIG = [
{
"target": "http://127.0.0.1:8080",
"secure": false,
"pathRewrite": {
"/rest/": "/"
},
"changeOrigin": true,
"logLevel": "debug",
"proxyTimeout": 3000,
"onProxyReq": (request, req, res) => {
request.setHeader('cftk', 'my cftk');
}
},
];
module.exports = PROXY_CONFIG;
6 webpack-dev-server 与 nginx 的对比
作者:DevUI团队
链接:https://juejin.cn/post/7010571347705200671