Wang's blog Wang's blog
首页
  • 前端文章

    • HTML教程
    • CSS
    • JavaScript
  • 前端框架

    • Vue
    • React
    • VuePress
    • Electron
  • 后端技术

    • Npm
    • Node
    • TypeScript
  • 编程规范

    • 规范
  • 我的笔记
  • Git
  • GitHub
  • VSCode
  • Mac工具
  • 数据库
  • Google
  • 服务器
  • Python爬虫
  • 前端教程
更多
收藏
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Wang Mings

跟随大神,成为大神!
首页
  • 前端文章

    • HTML教程
    • CSS
    • JavaScript
  • 前端框架

    • Vue
    • React
    • VuePress
    • Electron
  • 后端技术

    • Npm
    • Node
    • TypeScript
  • 编程规范

    • 规范
  • 我的笔记
  • Git
  • GitHub
  • VSCode
  • Mac工具
  • 数据库
  • Google
  • 服务器
  • Python爬虫
  • 前端教程
更多
收藏
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Python爬虫

  • 前端教程

    • 团队规范

    • Project

      • Axios用法与原理
      • css布局技巧
      • 深度学习平台术语
      • 谈谈前端天花板问题
      • 一个程序员的成长之路
      • Markdown-It 解析原理
      • minipack源码解析
      • PostCSS
      • Electron工程踩坑记录
      • H5 Video踩坑记录
      • Puppeteer翻页爬虫
      • 重构你的javascript代码
      • RxJS入门实践
      • 官网脚手架思考与实践
      • Stylelint样式规范工具
      • TypeScript开发Vue应用
      • Typescript tsconfig.json全解析
      • Vue项目TypeScript指南
      • TypeScript在Vue2.x中的坑
      • Vue Dialog弹窗解决方案
      • Vue JSX插件依赖及语法实践
      • Webpack 模块打包原理
      • Webpack4 配置详解
      • Webpack4 devServer配置详解
        • [#](#devserver配置) devServer配置
        • [#](#源码解析) 源码解析
      • Webpack3.x升级Webpack4指南
    • JS

    • NodeJS

    • Vue

    • React

    • 效率工具

    • 读书笔记

  • 教程
  • 前端教程
  • Project
wangmings
2022-07-19
目录

Webpack4 devServer配置详解

# # Webpack4 devServer配置详解

webpack-dev-server是一个封装好的webpack开发服务器,底层使用express。通常用在开发环境的webpack打包,它有以下这些作用:

  1. 读取webpack.config.js并使用webpack进行编译
  2. 默认集成一些第三方插件并可供配置,都在webpack.config.js下的devServer节点下(本节重点)
  3. 开启一个websocket以实现热更新
    • 基于webpack-dev-middleware (opens new window) (opens new window)实现
    • 编译输出放到内存中,不会生成真实的文件
  4. 开启本地express服务器以实现网址预览

webpack打包和webpack-dev-server开启服务的区别:webpack输出真实的文件,而webpack-dev-server输出的文件只存在于内存中,不输出真实的文件

# # devServer配置

webpack的devServer配置基于webpack-dev-server (opens new window) (opens new window)集成的插件。该插件提供了proxy代理配置,基于express中间件 http-proxy-middleware (opens new window) (opens new window)实现,该中间件又基于node http-proxy (opens new window) (opens new window),所以如果要详细知道proxy各个参数的意义和实现方式,可以阅读下http-proxy的源码。

proxy作用:解决开发环境的跨域问题(不用再去配置nginx)

    devServer: {
        // 提供静态文件目录地址
        // 基于express.static实现
        contentBase: path.join(__dirname, 'dist'),
        // 任意的 404 响应都被替代为 index.html
        // 基于node connect-history-api-fallback包实现
        historyApiFallback: true,
        // 是否一切服务都启用 gzip 压缩
        // 基于node compression包实现
        compress: true,
        // 是否隐藏bundle信息
        noInfo: true,
        // 发生错误是否覆盖在页面上
        overlay: true,
        // 是否开启热加载
        // 必须搭配webpack.HotModuleReplacementPlugin 才能完全启用 HMR。
        // 如果 webpack 或 webpack-dev-server 是通过 --hot 选项启动的,那么这个插件会被自动添加
        hot: true,
        // 热加载模式
        // true代表inline模式,false代表iframe模式
        inline: true, // 默认是true
        // 是否自动打开
        open: true,
        // 设置本地url和端口号
        host: 'localhost',
        port: 8080,
        // 代理
        // 基于node http-proxy-middleware包实现
        proxy: {
            // 匹配api前缀时,则代理到3001端口
            // 即http://localhost:8080/api/123 = http://localhost:3001/api/123
            // 注意:这里是把当前server8080代理到3001,而不是任意端口的api代理到3001
            '/api': 'http://localhost:3001',
            // 设置为true, 本地就会虚拟一个服务器接收你的请求并代你发送该请求
            // 主要解决跨域问题
            changeOrigin: true,
            // 针对代理https
            secure: false,
            // 覆写路径:http://localhost:8080/api/123 = http://localhost:3001/123
            pathRewrite: {'^/api' : ''}
        }
    }
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

# # 源码解析

webpack-dev-server源码,把一些细枝末节去掉应该好理解很多,大部分都是基于第三方插件封装的API:

    const features = {
        // compress
        // 基于compression包
        compress: () => {
            if (options.compress) {
                // Enable gzip compression.
                app.use(compress());
            }
        },
        // proxy
        // 基于http-proxy-middleware包
        proxy: () => {
            const getProxyMiddleware = (proxyConfig) => {
                const context = proxyConfig.context || proxyConfig.path;
                if (proxyConfig.target) {
                    return httpProxyMiddleware(context, proxyConfig);
                }
            };
            // 多个proxy设置
            options.proxy.forEach((proxyConfigOrCallback) => {
                // http-proxy-middleware作为中间件应用到express中
                // 如果自己封装代理,这里很值得借鉴
                app.use((req, res, next) => {
                    const proxyConfig = proxyConfigOrCallback();
                    proxyMiddleware = getProxyMiddleware(proxyConfig);
    
                    proxyMiddleware(req, res, next);
                })
            }
        },
        // historyApiFallback
        // 基于connect-history-api-fallback包
        historyApiFallback: () => {
            if (options.historyApiFallback) {
                // Fall back to /index.html if nothing else matches.
                app.use(historyApiFallback(fallback));
            }
            },
        // contentBase
        // 基于express.static
        contentBaseFiles: () => {
            if (Array.isArray(contentBase)) {
                contentBase.forEach((item) => {
                    app.get('*', express.static(item));
                });
            }
        }
    }
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
编辑 (opens new window)
Webpack4 配置详解
Webpack3.x升级Webpack4指南

← Webpack4 配置详解 Webpack3.x升级Webpack4指南→

最近更新
01
theme-vdoing-blog博客静态编译问题
09-16
02
搜索引擎
07-19
03
友情链接
07-19
更多文章>
Theme by Vdoing | Copyright © 2019-2022 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式