Skip to content

Commit db43ed3

Browse files
authored
docs(cn): improve guides/caching translation
docs(cn): improve guides/caching translation
2 parents ca89c3e + 67ebda4 commit db43ed3

File tree

1 file changed

+28
-27
lines changed

1 file changed

+28
-27
lines changed

src/content/guides/caching.mdx

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ contributors:
1414
- AnayaDesign
1515
- aholzner
1616
- snitin315
17+
- Yucohny
1718
translators:
1819
- QC-L
1920
- jacob-lcs
@@ -25,15 +26,15 @@ related:
2526

2627
T> 本指南继续沿用 [起步](/guides/getting-started)[管理输出](/guides/output-management)[代码分离](/guides/code-splitting) 中的代码示例。
2728

28-
以上,我们使用 webpack 来打包我们的模块化后的应用程序,webpack 会生成一个可部署的 `/dist` 目录,然后把打包后的内容放置在此目录中。只要 `/dist` 目录中的内容部署到 server 上,client(通常是浏览器)就能够访问此 server 的网站及其资源。而最后一步获取资源是比较耗费时间的,这就是为什么浏览器使用一种名为 [缓存](<https://en.wikipedia.org/wiki/Cache_(computing)>) 的技术。可以通过命中缓存,以降低网络流量,使网站加载速度更快然而,如果我们在部署新版本时不更改资源的文件名,浏览器可能会认为它没有被更新,就会使用它的缓存版本。由于缓存的存在,当你需要获取新的代码时,就会显得很棘手。
29+
接下来继续使用 webpack 打包模块化应用程序。在打包后,webpack 会生成一个可部署的 `/dist` 目录,然后就打包后的内容放置在此目录中。一旦 `/dist` 目录中的内容部署到服务器上,客户端(通常是浏览器)就能够访问此服务器以获取站点及其资源。而最后一步获取资源是比较耗费时间的,这就是为什么浏览器使用一种名为 [缓存](<https://en.wikipedia.org/wiki/Cache_(computing)>) 的技术。命中缓存可以降低网络流量,使网站加载速度更快然而,如果在部署新版本时不更改资源的文件名,浏览器可能会认为它没有被更新,就会使用它的缓存版本。由于缓存的存在,当你需要获取新的代码时,就会显得很棘手。
2930

30-
此指南的重点在于通过必要的配置,以确保 webpack 编译生成的文件能够被客户端缓存而在文件内容变化后,能够请求到新的文件。
31+
此指南的重点在于通过必要的配置,确保 webpack 编译生成的文件能够被客户端缓存而在文件内容变化后,能够请求到新的文件。
3132

32-
## 输出文件的文件名(output filename) $#output-filenames$
33+
## 输出文件的文件名 $#output-filenames$
3334

34-
我们可以通过替换 `output.filename` 中的 [substitutions](/configuration/output/#outputfilename) 设置,来定义输出文件的名称。webpack 提供了一种使用称为 **substitution(可替换模板字符串)** 的方式,通过带括号字符串来模板化文件名。其中,`[contenthash]` substitution 将根据资源内容创建出唯一 hash。当资源内容发生变化时,`[contenthash]` 也会发生变化。
35+
更改 `output.filename` 中的 [substitutions](/configuration/output/#outputfilename) 以定义输出文件的名称。webpack 提供了一种称为 **substitution可替换模板字符串** 的方式,通过带括号字符串来模板化文件名。其中,`[contenthash]` substitution 将根据资源内容创建唯一哈希值。当资源内容发生变化时,`[contenthash]` 也会发生变化。
3536

36-
这里使用 [起步](/guides/getting-started) 中的示例和 [管理输出](/guides/output-management) 中的 `plugins` 插件来作为项目基础,所以我们依然不必手动地维护 `index.html` 文件:
37+
这里使用 [起步](/guides/getting-started) 中的示例和 [管理输出](/guides/output-management) 中的 `plugins` 插件作为项目基础,所以不必手动维护 `index.html` 文件:
3738

3839
**project**
3940

@@ -71,7 +72,7 @@ webpack-demo
7172
};
7273
```
7374

74-
使用此配置,然后运行我们的 build script `npm run build`,产生以下输出
75+
调整配置后构建脚本,将会看到像下面一样的输出
7576

7677
```bash
7778
...
@@ -81,7 +82,7 @@ main.7e2c49a622975ebd9b7e.js 544 kB 0 [emitted] [big] main
8182
...
8283
```
8384

84-
可以看到,bundle 的名称是它内容(通过 hash)的映射。如果我们不做修改,然后再次运行构建,我们以为文件名会保持不变。然而,如果我们真的运行,可能会发现情况并非如此
85+
可以看到,bundle 的名称是其内容通过哈希的映射。如果不做修改,再次运行构建,也许会认为文件名将保持不变。然而事实并非如此,试试再次构建脚本
8586

8687
```bash
8788
...
@@ -91,13 +92,13 @@ main.205199ab45963f6a62ec.js 544 kB 0 [emitted] [big] main
9192
...
9293
```
9394

94-
这也是因为 webpack 在入口 chunk 中,包含了某些 boilerplate(引导模板),特别是 runtime 和 manifest。(译注:boilerplate 指 webpack 运行时的引导代码)
95+
这是因为 webpack 在入口 chunk 中,包含了某些 boilerplate引导模板,特别是 runtime 和 manifest。(译注:boilerplate 指 webpack 运行时的引导代码
9596

96-
W> 输出可能会因当前的 webpack 版本而稍有差异。与旧版本相比,新版本不一定有完全相同的问题,但我们仍然推荐的以下步骤,确保结果可靠
97+
W> 输出可能会因当前的 webpack 版本而稍有差异。与旧版本相比,新版本未必持有同样的哈希机制,但我们仍然建议采取以下步骤以确保安全
9798

98-
## 提取引导模板(extracting boilerplate) $#extracting-boilerplate$
99+
## 提取引导模板 $#extracting-boilerplate$
99100

100-
正如我们在 [代码分离](/guides/code-splitting) 中所学到的,[`SplitChunksPlugin`](/plugins/split-chunks-plugin/) 可以用于将模块分离到单独的 bundle 中。webpack 还提供了一个优化功能,可使用 [`optimization.runtimeChunk`](/configuration/optimization/#optimizationruntimechunk) 选项将 runtime 代码拆分为一个单独的 chunk。将其设置为 `single` 来为所有 chunk 创建一个 runtime bundle:
101+
正如我们在 [代码分离](/guides/code-splitting) 中所学到的,[`SplitChunksPlugin`](/plugins/split-chunks-plugin/) 可以用于将模块分离到单独的 bundle 中。webpack 还提供了一个优化功能,可以使用 [`optimization.runtimeChunk`](/configuration/optimization/#optimizationruntimechunk) 选项将 runtime 代码拆分为一个单独的 chunk。将其设置为 `single` 以为所有 chunk 创建一个 runtime bundle:
101102

102103
**webpack.config.js**
103104

@@ -123,7 +124,7 @@ W> 输出可能会因当前的 webpack 版本而稍有差异。与旧版本相
123124
};
124125
```
125126

126-
再次构建,然后查看提取出来的 `runtime` bundle:
127+
更改配置后再次构建,查看提取出来的 `runtime` bundle:
127128

128129
```bash
129130
Hash: 82c9c385607b2150fab2
@@ -139,8 +140,8 @@ runtime.cc17ae2a94ec771e9221.js 1.42 KiB 0 [emitted] runtime
139140
+ 1 hidden module
140141
```
141142

142-
将第三方库(library)(例如 `lodash``react`)提取到单独的 `vendor` chunk 文件中,是比较推荐的做法,这是因为,它们很少像本地的源代码那样频繁修改。因此通过实现以上步骤,利用 client 的长效缓存机制,命中缓存来消除请求,并减少向 server 获取资源,同时还能保证 client 代码和 server 代码版本一致
143-
这可以通过使用 [SplitChunksPlugin 示例 2](/plugins/split-chunks-plugin/#split-chunks-example-2) 中演示的 [`SplitChunksPlugin`](/plugins/split-chunks-plugin/) 插件的 [`cacheGroups`](/plugins/split-chunks-plugin/#splitchunkscachegroups) 选项来实现。我们在 `optimization.splitChunks` 添加如下 `cacheGroups` 参数并构建
143+
由于像 `lodash``react` 这样的第三方库很少像本地源代码一样频繁修改,因此通常推荐将第三方库提取到单独的 `vendor` chunk 中。这一步将减少客户端对服务器的请求,同时保证自身代码与服务器一致
144+
可以通过使用 [SplitChunksPlugin 示例 2](/plugins/split-chunks-plugin/#split-chunks-example-2) 中演示的 [`SplitChunksPlugin`](/plugins/split-chunks-plugin/) 插件的 [`cacheGroups`](/plugins/split-chunks-plugin/#splitchunkscachegroups) 选项来实现。试试在 `optimization.splitChunks` 添加如下 `cacheGroups` 参数并执行构建
144145

145146
**webpack.config.js**
146147

@@ -187,9 +188,9 @@ vendors.a42c3ca0d742766d7a28.js 69.4 KiB 1 [emitted] vendors
187188
...
188189
```
189190

190-
现在,我们可以看到 `main` 不再含有来自 `node_modules` 目录的 `vendor` 代码,并且体积减少到 `240 bytes`
191+
现在,可以看到 `main` 不再含有来自 `node_modules` 目录的 `vendor` 代码,并且体积减少到 `240 bytes`
191192

192-
## 模块标识符(module identifier) $#module-identifiers$
193+
## 模块标识符 $#module-identifiers$
193194

194195
在项目中再添加一个模块 `print.js`
195196

@@ -224,7 +225,7 @@ webpack-demo
224225
function component() {
225226
const element = document.createElement('div');
226227

227-
// lodash 是由当前 script 脚本 import 进来的
228+
// lodash 现在使用 import 引入
228229
element.innerHTML = _.join(['Hello', 'webpack'], ' ');
229230
+ element.onclick = Print.bind(null, 'Hello webpack!');
230231

@@ -234,7 +235,7 @@ webpack-demo
234235
document.body.appendChild(component());
235236
```
236237

237-
再次运行构建,然后我们期望的是,只有 `main` bundle 的 hash 发生变化,然而……
238+
通常我们会期望,当再次执行构建后,只有 `main` bundle 的哈希值会发生变化,然而……
238239

239240
```bash
240241
...
@@ -246,13 +247,13 @@ webpack-demo
246247
...
247248
```
248249

249-
……我们可以看到这三个文件的 hash 都变化了。这是因为每个 [`module.id`](/api/module-variables/#moduleid-commonjs) 会默认地基于解析顺序(resolve order)进行增量。也就是说,当解析顺序发生变化,ID 也会随之改变。简要概括
250+
可以发现,三个文件的哈希值都发生了变化。这是因为每个 [`module.id`](/api/module-variables/#moduleid-commonjs) 会默认基于解析顺序(resolve order)增量。换言之,当解析顺序发生变化,ID 也会随之改变。简要概括便是
250251

251252
- `main` bundle 会随着自身的新增内容的修改,而发生变化。
252253
- `vendor` bundle 会随着自身的 `module.id` 的变化,而发生变化。
253254
- `manifest` runtime 会因为现在包含一个新模块的引用,而发生变化。
254255

255-
第一个和最后一个都是符合预期的行为,`vendor` hash 发生变化是我们要修复的。我们将 [`optimization.moduleIds`](/configuration/optimization/#optimizationmoduleids) 设置为 `'deterministic'`
256+
上面的第一点与最后一点都是符合预期的行为,而 `vendor` 的哈希值发生变化是我们要修复的。试试将 [`optimization.moduleIds`](/configuration/optimization/#optimizationmoduleids) 设置为 `'deterministic'`
256257

257258
**webpack.config.js**
258259

@@ -288,7 +289,7 @@ webpack-demo
288289
};
289290
```
290291

291-
现在,不论是否添加任何新的本地依赖,对于前后两次构建,`vendor` hash 都应该保持一致
292+
现在,不论是否添加任何新的本地依赖,对于前后两次构建,`vendor` 的哈希值都应保持一致
292293

293294
```bash
294295
...
@@ -301,7 +302,7 @@ Entrypoint main = runtime.725a1a51ede5ae0cfde0.js vendors.55e79e5927a639d21a1b.j
301302
...
302303
```
303304

304-
然后,修改 `src/index.js`临时移除额外的依赖:
305+
接下来修改 `src/index.js` 临时移除额外的依赖:
305306

306307
**src/index.js**
307308

@@ -313,7 +314,7 @@ Entrypoint main = runtime.725a1a51ede5ae0cfde0.js vendors.55e79e5927a639d21a1b.j
313314
function component() {
314315
const element = document.createElement('div');
315316

316-
// lodash 是由当前 script 脚本 import 进来的
317+
// lodash 现在使用 import 引入
317318
element.innerHTML = _.join(['Hello', 'webpack'], ' ');
318319
- element.onclick = Print.bind(null, 'Hello webpack!');
319320
+ // element.onclick = Print.bind(null, 'Hello webpack!');
@@ -324,7 +325,7 @@ Entrypoint main = runtime.725a1a51ede5ae0cfde0.js vendors.55e79e5927a639d21a1b.j
324325
document.body.appendChild(component());
325326
```
326327

327-
最后,再次运行我们的构建
328+
最后,再次执行构建
328329

329330
```bash
330331
...
@@ -337,8 +338,8 @@ Entrypoint main = runtime.725a1a51ede5ae0cfde0.js vendors.55e79e5927a639d21a1b.j
337338
...
338339
```
339340

340-
我们可以看到,这两次构建中`vendor` bundle 文件名称,都是 `55e79e5927a639d21a1b`
341+
可以看到,在这两次构建中`vendor` bundle 的文件名称都是 `55e79e5927a639d21a1b`
341342

342-
## 结论 $#conclusion$
343+
## 总结 $#conclusion$
343344

344-
缓存可能很复杂,但是从应用程序或站点用户可以获得的收益来看,这值得付出努力。想要了解更多信息,请查看下面 *进一步阅读* 部分。
345+
缓存可能很复杂,但是从应用程序或站点用户可以获得的收益来看,这值得付出努力。想要了解更多信息,请查看下面 **进一步阅读** 部分。

0 commit comments

Comments
 (0)