专栏名称: 蚂蚁金服ProtoTeam
数据前端团队
目录
相关文章推荐
前端早读课  ·  【早阅】Figma MCP ... ·  21 小时前  
IT服务圈儿  ·  45K*16薪,进字节了! ·  昨天  
前端早读课  ·  【第3459期】两款 AI 编程助手 ... ·  昨天  
前端大全  ·  解锁 Vue Hooks:让 Vue 开发效率起飞 ·  2 天前  
51好读  ›  专栏  ›  蚂蚁金服ProtoTeam

webpack 3 零基础入门教程 #12 - 如何使用模块热替换 HMR 来处理 CSS

蚂蚁金服ProtoTeam  · 掘金  · 前端  · 2017-12-08 02:37

正文

模块热替换 是什么意思?

以前我们使用的 webpack --watch webpack-dev-server 的功能是监听文件改变,就自动刷新浏览器,而这个 模块热替换 不用刷新浏览器,它是只让修改到的模块,才会在浏览器上发生相应的变化,就是生效,而不是重新刷新浏览器。

为什么要这么做呢?有时候模块越多,改得频繁,刷新起来还是很慢的,效率低呀。

所以有了 模块热替换 的功能,我们来试一下,让我们一改 CSS 然后浏览器不用刷新就会让页面生效改变。

1. 启用 HMR

webpack.config.js

  devServer: {
    port: 9000,
    open: true,
  }

改成下面这样:

  devServer: {
    port: 9000,
    open: true,
    hot: true
  }

webpack.config.js

...
const webpack = require('webpack');

...

module.exports = {
  entry: {
    "app.bundle": './src/app.js',
    "contact": './src/contact.js'
  },
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].[chunkhash].js'
  },
  devServer: {
    port: 9000,
    open: true,
    hot: true
  },
  plugins: [
    new CleanWebpackPlugin(pathsToClean),
    ...
    // 这两行是新增的
    new webpack.NamedModulesPlugin(),
    new webpack.HotModuleReplacementPlugin()
  ],
  ...
};

可惜,报错了个错:

文件名还不能用 chunkhash 了,它说要用 hash 来代替 chunkhash

我们来改一下:

filename: '[name].[chunkhash].js'

变成

filename: '[name].[hash].js'

2. 处理 extract-text-webpack-plugin

现在你试一下改变 src/app.scss 的内容,你会发现页面不动了,你无论怎么改,页面都不会改变,也不会刷新。

之前我们是用 extract-text-webpack-plugin 这个插件来处理 CSS 的,在用 HMR 的时候要先把它关闭一下。

用一个参数 disable: false 就可以关闭掉。

webpack.config.js

new ExtractTextPlugin("style.css")

变成

new ExtractTextPlugin({
  filename: 'style.css',
  disable: false
}),

然后把处理 scss 文件的 loader 部分变成类似下面这样:

...
  test: /\.scss$/,
  use: ExtractTextPlugin.extract({
    fallback: 'style-loader',
    //resolve-url-loader may be chained before sass-loader if






请到「今天看啥」查看全文