webpack-dev-server
提供了一个简单的 web server 并且具有live reloading(实时重新加载) 功能
安装与使用
安装 **npm install --save-dev webpack-dev-server
修改配置文件,告知 dev server 从什么位置查找文件
webpack.config.js**
module.exports = {devServer: {contentBase: './dist',compress: true,port: 9000 //指定端口},};
以上配置告知 webpack-dev-server 将dist 目录下的文件 serve 到 localhost:8080
运行 npx webpack-dev-server
可以在 package.json 指定脚本
"scripts": {"dev": "webpack-dev-server --config webpack.config.js"},
分析
执行 命令 之后,它会读取 webpack 的配置文件(默认是webpack.config.js) ,然后将文件打包到内存中(所以看不到dist文件夹的生成,webpack会打包到硬盘上),这时候打开server 的默认地址 : localhost:8080 就可以看到文件目录或页面 (默认是显示 index.html 没有则显示目录)
注意版本问题(webpack webpack-cli)会导致报错
Cannot find module 'webpack/bin/config-yargs'
"devDependencies": {"webpack": "^4.30.0","webpack-cli": "^3.3","webpack-dev-server": "^3.8.0"}
自动刷新
- iframe模式:页面被放到一个iframe内,当发生变化时,会重新加载
- inline模式:将webpack-dev-server 的重载添加到产出的bundle 中
使用方式: webpack-dev-server --hot --inline 是开启 inline 模式的自动刷新。
**
模块热替换
hot module replacement 或 HMR
**
proxy
在实际开发中,,本地开发服务器是不能直接请求线上数据接口的,这是因为浏览器的同源安全策略导致的跨域问 题,我们可以使用 devServer.proxy 来解决本地开发跨域的问题。
下面的配置是将页面访问的/api所有请求都转发到了 baidu.com 上,那么,我们请求 /api/users 则会被转发到 http://baidu.com/api/users 线上地址
module.exports = {devServer:{proxy:{'/api':'http://baidu.com'}}}
高级属性
**
- pathRewrite
重写路径,将 /api/users 转发到 http://baidu.com/users
module.exports = {//...devServer: {proxy: {'/api': {target: 'http://baidu.com',pathRewrite: {'^/api': ''}}}}};
解析:^/api 是一个正则表达式'^/api' 应该拆分成 '^' 和 '/api' 两个字符串,其中 '^' 匹配的是字符串最开始的位置。
也就是说,axios 的请求URL写成了 '/api/myAPI/path' 的话,最后会在经过 http-proxy-middleware 的代理服务器时,会变成 '/myAPI/path' ,然后代理到 http://localhost:8080 这个代理服务器下面。
- changeOrigin
设置为true,本地就会虚拟一个服务器接收你的请求并代你发送该请求
module.exports = {//...devServer: {proxy: {'/api': {target: 'http://localhost:3000',changeOrigin: true,}}}};
- 支持 https
默认情况下,不接受运行在https上,且使用了无效证书的后端服务器secure:false
- bypass
不想代理所有请求,可以基于一个函数的返回值绕过代理
例如:对于浏览器请求,你想要提供一个 HTML 页面,但是对于 API 请求则保持代理
module.exports = {//...devServer: {proxy: {'/api': {target: 'http://localhost:3000',bypass: function(req, res, proxyOptions) {if (req.headers.accept.indexOf('html') !== -1) {console.log('Skipping proxy for browser request.');return '/index.html';}}}}}};
- context
多个路径代理到同一个target下,可以使用数组
module.exports = {//...devServer: {proxy: [{context: ['/auth', '/api'],target: 'http://localhost:3000',}]}};
- 自定义中间件
devServer.before devServer.after
自定义中间件在开发中常用来做 mock server 使用
http://localhost:9000/api/mock.json
module.exports = {//...devServer: {port: 9000,before(app, server) {app.get('/api/mock.json', (req, res) => {res.json({hello: 'world'})})}}};
- devServer.compress
服务开启Gzip压缩

