webpack 热加载你站住,我对你好奇很久了

Posted SegmentFault

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了webpack 热加载你站住,我对你好奇很久了相关的知识,希望对你有一定的参考价值。

使用 webpack 有一段时间了,其中的模块热加载加快了开发的速度。它无需刷新,只要修改了文件,客户端就立刻做热加载。如何做到?当然理解他的最好的做法就是我们自己做一遍。

本文关心的是:

  1. dev-middleware 内部

  2. HMR(webpack-hot-middleware)的利用

这次提供热加载的代码共两个文件(放置于 src 内),a 依赖于 b,并调用 b 的引出函数:

// a.js 
var b = require("./b.js")
b.b()

// b.js
exports.b = function b(){
console.log("h")
}

首先我需要使用 dev-middleware 让使用 require 函数成为可能,其次我希望使用 HMR,当 b 文件内修改时,可以自动热加载,而不是必须完整 reload 才可以。当然,按照 webpack 的管理,我们需要一个入口 index.html,放置于 output 内:

<html>
   <body>        <script type="text/javascript" src="bundle.js"></script>    </body>
</html>

希望热加载的代码就是这样了。目录结构如下:

├── output
│   ├── bundle.js
│   └── index.html
├── package.json
├── server.js
└── src
    ├── a.js     └── b.js

其中的 server.js 在随后创建。现在我们创建环境,让它可以热加载:
创建目录环境的命令为:

mkdir src
touch src/a.js
touch src/b.js
mkdir output
touch output/index.html
touch server.js

创建环境

npm init -y
npm install express --save
npm install webpack webpack-dev-middleware webpack-hot-middleware --save-dev

创建服务器文件

此服务器文件使用 express 创建服务器监听,使用 dev 中间件,HMR 中间件:

var express = require('express')
var webpack = require('webpack')
var path = require('path')
var app = express()
var webpackMiddleware = require("webpack-dev-middleware");
var compiler = webpack({    entry:    ["./src/a.js",
   'webpack-hot-middleware/client?path=/__webpack_hmr&timeout=20000',    ],    output: {        path: path.resolve(__dirname, './output/'),        filename:'bundle.js',    },    plugins: [
       new webpack.optimize.OccurenceOrderPlugin()
       new webpack.HotModuleReplacementPlugin(),
       new webpack.NoErrorsPlugin()    ] })
var options ={    publicPath: "/", } app.use(webpackMiddleware(compiler, options)); app.use(require("webpack-hot-middleware")(compiler)); app.use(express.static('output')) app.listen(8080, function () {
   console.log('Example app listening on!') })

其中 dev 中间件中涉及到的入口文件的做法和一般的 webpack 做法一样,但是多出一个 webpack-hot-middleware/client 文件,此文件用来传递到客户端,并和服务器的 HMR 插件联络,联络的 URL 为path=/__webpack_hmr&timeout=20000,其中 path 有 HMR 服务监听,timeout 则可以望文生义,知道失联的话,达到20000毫秒就算超时,不必再做尝试。

为了让 HMR 知道 a、b 文件是可以热加载的,必须在入口文件内(也就是 a.js)内的尾部加入代码:

if (module.hot) {
 module.hot.accept(); }

也就是说 a.js 得修改为:

// a.js 
var b = require("./b.js") b.b()

if (module.hot) {
 module.hot.accept(); }

现在执行服务:

node server.js

打开浏览器,访问 localhost:8080 ,并打开 Chrome devtools,看到

bundle.js:1916 h
bundle.js:1626 [HMR] connected

现在修改 b.js 内的字符串为 hello HMR,看到 Console 输出:

Hello HMR
bundle.js:1847 [HMR] Updated modules:
bundle.js:1849 [HMR]  - ./src/b.js
bundle.js:1849 [HMR]  - ./src/a.js
bundle.js:1854 [HMR] App is up to date.

就是说 HMR 已经激活。

ref :

【以往热门文章推荐】

  • Rresn -

  • songjz -

  • Cinwell -

  • tinylcy -

  • xixicat -

以上是关于webpack 热加载你站住,我对你好奇很久了的主要内容,如果未能解决你的问题,请参考以下文章

热加载程序复制代码(n 次)而不是热交换

Webpack + postcss + 主题 + 热加载

webpack无法热加载(__webpack_hmr 502)

webpack+express实现“热更新”和“热加载”

webpack2 热加载js 文件

转:我,喜,欢,你,很久了……