@@ -25,6 +25,7 @@ translators:
2525 - QC-L
2626 - jacob-lcs
2727 - lcxfs1991
28+ - Yucohny
2829related :
2930 - title : 概念 - 模块热替换
3031 url : /concepts/hot-module-replacement
@@ -34,20 +35,20 @@ related:
3435
3536T> 本指南继续沿用 [ 开发环境] ( /guides/development ) 指南中的代码示例。
3637
37- 模块热替换(hot module replacement 或 HMR) 是 webpack 提供的最有用的功能之一。它允许在运行时更新所有类型的模块,而无需完全刷新。本页面重点介绍其 ** 实现 ** ,而 [ 概念] ( /concepts/hot-module-replacement ) 页面提供了更多关于它的工作原理以及为什么它有用的细节。
38+ 模块热替换( HMR) 是 webpack 提供的最有用的功能之一。它能帮助在运行时不完全刷新页面的情况下更新所有类型的模块。本页面重点介绍 ** 如何使用 ** ,而 [ 概念] ( /concepts/hot-module-replacement ) 页面提供了更多关于它的工作原理以及为什么它有用的细节。
3839
39- W> ** HMR** 不适用于生产环境,这意味着它应当用于开发环境。更多详细信息,
40- 请查看 [ 生产环境] ( /guides/production ) 指南 。
40+ W> ** HMR** 不适用于生产环境,而应当用于开发环境。
41+ 参阅 [ 生产环境] ( /guides/production ) 指南以了解更多详细信息 。
4142
4243## 启用 HMR $#enabling-hmr$
4344
4445此功能可以很大程度提高生产效率。我们要做的就是更新 [ webpack-dev-server] ( https://github.com/webpack/webpack-dev-server ) 配置,
4546然后使用 webpack 内置的 HMR 插件。我们还要删除掉 ` print.js ` 的入口起点,
4647因为现在已经在 ` index.js ` 模块中引用了它。
4748
48- 从 ` webpack-dev-server ` v4.0.0 开始,热模块替换是默认开启的 。
49+ 从 ` webpack-dev-server ` v4.0.0 开始,模块热替换是默认开启的 。
4950
50- T> 如果你在技术选型中使用了 ` webpack-dev-middleware ` 而没有使用 ` webpack-dev-server ` ,请使用 [ ` webpack-hot-middleware ` ] ( https://github.com/webpack-contrib/webpack-hot-middleware ) 依赖包,以在你的自定义服务器或应用程序上启用 HMR。
51+ T> 如果在技术选型中使用的是 ` webpack-dev-middleware ` 而非 ` webpack-dev-server ` ,请使用 [ ` webpack-hot-middleware ` ] ( https://github.com/webpack-contrib/webpack-hot-middleware ) 依赖以在自定义服务器或应用程序上启用 HMR。
5152
5253** webpack.config.js**
5354
@@ -78,7 +79,7 @@ T> 如果你在技术选型中使用了 `webpack-dev-middleware` 而没有使用
7879 };
7980```
8081
81- 你也可以为 HMR 提供入口 :
82+ 也可以为 HMR 提供入口起点 :
8283
8384** webpack.config.js**
8485
@@ -91,23 +92,23 @@ T> 如果你在技术选型中使用了 `webpack-dev-middleware` 而没有使用
9192 entry: {
9293 app: './src/index.js',
9394- print: './src/print.js',
94- + // Runtime code for hot module replacement
95+ + // 模块热替换的运行时代码
9596+ hot: 'webpack/hot/dev-server.js',
96- + // Dev server client for web socket transport, hot and live reload logic
97+ + // 用于 web 套接字传输、热重载逻辑的 web server 客户端
9798+ client: 'webpack-dev-server/client/index.js?hot=true&live-reload=true',
9899 },
99100 devtool: 'inline-source-map',
100101 devServer: {
101102 static: './dist',
102- + // Dev server client for web socket transport, hot and live reload logic
103+ + // 用于 web 套接字传输、热重载逻辑的 web server 客户端
103104+ hot: false,
104105+ client: false,
105106 },
106107 plugins: [
107108 new HtmlWebpackPlugin({
108109 title: 'Hot Module Replacement',
109110 }),
110- + // Plugin for hot module replacement
111+ + // 模块热替换的插件
111112+ new webpack.HotModuleReplacementPlugin(),
112113 ],
113114 output: {
@@ -118,9 +119,9 @@ T> 如果你在技术选型中使用了 `webpack-dev-middleware` 而没有使用
118119 };
119120```
120121
121- T> 你可以通过以下命令来修改 [ webpack-dev-server] ( https://github.com/webpack/webpack-dev-server ) 的配置:` webpack serve --hot-only ` 。
122+ T> 可以通过以下命令修改 [ webpack-dev-server] ( https://github.com/webpack/webpack-dev-server ) 的配置:` webpack serve --hot-only ` 。
122123
123- 现在,我们来修改 ` index.js ` 文件,以便当 ` print.js ` 内部发生变更时可以告诉 webpack 接受更新的模块。
124+ 现在修改 ` index.js ` 文件,以便检测到 ` print.js ` 内部发生更改时告诉 webpack 接受更新的模块。
124125
125126** index.js**
126127
@@ -159,8 +160,8 @@ T> 你可以通过以下命令来修改 [webpack-dev-server](https://github.com/
159160
160161``` diff
161162 export default function printMe() {
162- - console.log('I get called from print.js! ');
163- + console.log('Updating print.js... ');
163+ - console.log('我在 print.js 中被调用了! ');
164+ + console.log('正在更新 print.js…… ');
164165 }
165166```
166167
@@ -173,12 +174,12 @@ main.js:4395 [WDS] Hot Module Replacement enabled.
173174+ main.js:4395 [WDS] App hot update...
174175+ main.js:4330 [HMR] Checking for updates on the server...
175176+ main.js:10024 Accepting the updated printMe module!
176- + 0.4b8ee77….hot-update.js:10 Updating print.js...
177+ + 0.4b8ee77….hot-update.js:10 正在更新 print.js……
177178+ main.js:4330 [HMR] Updated modules:
178179+ main.js:4330 [HMR] - 20
179180```
180181
181- ## 通过 Node.js API $#via-the-nodejs-api$
182+ ## 通过 Node.js API 启用 HMR $#via-the-nodejs-api$
182183
183184在 Node.js API 中使用 webpack dev server 时,不要将 dev server 选项放在 webpack 配置对象中。而是在创建时,
184185将其作为第二个参数传递。例如:
@@ -199,16 +200,16 @@ const webpackDevServer = require('webpack-dev-server');
199200const config = {
200201 mode: ' development' ,
201202 entry: [
202- // Runtime code for hot module replacement
203+ // 模块热替换的运行时代码
203204 ' webpack/hot/dev-server.js' ,
204- // Dev server client for web socket transport, hot and live reload logic
205+ // 用于 web 套接字传输、热重载逻辑的 web server 客户端
205206 ' webpack-dev-server/client/index.js?hot=true&live-reload=true' ,
206- // Your entry
207+ // 你的入口起点
207208 ' ./src/index.js' ,
208209 ],
209210 devtool: ' inline-source-map' ,
210211 plugins: [
211- // Plugin for hot module replacement
212+ // 模块热替换的插件
212213 new webpack.HotModuleReplacementPlugin (),
213214 new HtmlWebpackPlugin ({
214215 title: ' Hot Module Replacement' ,
@@ -222,23 +223,23 @@ const config = {
222223};
223224const compiler = webpack (config);
224225
225- // `hot` and `client` options are disabled because we added them manually
226+ // 由于手动添加了 `hot` 与 `client` 参数,其将被禁用
226227const server = new webpackDevServer ({ hot: false , client: false }, compiler);
227228
228229(async () => {
229230 await server .start ();
230- console .log (' dev server is running ' );
231+ console .log (' dev server 正在运行 ' );
231232})();
232233```
233234
234- 查看 [ ` webpack-dev-server ` 的 Node.js API 的完整文档] 。
235+ 参阅 [ ` webpack-dev-server ` 的 Node.js API 的完整文档] ( /api/webpack-dev-server/ ) 以了解更多 。
235236
236- T> 如果你正在使用 [ ` webpack-dev-middleware ` ] ( /guides/development#using-webpack-dev-middleware ) ,可以通过 [ ` webpack-hot-middleware ` ] ( https://github.com/webpack-contrib/webpack-hot-middleware ) 依赖包,在自定义 dev server 中启用 HMR。
237+ T> 如果正在使用 [ ` webpack-dev-middleware ` ] ( /guides/development#using-webpack-dev-middleware ) ,可以通过 [ ` webpack-hot-middleware ` ] ( https://github.com/webpack-contrib/webpack-hot-middleware ) 依赖在自定义 dev server 中启用 HMR。
237238
238239## 问题 $#gotchas$
239240
240- 模块热替换可能比较难以掌握。为了说明这一点,我们回到刚才的示例中。如果你继续点击示例页面上的按钮,
241- 你会发现控制台仍在打印旧的 ` printMe ` 函数。
241+ 模块热替换可能比较难以掌握。为了说明这一点,我们回到刚才的示例中。如果继续点击示例页面上的按钮
242+ 会发现控制台仍在打印旧的 ` printMe ` 函数。
242243
243244这是因为按钮的 ` onclick ` 事件处理函数仍然绑定在旧的 ` printMe ` 函数上。
244245
@@ -257,7 +258,7 @@ T> 如果你正在使用 [`webpack-dev-middleware`](/guides/development#using-we
257258 element.innerHTML = _.join(['Hello', 'webpack'], ' ');
258259
259260 btn.innerHTML = 'Click me and check the console!';
260- btn.onclick = printMe; // onclick event is bind to the original printMe function
261+ btn.onclick = printMe; // onclick 事件仍然绑定着原本的 printMe 函数
261262
262263 element.appendChild(btn);
263264
@@ -270,7 +271,7 @@ T> 如果你正在使用 [`webpack-dev-middleware`](/guides/development#using-we
270271
271272 if (module.hot) {
272273 module.hot.accept('./print.js', function() {
273- console.log('Accepting the updated printMe module! ');
274+ console.log('正在接受更新后的 printMe 模块! ');
274275- printMe();
275276+ document.body.removeChild(element);
276277+ element = component(); // 重新渲染 "component",以便更新 click 事件处理函数
@@ -284,7 +285,7 @@ T> 如果你正在使用 [`webpack-dev-middleware`](/guides/development#using-we
284285
285286## HMR 加载样式 $#hmr-with-stylesheets$
286287
287- 借助于 ` style-loader ` ,使用模块热替换来加载 CSS 实际上极其简单。此 loader 在幕后使用了 ` module.hot.accept ` ,在 CSS 依赖模块更新之后,会将其 patch(修补) 到 ` <style> ` 标签中。
288+ 借助 ` style-loader ` 后,使用模块热替换加载 CSS 实际上极其简单。此 loader 在幕后使用了 ` module.hot.accept ` ,在 CSS 依赖模块更新之后,会将其修补到 ` <style> ` 标签中。
288289
289290首先使用以下命令安装两个 loader :
290291
@@ -368,7 +369,7 @@ body {
368369 element.innerHTML = _.join(['Hello', 'webpack'], ' ');
369370
370371 btn.innerHTML = 'Click me and check the console!';
371- btn.onclick = printMe; // onclick event is bind to the original printMe function
372+ btn.onclick = printMe; // onclick 事件仍然绑定着原本的 printMe 函数
372373
373374 element.appendChild(btn);
374375
@@ -380,9 +381,9 @@ body {
380381
381382 if (module.hot) {
382383 module.hot.accept('./print.js', function() {
383- console.log('Accepting the updated printMe module! ');
384+ console.log('正在接受更新后的 printMe 模块! ');
384385 document.body.removeChild(element);
385- element = component(); // Re-render the " component" to update the click handler
386+ element = component(); // 重新渲染 component 以更新点击事件处理程序
386387 document.body.appendChild(element);
387388 })
388389 }
@@ -404,10 +405,10 @@ body {
404405
405406社区还提供许多其他 loader 和示例,可以使 HMR 与各种框架和库平滑地进行交互……
406407
407- - [ React Hot Loader] ( https://github.com/gaearon/react-hot-loader ) : 实时调整 react 组件。
408- - [ Vue Loader] ( https://github.com/vuejs/vue-loader ) : 此 loader 支持 vue 组件的 HMR,提供开箱即用体验。
409- - [ Elm Hot webpack Loader] ( https://github.com/klazuka/elm-hot-webpack-loader ) : 支持 Elm 编程语言的 HMR。
410- - [ Angular HMR] ( https://github.com/gdi2290/angular-hmr ) : 没有必要使用 loader!直接修改 NgModule 主文件就够了,它可以完全控制 HMR API。
411- - [ Svelte Loader] ( https://github.com/sveltejs/svelte-loader ) : 此 loader 开箱即用地支持 Svelte 组件的热更新。
408+ - [ React Hot Loader] ( https://github.com/gaearon/react-hot-loader ) : 实时调整 react 组件。
409+ - [ Vue Loader] ( https://github.com/vuejs/vue-loader ) : 此 loader 支持 vue 组件的 HMR,提供开箱即用体验。
410+ - [ Elm Hot webpack Loader] ( https://github.com/klazuka/elm-hot-webpack-loader ) : 支持 Elm 编程语言的 HMR。
411+ - [ Angular HMR] ( https://github.com/gdi2290/angular-hmr ) : 没有必要使用 loader!直接修改 NgModule 主文件就够了,它可以完全控制 HMR API。
412+ - [ Svelte Loader] ( https://github.com/sveltejs/svelte-loader ) : 此 loader 开箱即用地支持 Svelte 组件的热更新。
412413
413- T> 如果你知道任何其他 loader 或 plugin,能够有助于或增强模块热替换(hot module replacement) ,请提交一个 pull request 以添加到此列表中!
414+ T> 如果你知道任何其他 loader 或 plugin,能够有助于或增强模块热替换,请提交一个 pull request 以添加到此列表中!
0 commit comments