Webpack5 - 开发服务器 webpack-dev-server

一. Webpack5 - 开发服务器的作用

webpack-dev-server 可以提供用于开发的 HTTP Server(开发服务器),它已集成了自动编译和自动刷新页面的功能。

二. Webpack5 - 开发服务器安装和使用

1. 安装

cnpm install webpack-dev-server --save-dev

2. 启动

yarn webpack serve

看命令输出,访问 http://localhost:8080/ 即是开发中的页面。

尝试修改样式文件-可发现页面会自动刷新更新;

尝试修改js脚本文件-可发现页面会自动刷新更新;

尝试修改index.html模板文件-可发现页面会自动刷新更新(发现如果开启 devServer.hot 为true,则模板文件更新后不会自动刷新,需手动刷新...)。

3. 说明

webpack-dev-server 自动编译项目,并把编译结果放入缓存中,并不输出到输出目录。

文件修改后,页面会刷新,则会丢失可能的调试状态,但是由于逻辑多种多样,webpack 无法处理,所以只好刷新页面。后续可以手动实现webpack的模块热替换(HMR Hot Module Replacement)来自定义模块的更新逻辑。

三. 开发服务器配置

1. 设置不必参与打包的静态资源访问路径

webpack.config.js:

module.exports = {
  // 设置开发服务器
  devServer: {
    // 开发时可直接访问到 ./public 下的静态资源,这些资源在开发中不必打包
    contentBase: './public',
  }
}

2. 设置代理API服务

webpack.config.js:

module.exports = {
  // 设置开发服务器
  devServer: {
    // 配置 API访问代理
    // http://localhost:8080/api/users/octocat/orgs
    proxy: {
      '/api': {
          // http://localhost:8080/api/users ->             
          // https://api.github.com/api/users
        target: 'https://api.github.com',

          // http://localhost:8080/api/users -> 
          // https://api.githu.com/users
        pathRewrite: {
          '^/api': '' // 替换 /api 开头 为 ''
        },

        // 不能使用 localhost:8080 作为请求 Github 的主机名
        changeOrigin: true,
      }
    },
  }
}

3. 开启 HMR (Hot Module Replacement)

模块热更新(替换),是指在应用的运行过程中实时替换某个模块资源,而运行不用终止。

开启 webpack HMR,webpack.config.js:

const webpack = require('webpack')
module.exports = {
    devServer: {
        hot: true, // 开启webpack HRM(模块热替换)
    },
    plugins: [
      new webpack.HotModuleReplacementPlugin(),
    ]
}

开启后,可发现:

修改样式文件-页面会自动加载新样式而不刷新页面(因为 style-loader 对样式模块热更新逻辑做了处理);而

而修改脚本文件-页面仍然会自动刷新以更新(而脚本文件复杂多样,webpack不知如何处理)。

4. 手写逻辑处理脚本模块的 HMR 逻辑

可在入口js文件中,处理引入模块的更新逻辑,如:

index.js :

// 应用入口文件
import './index.css';
import add from './tool.js';
import background from './img.jpeg';

console.log(add(6, 6));

var imgEle = new Image()
imgEle.src = background;
document.body.append(imgEle);


/* 使用 webpack HMR 的 API 来处理模块更新逻辑 避免页面刷新
module.hot.accept 可注册一个模块(路径)的更新逻辑 */ 
if(module.hot) { // 如果开启了webpack模块热更新
  // 处理 tool.js 模块的热更新
  module.hot.accept('./tool.js', () => {
    console.log('tool 模块更新啦...')
    console.log(add(6, 6));
  })

  // 处理 img.jpeg 图片文件 的热更新
  module.hot.accept('./src/img.jpeg', () => {
    imgEle.src = background;
  })
}

5. 注意事项 - 手写逻辑处理脚本模块的 HMR 逻辑

a. 处理 HMR 的代码报错会导致自动刷新,解决方式是用 hotOnly 替换 hot:

devServer: {
  hotOnly: true,
},

b. 应判断 module.hot 是否存在

c. 打包后的代码不会包含 对 HMR 模块替换逻辑的代码

本文 完。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值