Skip to content

Commit 77b5249

Browse files
authoredFeb 8, 2024
docs: modify the docs to make them better (#5292)
Modify the docs to make them easier to understand in Chinese.
1 parent d771fdf commit 77b5249

35 files changed

+2315
-2533
lines changed
 

‎site/docs/advanced/cluster-client.zh-CN.md

+88-93
Large diffs are not rendered by default.

‎site/docs/advanced/framework.zh-CN.md

+71-75
Large diffs are not rendered by default.

‎site/docs/advanced/loader-update.zh-CN.md

+10-7
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ order: 6
1010

1111
## beforeStart 函数替代
1212

13-
我们通常在 app.js 中通过 `module.export` 中传入的 `app` 参数进行此函数的操作,一个典型的例子:
13+
我们通常在 `app.js` 中通过 `module.exports` 中传入的 `app` 参数进行此函数的操作,一个典型的例子:
1414

1515
```js
1616
module.exports = (app) => {
@@ -20,7 +20,7 @@ module.exports = (app) => {
2020
};
2121
```
2222

23-
现在升级之后的写法略有改变 —— 我们可以直接在 `app.js` 中用类方法的形式体现出来对于应用开发而言,我们应该写在 `willReady` 方法中;对于插件则写在 `didLoad` 中。形式如下:
23+
现在升级之后的写法略有改变 —— 我们可以直接在 `app.js` 中用类方法的形式体现出来对于应用开发而言,应该写在 `willReady` 方法中;对于插件则写在 `didLoad` 中。形式如下:
2424

2525
```js
2626
// app.js 或 agent.js 文件:
@@ -30,17 +30,18 @@ class AppBootHook {
3030
}
3131

3232
async didLoad() {
33-
// 请将你的插件项目中 app.beforeStart 中的代码置于此处
33+
// 请将你的插件项目中 app.beforeStart 中的代码置于此处
3434
}
3535

3636
async willReady() {
37-
// 请将你的应用项目中 app.beforeStart 中的代码置于此处
37+
// 请将你的应用项目中 app.beforeStart 中的代码置于此处
3838
}
3939
}
4040

4141
module.exports = AppBootHook;
4242
```
4343

44+
4445
## ready 函数替代
4546

4647
同样地,我们之前在 `app.ready` 中处理我们的逻辑:
@@ -63,13 +64,14 @@ class AppBootHook {
6364
}
6465

6566
async didReady() {
66-
// 请将您的 app.ready 中的代码置于此处
67+
// 请将你的 app.ready 中的代码置于此处
6768
}
6869
}
6970

7071
module.exports = AppBootHook;
7172
```
7273

74+
7375
## beforeClose 函数替代
7476

7577
原先的 `app.beforeClose` 如以下形式:
@@ -92,11 +94,12 @@ class AppBootHook {
9294
}
9395

9496
async beforeClose() {
95-
// 请将您的 app.beforeClose 中的代码置于此处
97+
// 请将你的 app.beforeClose 中的代码置于此处
9698
}
9799
}
100+
module.exports = AppBootHook;
98101
```
99102

100103
## 其它说明
101104

102-
本教程只是一对一地讲了替换方法,便于开发者们快速上手进行替换若想要具体了解整个 Loader 原理以及生命周期的完整函数版本,请参考[加载器](./loader.md)[启动自定义](../basics/app-start.md)两篇文章。
105+
本教程只是一对一地讲了替换方法,便于开发者们快速上手进行替换若想要具体了解整个 Loader 原理以及生命周期的完整函数版本,请参考[加载器](./loader.md)》和《[启动自定义](../basics/app-start.md)两篇文章。

‎site/docs/advanced/loader.zh-CN.md

+168-171
Large diffs are not rendered by default.

‎site/docs/advanced/plugin.zh-CN.md

+105-120
Large diffs are not rendered by default.

‎site/docs/advanced/view-plugin.zh-CN.md

+53-55
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@ title: View 插件开发
33
order: 5
44
---
55

6-
绝大多数情况,我们都需要读取数据后渲染模板,然后呈现给用户,而框架并不强制使用某种模板引擎,由开发者来自行选型,具体参见[模板渲染](../core/view.md)
6+
绝大多数情况下,我们都需要读取数据后渲染模板,然后呈现给用户。框架并不强制使用某种模板引擎,由开发者自行选型,具体参见[模板渲染](../core/view.md)
77

8-
本文将阐述框架对 View 插件的规范约束, 我们可以依此来封装对应的模板引擎插件。以下以 [egg-view-ejs] 为例。
8+
本文将阐述框架对 View 插件的规范约束我们可以依此来封装对应的模板引擎插件。以下以 [egg-view-ejs](https://github.com/eggjs/egg-view-ejs) 为例。
99

1010
## 插件目录结构
11-
1211
```bash
1312
egg-view-ejs
1413
├── config
@@ -25,45 +24,43 @@ egg-view-ejs
2524

2625
## 插件命名规范
2726

28-
- 遵循[插件开发规范](./plugin.md)
29-
- 插件命名约定以 `egg-view-` 开头
30-
- `package.json` 配置如下,插件名以模板引擎命名,比如 ejs
31-
32-
```json
33-
{
34-
"name": "egg-view-ejs",
35-
"eggPlugin": {
36-
"name": "ejs"
37-
},
38-
"keywords": ["egg", "egg-plugin", "egg-view", "ejs"]
39-
}
40-
```
27+
- 遵循[插件开发规范](./plugin.md)
28+
- 插件命名约定以 `egg-view-` 开头。
29+
- `package.json` 的配置如下,插件名以模板引擎命名,例如 ejs:
4130

42-
- 配置项也以模板引擎命名
31+
```json
32+
{
33+
"name": "egg-view-ejs",
34+
"eggPlugin": {
35+
"name": "ejs"
36+
},
37+
"keywords": ["egg", "egg-plugin", "egg-view", "ejs"]
38+
}
39+
```
4340

44-
```js
45-
// config/config.default.js
46-
module.exports = {
47-
ejs: {},
48-
};
49-
```
41+
- 配置项也以模板引擎命名:
42+
43+
```js
44+
// config/config.default.js
45+
exports.ejs = {};
46+
```
5047

5148
## View 基类
5249

53-
接下来需提供一个 View 基类,这个类会在每次请求实例化
50+
接下来需提供一个 View 基类,这个类会在每次请求时实例化
5451

55-
View 基类需提供 `render``renderString` 两个方法,支持 generator function 和 async function(也可以是函数返回一个 Promise)。`render` 方法用于渲染文件,而 `renderString` 方法用于渲染模板字符串。
52+
View 基类需要提供 `render``renderString` 两个方法,支持 generator function 和 async function(也可以是函数返回一个 Promise)。`render` 方法用于渲染文件,而 `renderString` 方法用于渲染模板字符串。
5653

57-
以下为简化代码,可直接[查看源码](https://github.com/eggjs/egg-view-ejs/blob/master/lib/view.js)
54+
以下为简化代码,您可以直接[查看源码](https://github.com/eggjs/egg-view-ejs/blob/master/lib/view.js)
5855

5956
```js
6057
const ejs = require('ejs');
6158

62-
module.exports = class EjsView {
59+
class EjsView {
6360
render(filename, locals) {
6461
return new Promise((resolve, reject) => {
6562
// 异步调用 API
66-
ejs.renderFile(filename, locals, (err, result) => {
63+
ejs.renderFile(filename, locals, function(err, result) {
6764
if (err) {
6865
reject(err);
6966
} else {
@@ -81,68 +78,69 @@ module.exports = class EjsView {
8178
return Promise.reject(err);
8279
}
8380
}
84-
};
81+
}
82+
83+
module.exports = EjsView;
8584
```
8685

8786
### 参数
8887

89-
`render` 方法的三个参数
90-
91-
- filename: 是完整的文件的路径,框架查找文件时已确认文件是否存在,这里不需要处理
92-
- locals: 渲染所需的数据,数据来自 `app.locals``ctx.locals` 和调用 `render` 方法传入的。框架还内置了 `ctx``request`, `ctx.helper` 这几个对象。
93-
- viewOptions: 用户传入的配置,可覆盖模板引擎的默认配置,这个可根据模板引擎的特征考虑是否支持。比如默认开启了缓存,而某个页面不需要缓存。
88+
- `render` 方法的参数:
89+
- `filename`:是完整文件路径,框架查找文件时已确认文件是否存在,因此这里不需要处理。
90+
- `locals`:渲染所需数据,来源包括 `app.locals``ctx.locals` 以及调用 `render` 方法传入的数据。框架还内置了 `ctx``request``ctx.helper` 这几个对象。
91+
- `viewOptions`:用户传入的配置,可以覆盖模板引擎的默认配置。这个可根据模板引擎的特征考虑是否支持。例如,默认开启了缓存,而某个页面不需要缓存。
9492

95-
`renderString` 方法的三个参数
93+
- `renderString` 方法的三个参数
9694

97-
- tpl: 模板字符串,没有文件路径。
98-
- locals: 同 `render`
99-
- viewOptions: 同 `render`
95+
- `tpl`: 模板字符串,没有文件路径。
96+
- `locals`: 同 `render`
97+
- `viewOptions`: 同 `render`
10098

10199
## 插件配置
102100

103-
根据上面的命名约定,配置名一般为模板引擎的名字,比如 ejs。
101+
根据上述的命名约定,配置名通常为模板引擎的名称,例如 ejs。
104102

105-
插件的配置主要来自模板引擎的配置,可根据具体情况定义配置项,如 [ejs 的配置](https://github.com/mde/ejs#options)
103+
插件的配置主要来源于模板引擎的配置,可根据具体情况定义配置项目,如 [ejs 的配置](https://github.com/mde/ejs#options)
106104

107105
```js
108106
// config/config.default.js
109107
module.exports = {
110108
ejs: {
111-
cache: true,
112-
},
109+
cache: true
110+
}
113111
};
114112
```
115113

116114
### helper
117115

118-
框架本身提供了 `ctx.helper` 供开发者使用,但有些情况下,我们希望对 helper 方法进行覆盖,仅在模板渲染时生效
116+
框架本身提供了 `ctx.helper` 供开发者使用。但在某些情况下,我们希望覆盖 helper 方法,使其仅在模板渲染时生效
119117

120-
在模板渲染中,我们经常会需要输出用户提供的 html 片段,通常需要使用 `egg-security` 插件提供的 `helper.shtml` 清洗下
118+
在模板渲染中,我们经常需要输出用户提供的 HTML 片段,这通常需要使用 `egg-security` 插件提供的 `helper.shtml` 方法进行清洗:
121119

122120
```html
123121
<div>{{ helper.shtml(data.content) | safe }}</div>
124122
```
125123

126-
但如上代码所示,我们需要加上 ` | safe` 来告知模板引擎,该 html 是安全的,无需再次 `escape`直接渲染
124+
但如上所示,我们需要加上 `| safe` 来告知模板引擎,该 HTML 是安全的,无需再次 `escape`可以直接渲染
127125

128-
而这样用起来比较麻烦,而且容易遗忘,所以我们可以封装下
126+
这样使用起来比较繁琐,而且容易忘记。所以,我们可以进行封装
129127

130-
- 先提供一个 helper 子类:
128+
- 首先提供一个 helper 子类:
131129

132130
```js
133131
// {plugin_root}/lib/helper.js
134132
module.exports = (app) => {
135133
return class ViewHelper extends app.Helper {
136-
// safe [egg-view-nunjucks] 注入,在渲染时不会转义,
137-
// 否则在模板调用 shtml 会被转义
134+
// `safe` 是由 [egg-view-nunjucks] 注入的,在渲染时不会进行转义。
135+
// 否则在模板调用 `shtml` 时,内容会被转义。
138136
shtml(str) {
139137
return this.safe(super.shtml(str));
140138
}
141139
};
142140
};
143141
```
144142

145-
- 在渲染时使用自定义的 helper
143+
- 在渲染时使用我们自定义的 helper
146144

147145
```js
148146
// {plugin_root}/lib/view.js
@@ -152,16 +150,16 @@ module.exports = class MyCustomView {
152150
render(filename, locals) {
153151
locals.helper = new ViewHelper(this.ctx);
154152

155-
// 调用 Nunjucks render
153+
// 调用 Nunjucks render 方法
156154
}
157155
};
158156
```
159157

160-
具体代码可[查看](https://github.com/eggjs/egg-view-nunjucks/blob/2ee5ee992cfd95bc0bb5b822fbd72a6778edb118/lib/view.js#L11)
158+
具体代码可以在[这里](https://github.com/eggjs/egg-view-nunjucks/blob/2ee5ee992cfd95bc0bb5b822fbd72a6778edb118/lib/view.js#L11)查看。
161159

162160
### 安全相关
163161

164-
模板和安全息息相关,[egg-security] 也给模板提供了一些方法,模板引擎可以根据需求使用
162+
模板与安全密不可分。[egg-security] 也为模板提供了一些方法。模板引擎可以根据需求使用这些方法
165163

166164
首先声明对 [egg-security] 的依赖:
167165

@@ -175,11 +173,11 @@ module.exports = class MyCustomView {
175173
}
176174
```
177175

178-
此外,框架提供了 [app.injectCsrf](../core/security.md#appinjectcsrfstr) [app.injectNonce](../core/security.md#appinjectnoncestr),更多可查看[安全章节](../core/security.md)
176+
除此之外,框架还提供了 [app.injectCsrf](../core/security.md#appinjectcsrfstr) [app.injectNonce](../core/security.md#appinjectnoncestr) 方法。更多内容可查看[安全章节](../core/security.md)
179177

180178
### 单元测试
181179

182-
作为一个高质量的插件,完善的单元测试是必不可少的,我们也提供了很多辅助工具使插件开发者可以无痛的编写测试,具体参见[单元测试](../core/unittest.md)[插件](./plugin.md)中的相关内容
180+
为了确保插件的高质量,完善的单元测试是不可或缺的。我们也提供了很多辅助工具,以帮助插件开发者毫无障碍地编写测试。具体内容请参见[单元测试](../core/unittest.md)[插件](./plugin.md)相关章节
183181

184182
[egg-security]: https://github.com/eggjs/egg-security
185183
[egg-view-nunjucks]: https://github.com/eggjs/egg-view-nunjucks
+72-74
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,80 @@
11
---
2+
23
title: 代码贡献规范
4+
35
---
46

5-
有任何疑问,欢迎提交 [issue](https://github.com/eggjs/egg/issues)
6-
或者直接修改提交 [PR](https://github.com/eggjs/egg/pulls)!
7+
有任何疑问,欢迎提交 [issue](https://github.com/eggjs/egg/issues),或者直接修改提交 [PR](https://github.com/eggjs/egg/pulls)
78

89
## 提交 issue
910

1011
- 请确定 issue 的类型。
1112
- 请避免提交重复的 issue,在提交之前搜索现有的 issue。
12-
- 在标签(分类参考**标签分类**), 标题 或者内容中体现明确的意图
13+
- 在标签分类参考 **标签分类**)、标题或者内容中体现明确的意图
1314

14-
随后 egg 负责人会确认 issue 意图,更新合适的标签,关联 milestone,指派开发者。
15+
随后,Egg 负责人会确认 issue 意图,更新合适的标签,关联 milestone,指派开发者。
1516

16-
标签可分为两类type 和 scope
17+
标签可分为两类type 和 scope
1718

18-
- type: issue 的类型,如 `feature`, `bug`, `documentation`, `performance`, `support` ...
19-
- scope: 修改文件的范围,如 `core: xx``plugin: xx``deps: xx`
19+
- typeissue 的类型,如 `feature``bug``documentation``performance``support` 等。
20+
- scope修改文件的范围,如 `core: xx``plugin: xx``deps: xx` 等。
2021

2122
### 常用标签说明
2223

23-
- `support`: issue 提出的问题需要开发者协作排查,咨询,调试等等日常技术支持。
24-
- `bug`: 一旦发现可能是 bug 的问题,请打上 `bug`,然后等待确认,一旦确认是 bug,此 issue 会被再打上 `confirmed`
25-
- 此时 issue 会被非常高的优先级进行处理。
26-
- 如果此 bug 是正在影响线上应用正常运行,会再打上 `critical`,代表是最高优先级,需要马上立刻处理!
27-
- bug 会在最低需要修复的版本进行修复,如是在 `0.9.x` 要修复的,而当前最新版本是 `1.1.x`
28-
那么此 issue 还会被打上 `0.9``0.10``1.0``1.1`,代表需要修复到这些版本。
29-
- `core: xx`: 代表 issue 跟 core 内核相关,如 `core: antx` 代表跟 `antx` 配置相关。
30-
- `plugin: xx`: 代表 issue 跟插件相关,如 `deps: session` 代表跟 `session` 插件相关。
31-
- `deps: xx`: 代表 issue 跟 `dependencies` 模块相关,如 `deps: egg-cors` 代表跟 `egg-cors` 模块相关。
32-
- `chore: documentation`: 代表发现了文档相关问题,需要修复文档说明。
33-
- `cbd`: 代表跟服务器部署相关
24+
- `support`:issue 提出的问题需要开发者协作排查、咨询、调试等日常技术支持。
25+
- `bug`:一旦发现可能是 bug 的问题,请打上 `bug`,然后等待确认。一旦确认是 bug,此 issue 会被再打上 `confirmed`
26+
- 此时,issue 会被非常高的优先级进行处理。
27+
- 如果此 bug 正在影响线上应用正常运行,会再打上 `critical`,代表是最高优先级,需要马上处理!
28+
- bug 会在最低需要修复的版本进行修复,如在 `0.9.x` 版本需要修复,而当前最新版本是 `1.1.x`,那么此 issue 还会被打上 `0.9``0.10``1.0``1.1` 标签,代表需要修复到这些版本。
29+
- `core: xx`:代表 issue 跟 core 内核相关,如 `core: antx` 代表跟 `antx` 配置相关。
30+
- `plugin: xx`:代表 issue 跟插件相关,如 `deps: session` 代表跟 `session` 插件相关。
31+
- `deps: xx`:代表 issue 跟 `dependencies` 模块相关,如 `deps: egg-cors` 代表跟 `egg-cors` 模块相关。
32+
- `chore: documentation`:代表发现了文档相关问题,需要修复文档说明。
33+
- `cbd`:代表跟服务器部署相关。
3434

3535
## 编写文档
3636

37-
所有功能点必须提交配套文档文档须满足以下要求
37+
所有功能点必须提交配套文档文档须满足以下要求
3838

39-
- 必须说清楚问题的几个方面:what(是什么),why(为什么),how(怎么做),可根据问题的特性有所侧重。
40-
- how 部分必须包含详尽完整的操作步骤,必要时附上 **足够简单,可运行** 的范例代码,
41-
所有范例代码放在 [eggjs/examples](https://github.com/eggjs/examples) 库中。
42-
- 提供必要的链接,如申请流程,术语解释和参考文档等。
39+
- 必须说清楚问题的几个方面:what(是什么)、why(为什么)、how(怎么做),可根据问题的特性有所侧重。
40+
- how 部分必须包含详尽完整的操作步骤,必要时附上 **足够简单,可运行** 的范例代码。所有范例代码放在 [eggjs/examples](https://github.com/eggjs/examples) 库中。
41+
- 提供必要的链接,如申请流程、术语解释和参考文档等。
4342
- 同步修改中英文文档,或者在 PR 里面说明。
4443

4544
## 提交代码
4645

4746
### 提交 Pull Request
4847

49-
如果你有仓库的开发者权限,而且希望贡献代码,那么你可以创建分支修改代码提交 PR,egg 开发团队会 review 代码合并到主干。
48+
如果你有仓库的开发者权限,而且希望贡献代码,那么你可以创建分支修改代码提交 PR。Egg 开发团队会 review 代码合并到主干。
5049

5150
```bash
5251
# 先创建开发分支开发,分支名应该有含义,避免使用 update、tmp 之类的
5352
$ git checkout -b branch-name
5453

5554
# 开发完成后跑下测试是否通过,必要时需要新增或修改测试用例
5655
$ npm test
57-
56+
```
5857
# 测试通过后,提交代码,message 见下面的规范
5958

60-
$ git add . # git add -u 删除文件
61-
$ git commit -m "fix(role): role.use must xxx"
59+
```
60+
$ git add .
61+
$ git commit -m "fix(role): role.use 必须 xxx"
6262
$ git push origin branch-name
6363
```
6464

6565
由于谁也无法保证过了多久之后还记得多少,为了后期回溯历史的方便,请在提交 MR 时确保提供了以下信息。
66-
6766
1. 需求点(一般关联 issue 或者注释都算)
6867
2. 升级原因(不同于 issue,可以简要描述下为什么要处理)
6968
3. 框架测试点(可以关联到测试文件,不用详细描述,关键点即可)
7069
4. 关注点(针对用户而言,可以没有,一般是不兼容更新等,需要额外提示)
7170

7271
### 代码风格
7372

74-
你的代码风格必须通过 eslint,你可以运行 `$ npm run lint` 本地测试
73+
你的代码风格必须通过 eslint,你可以运行 `$ npm run lint` 进行本地测试
7574

7675
### Commit 提交规范
7776

78-
根据 [angular 规范](https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md#commit-message-format)提交 commit,
77+
根据 [Angular 规范](https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md#commit-message-format)提交 commit,
7978
这样 history 看起来更加清晰,还可以自动生成 changelog。
8079

8180
```xml
@@ -88,52 +87,52 @@ $ git push origin branch-name
8887

8988
(1)type
9089

91-
提交 commit 的类型,包括以下几种
90+
提交 commit 的类型,包括以下几种
9291

93-
- feat: 新功能
94-
- fix: 修复问题
95-
- docs: 修改文档
96-
- style: 修改代码格式,不影响代码逻辑
97-
- refactor: 重构代码,理论上不影响现有功能
98-
- perf: 提升性能
99-
- test: 增加修改测试用例
100-
- chore: 修改工具相关(包括但不限于文档、代码生成等)
101-
- deps: 升级依赖
92+
- feat新功能
93+
- fix修复问题
94+
- docs修改文档
95+
- style修改代码格式,不影响代码逻辑
96+
- refactor重构代码,理论上不影响现有功能
97+
- perf提升性能
98+
- test增加修改测试用例
99+
- chore修改工具相关(包括但不限于文档、代码生成等)
100+
- deps升级依赖
102101

103102
(2)scope
104103

105-
修改文件的范围(包括但不限于 doc, middleware, core, config, plugin)
104+
修改文件的范围(包括但不限于 docmiddlewarecoreconfigplugin)
106105

107106
(3)subject
108107

109-
用一句话清楚的描述这次提交做了什么
108+
用一句话清楚的描述这次提交做了什么
110109

111110
(4)body
112111

113112
补充 subject,适当增加原因、目的等相关因素,也可不写。
114113

115114
(5)footer
116115

117-
- **当有非兼容修改(Breaking Change)时必须在这里描述清楚**
116+
- **当有非兼容修改Breaking Change时必须在这里描述清楚**
118117
- 关联相关 issue,如 `Closes #1, Closes #2, #3`
119-
- 如果功能点有新增或修改的,还需要关联文档 `doc``egg-core` 的 PR,如 `eggjs/egg-core#123`
118+
- 如果功能点有新增或修改的,还需要关联文档 `doc` `egg-core` 的 PR,如 `eggjs/egg-core#123`
120119

121120
示例
122121

123122
```
124-
fix($compile): [BREAKING_CHANGE] couple of unit tests for IE9
123+
fix($compile): couple of unit tests for IE9
125124
126-
Older IEs serialize html uppercased, but IE9 does not...
127-
Would be better to expect case insensitive, unfortunately jasmine does
128-
not allow to user regexps for throw expectations.
125+
Older IEs serialize HTML uppercased, but IE9 does not...
126+
Would be better to expect case insensitive, unfortunately Jasmine does
127+
not allow to use regexps for throw expectations.
129128
130129
Document change on eggjs/egg#123
131130
132131
Closes #392
133132
134133
BREAKING CHANGE:
135134
136-
Breaks foo.bar api, foo.baz should be used instead
135+
Breaks foo.bar API, use foo.baz instead.
137136
```
138137

139138
详情请查看具体[文档](https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit)
@@ -142,53 +141,52 @@ BREAKING CHANGE:
142141

143142
英语正文按照一般英语语法规律书写即可,但标题比较特殊,应该按照以下规范进行书写:
144143

145-
- 名词、动词、代词、形容词、副词等首字母大写,介词、冠词、连词、感叹词和助词首字母小写_标题第一个单词、最后一个单词无论词性首字母应该大写_
144+
- 名词、动词、代词、形容词、副词等首字母大写,介词、冠词、连词、感叹词和助词首字母小写;标题第一个单词、最后一个单词无论词性首字母应该大写
146145
- 专有名词(如直接引用某个变量,或者某个插件名称等),必须使用反单引号(键盘上 Esc 正下方)进行引用,并保持原来大小写。
147146
- 超过 5 个字母的介词首字母应该大写,否则一律小写。
148-
- 如果是重要提示性标题,或者是专有名称标题(例如 Http 请求方法:GET,POST,PUT,DELETE),可以全部字母都用大写(慎重考虑)。
147+
- 如果是重要提示性标题,或者是专有名称标题(例如 HTTP 请求方法:GET,POST,PUT,DELETE),可以全部字母都用大写(慎重考虑)。
149148
- 如果标题属于“动宾”性质的短语(如“配置管理”),尽量翻译成“宾+动词名词”的形式(Configuration Management),或者是“动名词+宾语”的形式(Managing Configuration)。
150-
- 如果标题被当做一个完整的英语句子,请按照英语句子的语法格式大小写(:常见问题 FAQ 中每一个标题都是一个英语句子)。
149+
- 如果标题被当做一个完整的英语句子,请按照英语句子的语法格式大小写(例如:常见问题 FAQ 中每一个标题都是一个英语句子)。
151150

152151
有关详情,可以参考[英语标题大小写]
153-
154152
## 发布管理
155153

156-
egg 基于 [semver] 语义化版本号进行发布
154+
Egg 基于 [semver](语义化版本号)进行发布
157155

158156
### 分支策略
159157

160158
`master` 分支为当前稳定发布的版本,`next` 分支为下一个开发中的大版本。
161159

162-
- 只维护两个版本除非有安全问题,否则修复只会 patch 到 `master``next` 分支,其他更新推动上层框架升级到稳定大版本的最新版本
163-
- 所有 API 的废弃都需要在当前的稳定版本上 `deprecate` 提示,并保证在当前的稳定版本上一直兼容到新版本的发布
164-
- `master` 分支不设置 publish tag上层框架基于 semver 依赖稳定版本。
165-
- `next` 分支设置 tag 为 `next`上层框架可以通过 `egg@next` 引用开发中的版本进行测试。
166-
- egg 持续维护的版本以 Milestone 为准,只要是开着的版本都会进行修复
160+
- 只维护两个版本除非有安全问题,否则修复只会合并到 `master``next` 分支。我们鼓励上层框架升级到稳定大版本的最新版本
161+
- 所有 API 的废弃都需要在当前的稳定版本上添加 `deprecate` 提示,并保证兼容到新版本发布
162+
- `master` 分支不设置 publish tag上层框架基于 semver 依赖稳定版本。
163+
- `next` 分支设置 tag 为 `next`上层框架可以通过 `egg@next` 引用开发中的版本进行测试。
164+
- Egg 持续维护的版本以 Milestone 为准。只要是开着的版本,都会进行修复
167165

168-
### 发布策略
166+
### 发布策略
169167

170-
每个大版本都有一个发布经理管理(PM),他/她要做的事情
168+
每个大版本都有一个发布经理(PM)负责管理。他/她的工作内容包括:
171169

172170
#### 准备工作:
173171

174-
- 建立 milestone,确认需求关联 milestone,指派和更新 issues,[1.x milestone]
172+
- 建立 Milestone,确认需求关联到 Milestone,分配和更新 Issues。[1.x Milestone]
175173
-`master` 分支新建 `next` 分支,并设置 tag 为 `next`
176174

177175
#### 发布前:
178176

179-
- 确认当前 Milestone 所有的 issue 都已关闭或可延期,完成性能测试
180-
- 发起一个新的 [Release Proposal MR],按照 [node CHANGELOG] 进行 `History` 的编写修正文档中与版本相关的内容,commits 可以自动生成。
177+
- 确认当前 Milestone 所有的 Issue 都已关闭,或可以延期。并完成性能测试
178+
- 发起一个新的 [Release Proposal MR],按照 [Node CHANGELOG] 进行 `History` 的编写修正文档中与版本相关的内容,commits 可通过以下命令自动生成:
181179
```bash
182180
$ npm run commits
183181
```
184182
- 指定下一个大版本的 PM。
185183

186184
#### 发布时:
187185

188-
- 将老的稳定版本(master)备份到以当前大版本为名字的分支上(例如 `1.x`),并设置 tag 为 `release-{v}.x` v 为当前版本,例如 `release-1.x`)。
189-
-`next` 分支推送到 `master`,成为新的稳定版本分支,并去除 `next` tag,修改 README 中与分支相关的内容。
186+
- 将老的稳定版本(`master`)备份到以当前大版本为名的分支上(例如 `1.x`),并设置 tag 为 `release-{v}.x`(v 为当前版本,例如 `release-1.x`)。
187+
-`next` 分支推送到 `master`,成为新的稳定版本分支。去除 `next` tag,并修改 README 中与分支相关的内容。
190188
- 发布新的稳定版本到 [npm],并通知上层框架进行更新。
191-
- `npm publish` 之前,请先阅读 [我是如何发布一个 npm 包的]
189+
- 在执行 `npm publish` 之前,请先阅读 [我是如何发布一个 npm 包的]
192190

193191
上述描述中所有的设置 tag 都是指在 `package.json` 中设置 npm 的 tag。
194192

@@ -198,10 +196,10 @@ egg 基于 [semver] 语义化版本号进行发布。
198196
}
199197
```
200198

201-
[semver]: https://semver.org/lang/zh-CN/
202-
[release proposal mr]: https://github.com/nodejs/node/pull/4181
203-
[node changelog]: https://github.com/nodejs/node/blob/master/CHANGELOG.md
204-
[1.x milestone]: https://github.com/eggjs/egg/milestone/1
205-
[npm]: http://npmjs.com/
206-
[我是如何发布一个 npm 包的]: https://fengmk2.com/blog/2016/how-i-publish-a-npm-package
207-
[英语标题大小写]: https://headlinecapitalization.com/
199+
[semver]: https://semver.org/lang/zh-CN/
200+
[Release Proposal MR]: https://github.com/nodejs/node/pull/4181
201+
[Node CHANGELOG]: https://github.com/nodejs/node/blob/master/CHANGELOG.md
202+
[1.x Milestone]: https://github.com/eggjs/egg/milestone/1
203+
[npm]: http://npmjs.com/
204+
[我是如何发布一个 npm 包的]: https://fengmk2.com/blog/2016/how-i-publish-a-npm-package
205+
[英语标题大小写]: https://headlinecapitalization.com/

‎site/docs/community/faq.zh-CN.md

+20-20
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,23 @@ order: 3
77

88
## 如何高效地反馈问题?
99

10-
感谢您向我们反馈问题
10+
感谢你向我们反馈问题
1111

12-
1. 我们推荐如果是小问题(错别字修改小的 bug fix)直接提交 PR。
12+
1. 我们推荐如果是小问题(错别字修改小的 bug 修复)直接提交 PR。
1313
2. 如果是一个新需求,请提供:详细需求描述,最好是有伪代码示意。
14-
3. 如果是一个 BUG,请提供:复现步骤错误日志以及相关配置,并尽量填写下面的模板中的条目。
14+
3. 如果是一个 BUG,请提供:复现步骤错误日志以及相关配置,并尽量填写下面的模板中的条目。
1515
4. **如果可以,尽可能使用 `npm init egg --type=simple bug` 提供一个最小可复现的代码仓库,方便我们排查问题。**
16-
5. 不要挤牙膏似的交流,扩展阅读:[如何向开源项目提交无法解答的问题](https://zhuanlan.zhihu.com/p/25795393)
16+
5. 不要挤牙膏似的交流,扩展阅读:[如何向开源项目提交无法解答的问题](https://zhuanlan.zhihu.com/p/25795393)
1717

18-
最重要的是,请明白一件事:开源项目的用户和维护者之间并不是甲方和乙方的关系issue 也不是客服工单。在开 issue 的时候,请抱着一种『一起合作来解决这个问题』的心态,不要期待我们单方面地为你服务。
18+
最重要的是,请明白一件事:开源项目的用户和维护者之间并不是甲方和乙方的关系issue 也不是客服工单。在开 issue 的时候,请抱着一种『我们一起合作来解决这个问题』的心态,不要期待我们单方面地为你服务。
1919

2020
## 为什么我的配置不生效?
2121

22-
框架的配置功能比较强大,有不同环境变量,又有框架、插件、应用等很多地方配置
22+
框架的配置功能比较强大,有不同环境变量,还有框架、插件、应用等多个配置
2323

24-
如果你分析问题时,想知道当前运行时使用的最终配置,可以查看下 `${root}/run/application_config.json`(worker 进程配置) `${root}/run/agent_config.json`(agent 进程配置) 这两个文件。`root` 为应用根目录,只有在 local 和 unittest 环境下为项目所在目录,其他环境下都为 HOME 目录
24+
如果你在分析问题时想知道当前运行时使用的最终配置,可以查看下 `${root}/run/application_config.json`(worker 进程配置)和 `${root}/run/agent_config.json`(agent 进程配置)这两个文件。(`root` 为应用根目录,只有在 local 和 unittest 环境下为项目所在目录,其他环境下为 HOME 目录)
2525

26-
也可参见[配置文件](../basics/config.md#配置结果)
26+
也可以参见[配置文件](../basics/config.md#配置结果)
2727

2828
PS:请确保没有写出以下代码:
2929

@@ -39,19 +39,19 @@ module.exports = (appInfo) => {
3939

4040
## 线上的日志打印去哪里了?
4141

42-
默认配置下,本地开发环境的日志都会打印在应用根目录的 `logs` 文件夹下(`${baseDir}/logs`) ,但是在非开发期的环境(非 local 和 unittest 环境),所有的日志都会打印到 `$HOME/logs` 文件夹下(例如 `/home/admin/logs`)。这样可以让本地开发时应用日志互不影响,服务器运行时又有统一的日志输出目录。
42+
默认配置下,本地开发环境的日志都会打印在应用根目录的 `logs` 文件夹下 (`${baseDir}/logs`),但在非开发期的环境(非 local 和 unittest 环境)中,所有日志都会打印到 `$HOME/logs` 文件夹下(例如 `/home/admin/logs`)。这样可以让本地开发时应用日志互不影响,服务器运行时又有统一的日志输出目录。
4343

44-
## 进程管理为什么没有选型 PM2
44+
## 进程管理为什么没有选型 PM2?
4545

4646
1. PM2 模块本身复杂度很高,出了问题很难排查。我们认为框架使用的工具复杂度不应该过高,而 PM2 自身的复杂度超越了大部分应用本身。
4747
2. 没法做非常深的优化。
48-
3. 切实的需求问题,一个进程里跑 leader,其他进程代理到 leader 这种模式([多进程模型](../core/cluster-and-ipc.md)),在企业级开发中对于减少远端连接,降低数据通信压力等都是切实的需求。特别当应用规模大到一定程度,这就会是刚需。egg 本身起源于蚂蚁金服和阿里,我们对标的起点就是大规模企业应用的构建,所以要非常全面。这些特性通过 PM2 很难做到
48+
3. 切实需要解决如:多个进程中有一个充当 leader,其他进程则通过代理的方式将请求转发给 leader 这种模式([多进程模型](../core/cluster-and-ipc.md)),这在企业级开发中可以减少远端连接,降低数据通信压力。特别是当应用规模大到一定程度时,这就会是必需。egg 起源于蚂蚁金服和阿里,我们的起点就是大规模企业应用的构建,所以需要非常全面。这些特性通过 PM2 很难实现
4949

50-
进程模型非常重要,会影响到开发模式,运行期间的深度优化等,我们认为可能由框架来控制比较合适。
50+
进程模型非常重要,会影响开发模式以及运行期间的深度优化等,我们认为可能由框架来控制比较合适。
5151

5252
**如何使用 PM2 启动应用?**
5353

54-
尽管我们不推荐使用 PM2 启动,但仍然是可以做到的
54+
尽管我们不推荐使用 PM2 启动,你仍然可以这样做
5555

5656
首先,在项目根目录定义启动文件:
5757

@@ -66,7 +66,7 @@ egg.startCluster({
6666
});
6767
```
6868

69-
这样,我们就可以通过 PM2 进行启动了
69+
接着,就可以通过 PM2 启动
7070

7171
```bash
7272
pm2 start server.js
@@ -79,16 +79,16 @@ pm2 start server.js
7979
- `missing csrf token`
8080
- `invalid csrf token`
8181

82-
Egg 内置的 [egg-security](https://github.com/eggjs/egg-security/) 插件默认对所有非安全的方法,例如 `POST``PUT``DELETE` 都进行 CSRF 校验。
82+
Egg 内置的 [egg-security](https://github.com/eggjs/egg-security/) 插件默认对所有非安全的方法,例如 `POST``PUT``DELETE`都进行 CSRF 校验。
8383

84-
请求遇到 csrf 报错通常是因为没有加正确的 csrf token 导致,具体实现方式,请阅读[安全威胁 CSRF 的防范](../core/security.md#安全威胁csrf的防范)
84+
遇到 csrf 报错通常是因为没有加正确的 csrf token 导致的,具体实现方式,请阅读[安全威胁 CSRF 的防范](../core/security.md#安全威胁csrf的防范)
8585

8686
## 本地开发时,修改代码后为什么 worker 进程没有自动重启?
8787

88-
没有自动重启的情况一般是在使用 Jetbrains 旗下软件(IntelliJ IDEA, WebStorm..),并且开启了 Safe Write 选项
88+
worker 进程没有自动重启的情形通常发生在使用 Jetbrains 旗下软件(例如 IntelliJ IDEAWebStorm),并且开启了 Safe Write 选项时
8989

90-
Jetbrains [Safe Write 文档](https://www.jetbrains.com/help/webstorm/2016.3/system-settings.html)中有提到(翻译如下):
90+
Jetbrains [Safe Write 文档](https://www.jetbrains.com/help/webstorm/2016.3/system-settings.html) 中有提到(翻译如下):
9191

92-
> 如果此复选框打钩,变更的文件将首先被存储在一个临时文件中。如果成功保存了该文件,那么就会被这个文件所取代(从技术上来说,原文件被删除,临时文件被重命名)。
92+
>如果此复选框打钩,变更的文件将首先被存储在一个临时文件中。如果文件保存成功,则临时文件会替换原文件(从技术上讲,原文件被删除,临时文件被重命名)。
9393
94-
由于使用了重命名导致文件监听的失效。解决办法是关掉 Safe Write 选项。(Settings | Appearance & Behavior | System Settings | Use "safe write" 路径可能根据版本有所不同
94+
由于使用了重命名,文件监听失效。解决方法是关闭 Safe Write 选项。(Settings | Appearance & Behavior | System Settings | Use "safe write",路径可能因版本不同有所差异

‎site/docs/community/index.zh-CN.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ nav:
2121
- 其他
2222
- [awesome-egg](https://github.com/eggjs/awesome-egg)
2323
- 文章
24-
- [如何评价阿里开源的企业级 Node.js 框架 Egg?](https://www.zhihu.com/question/50526101/answer/144952130) by [@天猪](https://github.com/atian25)
24+
- [如何评价阿里开源的企业级 Node.js 框架 Egg?](https://www.zhihu.com/question/50526101/answer/144952130) [@天猪](https://github.com/atian25) 提供
2525
- 你也可以到[知乎专栏](https://zhuanlan.zhihu.com/eggjs)看我们的文章
2626

2727
## 项目赞助

‎site/docs/community/style-guide.zh-CN.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ class UserService extends Service {
3131
module.exports = UserService;
3232
```
3333

34-
同时,`框架开发者`需要改变写法如下,否则`应用开发者`自定义 Service 等基类会有问题:
34+
同时,框架开发者需要改变写法如下,否则应用开发者自定义 Service 等基类会有问题:
3535

3636
```js
3737
const egg = require('egg');
3838

39-
module.export = Object.assign(egg, {
39+
module.exports = Object.assign(egg, {
4040
Application: class MyApplication extends egg.Application {
4141
// ...
4242
},
@@ -47,8 +47,8 @@ module.export = Object.assign(egg, {
4747
## 私有属性与慢初始化
4848

4949
- 私有属性用 `Symbol` 来挂载。
50-
- Symbol 的描述遵循 jsdoc 的规则描述映射后的类名+属性名。
51-
- 延迟初始化
50+
- `Symbol` 的描述遵循 jsdoc 的规则, 描述映射后的类名 + 属性名。
51+
- 实现延迟初始化
5252

5353
```js
5454
// app/extend/application.js

‎site/docs/core/cluster-and-ipc.zh-CN.md

+111-116
Large diffs are not rendered by default.

‎site/docs/core/cookie-and-session.zh-CN.md

+47-54
Large diffs are not rendered by default.

‎site/docs/core/deployment.zh-CN.md

+47-48
Original file line numberDiff line numberDiff line change
@@ -3,44 +3,44 @@ title: 应用部署
33
order: 3
44
---
55

6-
[本地开发](./development.md)时,我们使用 `egg-bin dev` 来启动服务,但是在部署应用的时候不可以这样使用。因为 `egg-bin dev` 会针对本地开发做很多处理,而生产运行需要一个更加简单稳定的方式。所以本章主要讲解如何部署你的应用
6+
[本地开发](./development.md)时,我们使用 `egg-bin dev` 来启动服务,但在部署应用时不可以这样使用。因为 `egg-bin dev` 会针对本地开发做很多处理,而生产环境需要一个更加简单稳定的方式。本章主要讲解如何部署你的应用
77

8-
一般从源码代码到真正运行,我们会拆分成构建和部署两步,可以做到**一次构建多次部署**
8+
一般从源码到运行,会分为构建和部署两步,实现**一次构建、多次部署**
99

1010
## 构建
1111

12-
JavaScript 语言本身不需要编译的,构建过程主要是下载依赖。但如果使用 TypeScript 或者 Babel 支持 ES6 以上的特性,那就必须要这一步了
12+
JavaScript 语言本身不需要编译,构建过程主要是下载依赖。如果使用 TypeScript Babel 支持 ES6 及以上特性,则必须构建
1313

14-
一般安装依赖会指定 `NODE_ENV=production``npm install --production` 只安装 dependencies 的依赖。因为 devDependencies 中的模块过大而且在生产环境不会使用,安装后也可能遇到未知问题
14+
一般安装依赖时,会指定 `NODE_ENV=production``npm install --production` 仅安装核心依赖。因为开发依赖包体积大,在生产环境不必要,且可能导致问题
1515

1616
```bash
1717
$ cd baseDir
1818
$ npm install --production
1919
$ tar -zcvf ../release.tgz .
2020
```
2121

22-
构建完成后打包成 tgz 文件,部署的时候解压启动就可以了
22+
构建后,将其打包为 tgz 文件。部署时解压启动即可
2323

24-
增加构建环节才能做到真正的**一次构建多次部署**,理论上代码没有改动的时候是不需要再次构建的,可以用原来的包进行部署,这有着不少好处
24+
增加构建环节,能实现真正的**一次构建、多次部署**。理论上,代码未变更时,无需重构,可用原包部署,带来诸多好处
2525

26-
- 构建依赖的环境和运行时是有差异的,所以不要污染运行时环境
27-
- 可以减少发布的时间,而且易回滚,只需要把原来的包重新启动即可
26+
- 构建环境与运行环境差异,避免污染运行环境
27+
- 缩短发布时间,便于回滚,只需重启原包即可
2828

2929
## 部署
3030

31-
服务器需要预装 Node.js,框架支持的 Node 版本为 `>= 14.20.0`
31+
服务器需要预装 Node.js,框架支持 Node 版本 `>= 14.20.0`
3232

33-
框架内置了 [egg-cluster] 来启动 [Master 进程](./cluster-and-ipc.md#master),Master 有足够的稳定性,不再需要使用 [pm2] 等进程守护模块。
33+
框架内置 [egg-cluster] 启动 [Master 进程](./cluster-and-ipc.md#master),Master 稳定,不需 [pm2] 等进程守护模块。
3434

35-
同时,框架也提供了 [egg-scripts] 来支持线上环境的运行和停止
35+
框架同时提供 [egg-scripts] 支持线上运行和停止
3636

37-
首先,我们需要把 `egg-scripts` 模块作为 `dependencies` 引入
37+
首先, `egg-scripts` 模块引入 `dependencies`
3838

3939
```bash
4040
$ npm i egg-scripts --save
4141
```
4242

43-
添加 `npm scripts``package.json`
43+
`package.json` 添加 `npm scripts`
4444

4545
```json
4646
{
@@ -51,84 +51,83 @@ $ npm i egg-scripts --save
5151
}
5252
```
5353

54-
这样我们就可以通过 `npm start``npm stop` 命令启动或停止应用
54+
现在,可以通过 `npm start``npm stop` 启停应用
5555

56-
> 注意:`egg-scripts` 对 Windows 系统的支持有限,参见 [#22](https://github.com/eggjs/egg-scripts/pull/22)
56+
> 注意:Windows 系统下 `egg-scripts` 支持有限,详见 [#22](https://github.com/eggjs/egg-scripts/pull/22)
5757
5858
### 启动命令
5959

6060
```bash
6161
$ egg-scripts start --port=7001 --daemon --title=egg-server-showcase
6262
```
6363

64-
如上示例,支持以下参数
64+
示例支持参数如下
6565

66-
- `--port=7001` 端口号,默认会读取环境变量 `process.env.PORT`如未传递将使用框架内置端口 `7001`
67-
- `--daemon` 是否允许在后台模式,无需 `nohup`。若使用 Docker 建议直接前台运行
68-
- `--env=prod` 框架运行环境,默认会读取环境变量 `process.env.EGG_SERVER_ENV` 如未传递将使用框架内置环境 `prod`
69-
- `--workers=2` 框架 worker 线程数,默认会创建和 CPU 核数相当的 app worker 数,可以充分的利用 CPU 资源。
70-
- `--title=egg-server-showcase` 用于方便 ps 进程时 grep 用,默认为 `egg-server-${appname}`
71-
- `--framework=yadan` 如果应用使用了[自定义框架](../advanced/framework.md),可以配置 `package.json``egg.framework` 或指定该参数。
72-
- `--ignore-stderr` 忽略启动期的报错
73-
- `--https.key` 指定 HTTPS 所需密钥文件的完整路径
74-
- `--https.cert` 指定 HTTPS 所需证书文件的完整路径
66+
- `--port=7001`端口号,默认读取 `process.env.PORT`未传递则使用内置端口 `7001`
67+
- `--daemon`:启用后台模式,不需 `nohup`,使用 Docker 时建议前台运行
68+
- `--env=prod`:运行环境,默认读取 `process.env.EGG_SERVER_ENV`未传递则使用内置 `prod`
69+
- `--workers=2`worker 数,默认创建与 CPU 核数等量的 app worker,利用 CPU 资源。
70+
- `--title=egg-server-showcase`:便于 ps 进程时 grep,未设置默认为 `egg-server-${appname}`
71+
- `--framework=yadan`:使用[自定义框架](../advanced/framework.md)时,配置 `package.json``egg.framework` 或指定该参数。
72+
- `--ignore-stderr`:忽略启动期错误
73+
- `--https.key`HTTPS 密钥路径
74+
- `--https.cert`HTTPS 证书路径
7575

76-
- 所有 [egg-cluster] Options 都支持透传,如 `--port` 等。
76+
[egg-cluster] 的所有 Options 支持透传,如 `--port` 等。
7777

78-
更多参数可查看 [egg-scripts][egg-cluster] 文档。
78+
更多参数见 [egg-scripts][egg-cluster] 文档。
7979

80-
> 注意:`--workers` 默认使用 `process.env.EGG_WORKERS`,或者 `os.cpus().length` 值进行设置,但在 docker `os.cpus().length` 不一定等于分配的核数,获得的值可能较大,导致启动失败,需要手动设置下 `--workers`参见 [#1431](https://github.com/eggjs/egg/issues/1431#issuecomment-573989059)
80+
> 注意:`--workers` 默认由 `process.env.EGG_WORKERS``os.cpus().length` 设置,Docker `os.cpus().length` 可能大于核数,值较大可能导致失败,需手动设置 `--workers`详见 [#1431](https://github.com/eggjs/egg/issues/1431#issuecomment-573989059)
8181
8282
#### 启动配置项
8383

84-
你也可以在 `config.{env}.js` 中配置指定启动配置
84+
`config.{env}.js` 中可指定启动配置
8585

8686
```js
8787
// config/config.default.js
8888

8989
exports.cluster = {
9090
listen: {
9191
port: 7001,
92-
hostname: '127.0.0.1', // 不建议设置 hostname 为 '0.0.0.0',它将允许来自外部网络和来源的连接,请在知晓风险的情况下使用
92+
hostname: '127.0.0.1', // 不建议设置为 '0.0.0.0',可能导致外部连接风险,请了解后使用
9393
// path: '/var/run/egg.sock',
9494
},
9595
};
9696
```
9797

98-
`path``port``hostname` 均为 [server.listen](https://nodejs.org/api/http.html#http_server_listen_port_hostname_backlog_callback) 的参数,`egg-scripts``egg.startCluster` 方法传入的 port 优先级高于此配置。
98+
`path``port``hostname` [server.listen](https://nodejs.org/api/http.html#http_server_listen_port_hostname_backlog_callback) 参数。`egg-scripts``egg.startCluster` 传入的 port 优先级高于此配置。
9999

100100
### 停止命令
101101

102102
```bash
103103
$ egg-scripts stop [--title=egg-server]
104104
```
105105

106-
该命令将杀死 master 进程,并通知 worker 和 agent 优雅退出
106+
该命令杀死 master 进程,并优雅退出 worker 和 agent。
107107

108-
支持以下参数
108+
支持参数
109109

110-
- `--title=egg-server` 用于杀死指定的 egg 应用,未传递则会终止所有的 Egg 应用。
111-
112-
你也可以直接通过 `ps -eo "pid,command" | grep -- "--title=egg-server"` 来找到 master 进程,并 `kill` 掉,无需 `kill -9`
110+
- `--title=egg-server`:杀死指定 Egg 应用,未设置则终止所有 Egg 应用。
113111

112+
也可通过 `ps -eo "pid,command" | grep -- "--title=egg-server"` 查找 master 进程,并 `kill` 掉,不需 `kill -9`
114113
## 监控
115114

116-
我们还需要对服务进行性能监控内存泄露分析故障排除等。
115+
我们还需要对服务进行性能监控内存泄露分析故障排除等。
117116

118117
业界常用的有:
119118

120-
- [Node.js 性能平台(alinode](https://www.aliyun.com/product/nodejs)
119+
- [Node.js 性能平台(Alinode](https://www.aliyun.com/product/nodejs)
121120
- [NSolid](https://nodesource.com/products/nsolid/)
122121

123-
### Node.js 性能平台(alinode
122+
### Node.js 性能平台(Alinode
124123

125-
**注意** Node.js 性能平台 (alinode) 目前仅支持 macOS 和 Linux,不支持 Windows。
124+
**注意**Node.js 性能平台(Alinode)目前仅支持 macOS 和 Linux,不支持 Windows。
126125

127-
[Node.js 性能平台](https://www.aliyun.com/product/nodejs) 是面向所有 Node.js 应用提供 `性能监控、安全提醒、故障排查、性能优化` 等服务的整体性解决方案,提供完善的工具链和服务,协助开发者快速发现和定位线上问题。
126+
[Node.js 性能平台](https://www.aliyun.com/product/nodejs)是面向所有 Node.js 应用提供性能监控、安全提醒、故障排查、性能优化等服务的整体性解决方案。它提供完善的工具链和服务,协助开发者快速发现和定位线上问题。
128127

129128
#### 安装 Runtime
130129

131-
AliNode Runtime 可以直接替换掉 Node.js Runtime,对应版本参见[文档](https://help.aliyun.com/knowledge_detail/60811.html)
130+
Alinode Runtime 可以直接替换掉 Node.js Runtime,对应版本参见[文档](https://help.aliyun.com/knowledge_detail/60811.html)
132131

133132
全局安装方式参见[文档](https://help.aliyun.com/document_detail/60338.html)
134133

@@ -139,21 +138,21 @@ $ npm i nodeinstall -g
139138
$ nodeinstall --install-alinode ^3
140139
```
141140

142-
[nodeinstall] 会把对应版本的 `alinode` 安装到项目的 `node_modules` 目录下。
141+
[nodeinstall]会把对应版本的 `alinode` 安装到项目的 `node_modules` 目录下。
143142

144143
> 注意:打包机的操作系统和线上系统需保持一致,否则对应的 Runtime 不一定能正常运行。
145144
146145
#### 安装及配置
147146

148-
我们提供了 [egg-alinode] 来快速接入,无需安装 `agenthub` 等额外的常驻服务。
147+
我们提供了[egg-alinode]来快速接入,无需安装 `agenthub` 等额外的常驻服务。
149148

150-
**安装依赖**
149+
**安装依赖**
151150

152151
```bash
153152
$ npm i egg-alinode --save
154153
```
155154

156-
**开启插件**
155+
**开启插件**
157156

158157
```js
159158
// config/plugin.js
@@ -163,7 +162,7 @@ exports.alinode = {
163162
};
164163
```
165164

166-
**配置**
165+
**配置**
167166

168167
```js
169168
// config/config.default.js
@@ -189,7 +188,7 @@ $ [Tue Aug 06 2019 15:54:25 GMT+0800 (China Standard Time)] Connecting to wss://
189188
$ [Tue Aug 06 2019 15:54:26 GMT+0800 (China Standard Time)] agent register ok.
190189
```
191190

192-
其中 `agent register ok.` 表示配置的 `egg-alinode` 正确连接上了 Node.js 性能平台服务器。
191+
其中`agent register ok.`表示配置的 `egg-alinode` 正确连接上了 Node.js 性能平台服务器。
193192

194193
#### 访问控制台
195194

‎site/docs/core/development.zh-CN.md

+64-66
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ $ npm i egg-bin --save-dev
1919

2020
### 添加命令
2121

22-
添加 `npm scripts``package.json`
22+
`package.json` 中添加 `npm scripts`
2323

2424
```json
2525
{
@@ -33,34 +33,34 @@ $ npm i egg-bin --save-dev
3333

3434
### 环境配置
3535

36-
本地启动的应用是以 `env: local` 启动的,读取的配置也是 `config.default.js``config.local.js` 合并的结果。
36+
本地启动的应用是以 `env: local` 启动的,读取的配置是 `config.default.js``config.local.js` 合并的结果。
3737

38-
> 注意:本地开发环境依赖 `egg-development` 插件,默认开启,其他环境下关闭,配置参考 [config/config.default.js](https://github.com/eggjs/egg-development/blob/master/config/config.default.js)
38+
> 注意:本地开发环境依赖 `egg-development` 插件,该插件默认开启,而在其他环境下关闭。配置参考 [config/config.default.js](https://github.com/eggjs/egg-development/blob/master/config/config.default.js)
3939
4040
### 关于 `Reload` 功能
4141

42-
以下目录(含子目录)下默认会监听开发环境下的文件变化,触发一次Egg开发环境服务器重载
42+
以下目录(包括子目录)在开发环境下默认会监听文件变化,一旦发生变化,将触发 Egg 服务器重载
4343

44-
- ${app_root}/app
45-
- ${app_root}/config
46-
- ${app_root}/mocks
47-
- ${app_root}/mocks_proxy
48-
- ${app_root}/app.js
44+
- `${app_root}/app`
45+
- `${app_root}/config`
46+
- `${app_root}/mocks`
47+
- `${app_root}/mocks_proxy`
48+
- `${app_root}/app.js`
4949

50-
> 设置 `config.development.overrideDefault``true` 将跳过默认合并.
50+
> 若设置 `config.development.overrideDefault``true`,则会跳过默认合并。
5151
52-
以下目录下(包括子目录)默认忽略开发环境下的文件改动
52+
以下目录(包括子目录)在开发环境下默认忽略文件改动
5353

54-
- ${app_root}/app/view
55-
- ${app_root}/app/assets
56-
- ${app_root}/app/public
57-
- ${app_root}/app/web
54+
- `${app_root}/app/view`
55+
- `${app_root}/app/assets`
56+
- `${app_root}/app/public`
57+
- `${app_root}/app/web`
5858

59-
> 设置 `config.development.overrideIgnore``true` 将跳过默认合并.
59+
> 若设置 `config.development.overrideIgnore``true`,则会跳过默认合并。
6060
6161
### 指定端口
6262

63-
本地启动应用默认监听 7001 端口,可指定其他端口,例如:
63+
本地启动应用默认监听 7001 端口,你也可以指定其他端口,例如:
6464

6565
```json
6666
{
@@ -69,14 +69,13 @@ $ npm i egg-bin --save-dev
6969
}
7070
}
7171
```
72-
7372
## 单元测试
7473

7574
这里主要讲解工具部分的使用,更多关于单元测试的内容请参考[这里](./unittest.md)
7675

7776
### 添加命令
7877

79-
添加 `npm scripts``package.json`
78+
`package.json` 中添加 `npm scripts`
8079

8180
```json
8281
{
@@ -86,29 +85,29 @@ $ npm i egg-bin --save-dev
8685
}
8786
```
8887

89-
这样我们就可以通过 `npm test` 命令运行单元测试
88+
我们可以通过执行 `npm test` 命令来运行单元测试
9089

9190
### 环境配置
9291

93-
测试用例执行时,应用是以 `env: unittest` 启动的,读取的配置也是 `config.default.js``config.unittest.js` 合并的结果。
92+
测试用例执行时,应用以 `env: unittest` 启动,读取的配置是 `config.default.js``config.unittest.js` 合并的结果。
9493

9594
### 运行特定用例文件
9695

97-
运行 `npm test` 时会自动执行 test 目录下的以 `.test.js` 结尾的文件(默认 [glob] 匹配规则 `test/**/*.test.js` )。
96+
执行 `npm test` 会自动运行 test 目录下的以 `.test.js` 结尾的文件(默认 glob 匹配规则 `test/**/*.test.js`)。
9897

99-
我们在编写用例时往往想单独执行正在编写的用例,可以通过以下方式指定特定用例文件
98+
如果只想执行正在编写的用例,可以通过下列方式指定特定用例文件
10099

101100
```bash
102101
$ TESTS=test/x.test.js npm test
103102
```
104103

105-
支持 [glob] 规则。
104+
该方式支持 glob 规则。
106105

107106
### 指定 reporter
108107

109-
Mocha 支持多种形式的 reporter,默认使用 `spec` reporter。
108+
Mocha 支持多种形式的 reporter,默认是 `spec` reporter。
110109

111-
可以手动设置 `TEST_REPORTER` 环境变量来指定 reporter,例如使用 `dot`
110+
通过设置 `TEST_REPORTER` 环境变量来指定 reporter,例如 `dot`
112111

113112
```bash
114113
$ TEST_REPORTER=dot npm test
@@ -118,35 +117,36 @@ $ TEST_REPORTER=dot npm test
118117

119118
### 指定用例超时时间
120119

121-
默认执行超时时间为 30 秒。我们也可以手动指定超时时间(单位毫秒),例如设置为 5 秒:
120+
用例默认超时时间是 30 秒。也可以手动设置超时时间(单位毫秒),例如设为 5 秒:
122121

123122
```bash
124123
$ TEST_TIMEOUT=5000 npm test
125124
```
126125

127126
### 通过 argv 方式传参
128127

129-
`egg-bin test` 除了环境变量方式,也支持直接传参,支持 mocha 的所有参数,参见[mocha usage](https://mochajs.org/#usage)
128+
`egg-bin test` 不仅支持环境变量传参,还支持直接传参,包括所有 mocha 参数,详情见[mocha usage](https://mochajs.org/#usage)
130129

131130
```bash
132-
$ # npm 传递参数需额外加一个 `--`,参见 https://docs.npmjs.com/cli/run-script
131+
$ # npm 传参需额外加 `--`,详情见 https://docs.npmjs.com/cli/run-script
133132
$ npm test -- --help
134133
$
135-
$ # 等同于 `TESTS=test/**/test.js npm test`,受限于 bash,最好加上双引号
134+
$ # 相当于 `TESTS=test/**/test.js npm test`,但加双引号更佳,避免 bash 限制
136135
$ npm test "test/**/test.js"
137136
$
138-
$ # 等同于 `TEST_REPORTER=dot npm test`
137+
$ # 相当于 `TEST_REPORTER=dot npm test`
139138
$ npm test -- --reporter=dot
140139
$
141-
$ # 支持 mocha 的参数,如 grep / require 等
140+
$ # 支持 mocha 参数,如 greprequire 等
142141
$ npm test -- -t 30000 --grep="should GET"
143142
```
144143

144+
145145
## 代码覆盖率
146146

147-
egg-bin 已经内置了 [nyc](https://github.com/istanbuljs/nyc) 来支持单元测试自动生成代码覆盖率报告
147+
egg-bin 已内置 [nyc](https://github.com/istanbuljs/nyc) 支持单元测试生成代码覆盖率报告
148148

149-
添加 `npm scripts``package.json`
149+
`package.json` 中添加 `npm scripts`
150150

151151
```json
152152
{
@@ -156,7 +156,7 @@ egg-bin 已经内置了 [nyc](https://github.com/istanbuljs/nyc) 来支持单元
156156
}
157157
```
158158

159-
这样我们就可以通过 `npm run cov` 命令运行单元测试覆盖率
159+
我们可以通过 `npm run cov` 命令运行测试覆盖率
160160

161161
```bash
162162
$ egg-bin cov
@@ -179,31 +179,30 @@ Lines : 100% ( 41/41 )
179179
================================================================================
180180
```
181181

182-
还可以通过 `open coverage/lcov-report/index.html` 打开完整的 HTML 覆盖率报告。
182+
还可以通过 `open coverage/lcov-report/index.html` 命令来查看完整 HTML 覆盖率报告。
183183

184184
![image](https://cloud.githubusercontent.com/assets/156269/21845201/a9a85ab6-d82c-11e6-8c24-5e85f352be4a.png)
185185

186186
### 环境配置
187187

188-
`test` 命令一样,`cov` 命令执行时,应用也是以 `env: unittest` 启动的,读取的配置也是 `config.default.js``config.unittest.js` 合并的结果
188+
`test` 命令类似,执行 `cov` 命令时,应用以 `env: unittest` 启动,并读取 `config.default.js``config.unittest.js` 合并的配置结果
189189

190190
### 忽略指定文件
191191

192-
对于某些不需要跑测试覆盖率的文件,可以通过 `COV_EXCLUDES` 环境变量指定
192+
对于不需要计算覆盖率的文件,可通过 `COV_EXCLUDES` 环境变量来指定
193193

194194
```bash
195195
$ COV_EXCLUDES=app/plugins/c* npm run cov
196-
$ # 或者传参方式
196+
$ # 或者使用传参方式
197197
$ npm run cov -- --x=app/plugins/c*
198198
```
199-
200199
## 调试
201200

202201
### 日志输出
203202

204203
### 使用 logger 模块
205204

206-
框架内置了[日志](./logger.md) 功能,使用 `logger.debug()` 输出调试信息,**推荐在应用代码中使用它。**
205+
框架内置了 [日志](./logger.md) 功能,使用 `logger.debug()` 输出调试信息,**推荐在应用代码中使用它。**
207206

208207
```js
209208
// controller
@@ -220,11 +219,11 @@ app.logger.debug('app init');
220219

221220
### 使用 debug 模块
222221

223-
[debug](https://www.npmjs.com/package/debug) 模块是 Node.js 社区广泛使用的 debug 工具,很多模块都使用它模块打印调试信息,Egg 社区也广泛采用这一机制打印 debug 信息,**推荐在框架和插件开发中使用它。**
222+
[debug](https://www.npmjs.com/package/debug) 模块是 Node.js 社区广泛使用的 debug 工具,很多模块都使用这个模块来打印调试信息,Egg 社区也广泛采用这一机制来打印 debug 信息,**推荐在框架和插件开发中使用它。**
224223

225224
我们可以通过 `DEBUG` 环境变量选择开启指定的调试代码,方便观测执行过程。
226225

227-
(调试模块和日志模块不要混淆,而且日志模块也有很多功能,这里所说的日志都是调试信息。)
226+
(调试模块和日志模块不要混淆;此外,日志模块还具备很多其他功能。这里所说的日志全部指调试信息。)
228227

229228
开启所有模块的日志:
230229

@@ -238,13 +237,12 @@ $ DEBUG=* npm run dev
238237
$ DEBUG=egg* npm run dev
239238
```
240239

241-
单元测试也可以用 `DEBUG=* npm test` 来查看测试用例运行的详细日志。
242-
240+
单元测试也可以使用 `DEBUG=* npm test` 来查看测试用例运行的详细日志。
243241
### 使用 egg-bin 调试
244242

245243
#### 添加命令
246244

247-
添加 `npm scripts``package.json`
245+
`package.json` 中添加 `npm scripts`
248246

249247
```json
250248
{
@@ -254,28 +252,28 @@ $ DEBUG=egg* npm run dev
254252
}
255253
```
256254

257-
这样我们就可以通过 `npm run debug` 命令来断点调试应用。
255+
现在,我们可以通过 `npm run debug` 命令来断点调试应用。
258256

259-
`egg-bin` 会智能选择调试协议,在 8.x 之后版本使用 [Inspector Protocol] 协议,低版本使用 [Legacy Protocol]
257+
`egg-bin` 会智能选择调试协议。在 Node.js 8.x 之后的版本中,使用 [Inspector Protocol] 协议,低版本使用 [Legacy Protocol]
260258

261-
同时也支持自定义调试参数
259+
也支持自定义调试参数
262260

263261
```bash
264-
$ egg-bin debug --inpsect=9229
262+
$ egg-bin debug --inspect=9229
265263
```
266264

267-
- `master` 调试端口为 9229 或 5858(旧协议)
268-
- `agent` 调试端口固定为 5800,可以传递 `process.env.EGG_AGENT_DEBUG_PORT` 来自定义。
265+
- `master` 调试端口为 9229 或 5858(旧协议)
266+
- `agent` 调试端口固定为 5800,可以通过传递 `process.env.EGG_AGENT_DEBUG_PORT` 来自定义。
269267
- `worker` 调试端口为 `master` 调试端口递增。
270-
- 开发阶段 worker 在代码修改后会热重启,导致调试端口会自增,参见下文的 IDE 配置以便自动重连
268+
- 开发阶段worker 的代码修改后会热重启,导致调试端口自增。参见后文的 IDE 配置,可以实现自动重连
271269

272270
#### 环境配置
273271

274-
执行 `debug` 命令时,应用也是以 `env: local` 启动的读取的配置是 `config.default.js``config.local.js` 合并的结果。
272+
执行 `debug` 命令时,应用也是以 `env: local` 启动的读取的配置是 `config.default.js``config.local.js` 合并的结果。
275273

276274
#### 使用 [DevTools] 进行调试
277275

278-
最新的 DevTools 只支持 [Inspector Protocol] 协议,故你需要使用 Node.js 8.x+ 的版本方能使用
276+
最新的 DevTools 只支持 [Inspector Protocol] 协议,因此你需要使用 Node.js 8.x 及以上版本
279277

280278
执行 `npm run debug` 启动:
281279

@@ -298,30 +296,30 @@ Debug Proxy online, now you could attach to 9999 without worry about reload.
298296
DevTools → chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9999/__ws_proxy__
299297
```
300298

301-
然后选择以下一种方式即可
299+
接下来选择以下其中一种方式
302300

303-
- 直接访问控制台最后输出的 `DevTools` 地址,该地址是代理后的 worker,无需担心重启问题
304-
- 访问 `chrome://inspect`,配置对应的端口,然后点击 `Open dedicated DevTools for Node` 即可打开调试控制台
301+
- 直接访问控制台最后输出的 `DevTools` 地址,该地址代理了 worker。不必担心重启问题
302+
- 访问 `chrome://inspect` 后,配置相应的端口。点击 `Open dedicated DevTools for Node` 打开调试控制台
305303

306304
![DevTools](https://user-images.githubusercontent.com/227713/30419047-a54ac592-9967-11e7-8a05-5dbb82088487.png)
307305

308306
#### 使用 WebStorm 进行调试
309307

310308
`egg-bin` 会自动读取 WebStorm 调试模式下设置的环境变量 `$NODE_DEBUG_OPTION`
311309

312-
使用 WebStorm 的 npm 调试启动即可
310+
直接使用 WebStorm 的 npm 调试功能启动
313311

314312
![WebStorm](https://user-images.githubusercontent.com/227713/30423086-5dd32ac6-9974-11e7-840f-904e49a97694.png)
315313

316314
#### 使用 [VSCode] 进行调试
317315

318-
可以通过 2 个方式
316+
有以下两种方式
319317

320-
方式一:开启 VSCode 配置 `Debug: Toggle Auto Attach`然后在 Terminal 执行 `npm run debug` 即可
318+
方式一:开启 VSCode `Debug: Toggle Auto Attach`然后在 Terminal 中执行 `npm run debug`
321319

322-
方式二:配置 VSCode 的 `.vscode/launch.json`然后 F5 一键启动即可。(注意,需要关闭方式一中的配置)
320+
方式二:配置 VSCode 的 `.vscode/launch.json`然后使用 F5 启动。注意,要关闭方式一中的配置。
323321

324-
```js
322+
```json
325323
// .vscode/launch.json
326324
{
327325
"version": "0.2.0",
@@ -344,15 +342,15 @@ DevTools → chrome-devtools://devtools/bundled/inspector.html?experiments=true&
344342
}
345343
```
346344

347-
我们也提供了一个 [vscode-eggjs] 扩展来自动生成配置
345+
我们还提供了 [vscode-eggjs] 扩展,可以自动生成配置
348346

349347
![VSCode](https://user-images.githubusercontent.com/227713/35954428-7f8768ee-0cc4-11e8-90b2-67e623594fa1.png)
350348

351-
更多 VSCode Debug 用法可以参见文档: [Node.js Debugging in VS Code](https://code.visualstudio.com/docs/nodejs/nodejs-debugging)
349+
更多 VSCode 调试用法请参见文档:[Node.js Debugging in VS Code](https://code.visualstudio.com/docs/nodejs/nodejs-debugging)
352350

353351
## 更多
354352

355-
如果想了解更多本地开发相关的内容,例如为你的团队定制一个本地开发工具,请参考 [egg-bin]
353+
想要了解更多有关本地开发的内容,例如如何为你的团队定制本地开发工具,请参阅 [egg-bin]
356354

357355
[glob]: https://www.npmjs.com/package/glob
358356
[egg-bin]: https://github.com/eggjs/egg-bin

‎site/docs/core/error-handling.zh-CN.md

+52-57
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ order: 9
1111
// app/service/test.js
1212
try {
1313
const res = await this.ctx.curl('http://eggjs.com/api/echo', {
14-
dataType: 'json',
14+
dataType: 'json'
1515
});
1616
if (res.status !== 200) throw new Error('response status is not 200');
1717
return res.data;
@@ -21,145 +21,140 @@ try {
2121
}
2222
```
2323

24-
按照正常代码写法,所有的异常都可以用这个方式进行捕获并处理,但是一定要注意一些特殊的写法可能带来的问题。打一个不太正式的比方,我们的代码全部都在一个异步调用链上,所有的异步操作都通过 await 串接起来了,但是只要有一个地方跳出了异步调用链,异常就捕获不到了
24+
按照正常代码写法,所有的异常都可以用这种方式进行捕获并处理,但是一定要注意一些特殊的写法可能带来的问题。举个不太正式的比方,我们的代码全部都在一个异步调用链上,所有的异步操作都通过 `await` 串接起来了。但是,只要有一个地方跳出了异步调用链,异常就无法被捕获
2525

2626
```js
2727
// app/controller/home.js
2828
class HomeController extends Controller {
2929
async buy() {
3030
const request = {};
31-
const config = await ctx.service.trade.buy(request);
31+
const config = await this.ctx.service.trade.buy(request);
3232
// 下单后需要进行一次核对,且不阻塞当前请求
3333
setImmediate(() => {
34-
ctx.service.trade.check(request).catch((err) => ctx.logger.error(err));
34+
this.ctx.service.trade.check(request).catch(err => this.ctx.logger.error(err));
3535
});
3636
}
3737
}
3838
```
3939

40-
在这个场景中,如果 `service.trade.check` 方法中代码有问题,导致执行时抛出了异常,尽管框架会在最外层通过 `try catch` 统一捕获错误,但是由于 `setImmediate` 中的代码『跳出』了异步链,它里面的错误就无法被捕捉到了。因此在编写类似代码的时候一定要注意
40+
在这个场景下,如果 `service.trade.check` 的代码出现问题,导致执行时抛出异常,框架虽可以在最外层通过 `try catch` 统一捕获错误,但由于 `setImmediate` 中代码『跳出』了异步链,错误就无法被捉到了。所以开发时需要特别注意
4141

42-
当然,框架也考虑到了这类场景,提供了 `ctx.runInBackground(scope)` 辅助方法,通过它又包装了一个异步链,所有在这个 scope 里面的错误都会统一捕获
42+
幸运的是,框架针对类似场景提供了 `ctx.runInBackground(scope)` 辅助方法,通过它封装了另一个异步链,所有在这个 `scope` 内的错误都会被捕获
4343

4444
```js
4545
class HomeController extends Controller {
4646
async buy() {
4747
const request = {};
48-
const config = await ctx.service.trade.buy(request);
48+
const config = await this.ctx.service.trade.buy(request);
4949
// 下单后需要进行一次核对,且不阻塞当前请求
50-
ctx.runInBackground(async () => {
51-
// 这里面的异常都会统统被 Backgroud 捕获掉,并打印错误日志
52-
await ctx.service.trade.check(request);
50+
this.ctx.runInBackground(async () => {
51+
// 这里的异常都会被 Background 捕获,并打印错误日志
52+
await this.ctx.service.trade.check(request);
5353
});
5454
}
5555
}
5656
```
5757

58-
**为了保证异常可追踪,必须保证所有抛出的异常都是 Error 类型,因为只有 Error 类型才会带上堆栈信息,定位到问题**
58+
**为确保异常可追踪,所有抛出的异常必须是 `Error` 类型,因为只有 `Error` 类型才具备堆栈信息,便于问题定位**
5959

6060
## 框架层统一异常处理
6161

62-
框架通过 [onerror](https://github.com/eggjs/egg-onerror) 插件提供了统一的错误处理机制。对一个请求的所有处理方法(Middleware、Controller、Service)中抛出的任何异常都会被它捕获,并自动根据请求想要获取的类型返回不同类型的错误(基于 [Content Negotiation](https://tools.ietf.org/html/rfc7231#section-5.3.2)
62+
框架通过 [onerror](https://github.com/eggjs/egg-onerror) 插件提供统一的错误处理机制。此机制将捕获所有处理方法(Middleware、Controller、Service)中抛出的任何异常,并根据请求预期的响应类型返回不同的错误内容
6363

64-
| 请求需求的格式 | 环境 | errorPageUrl 是否配置 | 返回内容 |
65-
| -------------- | ---------------- | --------------------- | ---------------------------------------------------- |
66-
| HTML & TEXT | local & unittest | - | onerror 自带的错误页面,展示详细的错误信息 |
67-
| HTML & TEXT | 其他 | | 重定向到 errorPageUrl |
68-
| HTML & TEXT | 其他 | | onerror 自带的没有错误信息的简单错误页(不推荐) |
69-
| JSON & JSONP | local & unittest | - | JSON 对象或对应的 JSONP 格式响应,带详细的错误信息 |
70-
| JSON & JSONP | 其他 | - | JSON 对象或对应的 JSONP 格式响应,不带详细的错误信息 |
64+
| 请求格式需求 | 环境 | `errorPageUrl` 配置 | 返回内容 |
65+
| ------------ | ---- | ------------------- | -------- |
66+
| HTML & TEXT | local & unittest | - | onerror 提供的详细错误页面 |
67+
| HTML & TEXT | 其他 || 重定向至 `errorPageUrl` |
68+
| HTML & TEXT | 其他 || 简易错误页(不含错误信息) |
69+
| JSON & JSONP | local & unittest | - | 详细错误信息的 JSON JSONP 响应 |
70+
| JSON & JSONP | 其他 | - | 不含详细错误信息的 JSON JSONP 响应 |
7171

7272
### errorPageUrl
7373

74-
onerror 插件的配置中支持 errorPageUrl 属性,当配置了 errorPageUrl 时,一旦用户请求线上应用的 HTML 页面异常,就会重定向到这个地址。
75-
76-
`config/config.default.js`
74+
配置了 `errorPageUrl` 后,线上应用 HTML 页面异常时将重定向至该地址。
7775

7876
```js
7977
// config/config.default.js
8078
module.exports = {
8179
onerror: {
82-
// 线上页面发生异常时,重定向到这个页面上
83-
errorPageUrl: '/50x.html',
84-
},
80+
// 线上发生异常时,重定向到此页面
81+
errorPageUrl: '/50x.html'
82+
}
8583
};
8684
```
8785

8886
## 自定义统一异常处理
8987

90-
尽管框架提供了默认的统一异常处理机制,但是应用开发中经常需要对异常时的响应做自定义,特别是在做一些接口开发的时候。框架自带的 onerror 插件支持自定义配置错误处理方法,可以覆盖默认的错误处理方法
88+
虽然框架提供了默认的异常处理机制,但应用开发中往往需自定义异常响应,特别是接口开发。onerror 插件支持自定义配置错误处理方法,允许覆盖默认方法
9189

9290
```js
9391
// config/config.default.js
9492
module.exports = {
9593
onerror: {
9694
all(err, ctx) {
97-
// 在此处定义针对所有响应类型的错误处理方法
98-
// 注意,定义了 config.all 之后,其他错误处理方法不会再生效
95+
// 定义所有响应类型的错误处理方法
96+
// 定义了 config.all 后,其他错误处理不再生效
9997
ctx.body = 'error';
10098
ctx.status = 500;
10199
},
102100
html(err, ctx) {
103-
// html handler
101+
// HTML 错误处理
104102
ctx.body = '<h3>error</h3>';
105103
ctx.status = 500;
106104
},
107105
json(err, ctx) {
108-
// json handler
106+
// JSON 错误处理
109107
ctx.body = { message: 'error' };
110108
ctx.status = 500;
111109
},
112110
jsonp(err, ctx) {
113-
// 一般来说,不需要特殊针对 jsonp 进行错误定义,jsonp 的错误处理会自动调用 json 错误处理,并包装成 jsonp 的响应格式
114-
},
115-
},
111+
// JSONP 错误一般不需特殊处理,自动调用 JSON 方法
112+
}
113+
}
116114
};
117115
```
118-
119-
## 404
120-
121116
框架并不会将服务端返回的 404 状态当做异常来处理,但是框架提供了当响应为 404 且没有返回 body 时的默认响应。
122117

123118
- 当请求被框架判定为需要 JSON 格式的响应时,会返回一段 JSON:
124119

125-
```json
126-
{ "message": "Not Found" }
127-
```
120+
```json
121+
{ "message": "Not Found" }
122+
```
128123

129124
- 当请求被框架判定为需要 HTML 格式的响应时,会返回一段 HTML:
130125

131-
```html
132-
<h1>404 Not Found</h1>
133-
```
126+
```html
127+
<h1>404 Not Found</h1>
128+
```
134129

135130
框架支持通过配置,将默认的 HTML 请求的 404 响应重定向到指定的页面。
136131

137132
```js
138133
// config/config.default.js
139134
module.exports = {
140-
notfound: {
141-
pageUrl: '/404.html',
142-
},
135+
notfound: {
136+
pageUrl: '/404.html',
137+
},
143138
};
144139
```
145140

146141
### 自定义 404 响应
147142

148-
在一些场景下,我们需要自定义服务器 404 时的响应和自定义异常处理一样,我们也只需要加入一个中间件即可对 404 做统一处理:
143+
在一些场景下,我们需要自定义服务器 404 时的响应和自定义异常处理一样,我们也只需要加入一个中间件即可对 404 做统一处理:
149144

150145
```js
151146
// app/middleware/notfound_handler.js
152147
module.exports = () => {
153-
return async function notFoundHandler(ctx, next) {
154-
await next();
155-
if (ctx.status === 404 && !ctx.body) {
156-
if (ctx.acceptJSON) {
157-
ctx.body = { error: 'Not Found' };
158-
} else {
159-
ctx.body = '<h1>Page Not Found</h1>';
160-
}
161-
}
162-
};
148+
return async function notFoundHandler(ctx, next) {
149+
await next();
150+
if (ctx.status === 404 && !ctx.body) {
151+
if (ctx.acceptJSON) {
152+
ctx.body = { error: 'Not Found' };
153+
} else {
154+
ctx.body = '<h1>Page Not Found</h1>';
155+
}
156+
}
157+
};
163158
};
164159
```
165160

@@ -168,6 +163,6 @@ module.exports = () => {
168163
```js
169164
// config/config.default.js
170165
module.exports = {
171-
middleware: ['notfoundHandler'],
166+
middleware: ['notfoundHandler'],
172167
};
173168
```

‎site/docs/core/httpclient.zh-CN.md

+130-165
Large diffs are not rendered by default.

‎site/docs/core/i18n.zh-CN.md

+19-24
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ order: 11
77

88
## 默认语言
99

10-
默认语言是 `en-US`假设我们想修改默认语言为简体中文
10+
默认语言是 `en-US`如果我们想修改默认语言为简体中文,可以进行以下设置
1111

1212
```js
1313
// config/config.default.js
@@ -18,29 +18,27 @@ exports.i18n = {
1818

1919
## 切换语言
2020

21-
我们可以通过下面几种方式修改应用的当前语言(修改后会记录到 `locale` 这个 Cookie),下次请求直接用设定好的语言。
22-
23-
优先级从高到低:
21+
我们可以通过下面几种方式修改应用的当前语言(修改后会记录到 `locale` 这个 Cookie),下次请求会直接使用设定好的语言。优先级从高到低依次是:
2422

2523
1. query: `/?locale=en-US`
2624
2. cookie: `locale=zh-TW`
2725
3. header: `Accept-Language: zh-CN,zh;q=0.5`
2826

29-
如果想修改 query 或者 Cookie 参数名称:
27+
如果需要修改 query Cookie 参数名称,可以按照如下方式配置
3028

3129
```js
3230
// config/config.default.js
3331
exports.i18n = {
3432
queryField: 'locale',
3533
cookieField: 'locale',
36-
// Cookie 默认一年后过期 如果设置为 Number,则单位为 ms
34+
// Cookie 默认一年后过期, 如果设置为 Number,则单位为 ms
3735
cookieMaxAge: '1y',
3836
};
3937
```
4038

4139
## 编写 I18n 多语言文件
4240

43-
多种语言的配置是独立的,统一存放在 `config/locale/*.js` 下。
41+
不同语言的配置文件是独立存放的,统一放置在 `config/locale/*.js` 目录下。例如:
4442

4543
```
4644
- config/locale/
@@ -49,11 +47,9 @@ exports.i18n = {
4947
- zh-TW.js
5048
```
5149

52-
不仅对于应用目录生效,在框架,插件的 `config/locale` 目录下同样生效。
53-
54-
**注意单词拼写,是 locale 不是 locals。**
50+
无论是在应用目录、框架还是插件的 `config/locale` 目录下,设置都是同样生效的。注意单词的拼写应该是 locale,而不是 locals。
5551

56-
例如:
52+
例如,可以这样配置中文语言文件
5753

5854
```js
5955
// config/locale/zh-CN.js
@@ -62,20 +58,19 @@ module.exports = {
6258
};
6359
```
6460

65-
或者也可以用 JSON 格式的文件
61+
也可以使用 JSON 格式的语言文件
6662

6763
```json
6864
// config/locale/zh-CN.json
6965
{
7066
"Email": "邮箱"
7167
}
7268
```
73-
7469
## 获取多语言文本
7570

76-
我们可以使用 `__` (Alias: `gettext`) 函数获取 locale 文件夹下面的多语言文本。
71+
我们可以使用 `__`(别名:`gettext`函数获取 locale 文件夹下面的多语言文本。
7772

78-
**注意: `__` 是两个下划线**
73+
**注意`__` 是两个下划线**
7974

8075
以上面配置过的多语言为例:
8176

@@ -85,16 +80,16 @@ ctx.__('Email');
8580
// en-US => Email
8681
```
8782

88-
如果文本中含有 `%s``%j` 等 format 函数,可以按照 [`util.format()`](https://nodejs.org/api/util.html#util_util_format_format_args) 类似的方式调用:
83+
如果文本中含有 `%s``%j` 等 format 函数,可以按照 [`util.format()`](https://nodejs.org/api/util.html#util_util_format_format_args) 类似的方式调用:
8984

9085
```js
9186
// config/locale/zh-CN.js
9287
module.exports = {
93-
'Welcome back, %s!': '欢迎回来,%s!',
88+
'Welcome back, %s!': '欢迎回来,%s',
9489
};
9590

9691
ctx.__('Welcome back, %s!', 'Shawn');
97-
// zh-CN => 欢迎回来,Shawn!
92+
// zh-CN => 欢迎回来,Shawn
9893
// en-US => Welcome back, Shawn!
9994
```
10095

@@ -103,7 +98,7 @@ ctx.__('Welcome back, %s!', 'Shawn');
10398
```js
10499
// config/locale/zh-CN.js
105100
module.exports = {
106-
'Hello {0}! My name is {1}.': '你好 {0}! 我的名字叫 {1}。',
101+
'Hello {0}! My name is {1}.': '你好 {0}我的名字叫 {1}。',
107102
};
108103

109104
ctx.__('Hello {0}! My name is {1}.', ['foo', 'bar']);
@@ -118,21 +113,21 @@ class HomeController extends Controller {
118113
async index() {
119114
const ctx = this.ctx;
120115
ctx.body = {
121-
message: ctx.__('Welcome back, %s!', ctx.user.name)
122-
// 或者使用 gettext,gettext 是 __ 函数的 alias
116+
message: ctx.__('Welcome back, %s!', ctx.user.name),
117+
// 或者使用 gettext,gettext 是 `__` 函数的别名
123118
// message: ctx.gettext('Welcome back', ctx.user.name)
124-
user: ctx.user,
119+
user: ctx.user
125120
};
126121
}
127122
}
128123
```
129124

130125
### View 中使用
131126

132-
假设我们使用的模板引擎是 [Nunjucks](https://github.com/eggjs/egg-view-nunjucks)
127+
假设我们使用的模板引擎是 [Nunjucks](https://github.com/eggjs/egg-view-nunjucks)
133128

134129
```html
135-
<li>{{ __('Email') }}: {{ user.email }}</li>
130+
<li>{{ __('Email') }}{{ user.email }}</li>
136131
<li>{{ __('Welcome back, %s!', user.name) }}</li>
137132
<li>{{ __('Hello {0}! My name is {1}.', ['foo', 'bar']) }}</li>
138133
```

‎site/docs/core/logger.zh-CN.md

+75-91
Large diffs are not rendered by default.

‎site/docs/core/security.zh-CN.md

+145-167
Large diffs are not rendered by default.

‎site/docs/core/unittest.zh-CN.md

+132-181
Large diffs are not rendered by default.

‎site/docs/core/view.zh-CN.md

+42-40
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ title: View 模板渲染
33
order: 8
44
---
55

6-
绝大多数情况,我们都需要读取数据后渲染模板,然后呈现给用户。故我们需要引入对应的模板引擎
6+
绝大多数情况下,我们都需要读取数据后渲染模板,然后呈现给用户。因此,我们需要引入相应的模板引擎
77

8-
框架内置 [egg-view] 作为模板解决方案,并支持多模板渲染,每个模板引擎都以插件的方式引入,但保持渲染的 API 一致。如果想更深入的了解,可以查看[模板插件开发](../advanced/view-plugin.md)
8+
框架内置了 `egg-view` 作为模板解决方案,支持多模板渲染。每个模板引擎均以插件方式引入,并保持渲染 API 的一致性。如想深入了解,可查看[模板插件开发](../advanced/view-plugin.md)
99

10-
以下以官方支持的 View 插件 [egg-view-nunjucks] 为例
10+
以下以官方支持的 View 插件 `egg-view-nunjucks` 为例
1111

1212
## 引入 view 插件
1313

@@ -27,36 +27,39 @@ exports.nunjucks = {
2727

2828
## 配置插件
2929

30-
[egg-view] 提供了 `config.view` 通用配置
30+
`egg-view` 提供了 `config.view` 通用配置
3131

3232
### root {String}
3333

34-
模板文件的根目录,为绝对路径,默认为 `${baseDir}/app/view`。支持配置多个目录, `,` 分割,会从多个目录查找文件
34+
模板文件的根目录,为绝对路径,默认为 `${baseDir}/app/view`。支持配置多个目录,用逗号 `,` 分割。框架会依次从这些目录中查找文件
3535

36-
如下示例演示了如何配置多个 `view` 目录:
36+
以下示例展示了如何配置多个 `view` 目录:
3737

3838
```js
3939
// config/config.default.js
4040
const path = require('path');
41-
module.exports = (appInfo) => {
41+
42+
module.exports = appInfo => {
4243
const config = {};
44+
4345
config.view = {
4446
root: [
4547
path.join(appInfo.baseDir, 'app/view'),
4648
path.join(appInfo.baseDir, 'path/to/another'),
4749
].join(','),
4850
};
51+
4952
return config;
5053
};
5154
```
5255

5356
### cache {Boolean}
5457

55-
模板路径缓存,默认开启。框架会根据 root 配置的目录依次查找,如果匹配则会缓存文件路径,下次渲染相同路径时不会重新查找。
58+
模板路径缓存,默认开启。框架根据 `root` 配置的目录依次查找;如果匹配成功,则会缓存文件路径,下次渲染相同路径时不会重新查找。
5659

5760
### mapping 和 defaultViewEngine
5861

59-
每个模板在注册时都会指定一个模板名(viewEngineName),在使用时需要根据后缀来匹配模板名,比如指定 `.nj` 后缀的文件使用 Nunjucks 进行渲染。
62+
每个模板引擎在注册时会指定一个模板名(viewEngineName)。使用时,需要根据文件后缀匹配模板名,例如 `.nj` 后缀的文件使用 Nunjucks 进行渲染。
6063

6164
```js
6265
module.exports = {
@@ -68,13 +71,13 @@ module.exports = {
6871
};
6972
```
7073

71-
调用 render 渲染文件时,会根据上述配置的后缀名去寻找对应的模板引擎
74+
调用 `render` 渲染文件时,框架会根据上述配置的后缀名寻找对应的模板引擎
7275

7376
```js
7477
await ctx.render('home.nj');
7578
```
7679

77-
必须配置文件后缀和模板引擎的映射,否则无法找到对应的模板引擎,但是可以使用 `defaultViewEngine` 做全局配置
80+
必须配置文件后缀与模板引擎的映射;否则无法找到对应模板引擎。还可以使用 `defaultViewEngine` 进行全局配置
7881

7982
```js
8083
// config/config.default.js
@@ -85,11 +88,11 @@ module.exports = {
8588
};
8689
```
8790

88-
如果根据文件后缀没有找到对应的模板引擎,会使用默认的模板引擎进行渲染。对于只使用一种模板引擎的应用,建议配置此选项
91+
如果根据文件后缀没找到模板引擎,则会使用默认模板引擎渲染。对只用一种模板引擎的应用,建议配置此项
8992

9093
### defaultExtension
9194

92-
一般在调用 render 时的第一个参数需要包含文件后缀,如果配置了 defaultExtension 可以省略后缀
95+
一般在调用 `render` 时,第一个参数需包含文件后缀。如果配置了 `defaultExtension`,则可以省略后缀
9396

9497
```js
9598
// config/config.default.js
@@ -105,19 +108,19 @@ await ctx.render('home');
105108

106109
## 渲染页面
107110

108-
框架在 Context 上提供了 3 个接口,返回值均为 Promise:
111+
框架在 Context 上提供了三个返回 Promise 的接口:
109112

110-
- `render(name, locals)` 渲染模板文件, 并赋值给 ctx.body
111-
- `renderView(name, locals)` 渲染模板文件, 仅返回不赋值
112-
- `renderString(tpl, locals)` 渲染模板字符串, 仅返回不赋值
113+
- `render(name, locals)`渲染模板文件并赋值给 `ctx.body`
114+
- `renderView(name, locals)`:仅渲染模板文件,不赋值
115+
- `renderString(tpl, locals)`渲染模板字符串,不赋值
113116

114117
```js
115118
// {app_root}/app/controller/home.js
116119
class HomeController extends Controller {
117120
async index() {
118121
const data = { name: 'egg' };
119122

120-
// render a template, path relate to `app/view`
123+
// render a template, path related to `app/view`
121124
await ctx.render('home/index.tpl', data);
122125

123126
// or manually set render result to ctx.body
@@ -131,55 +134,54 @@ class HomeController extends Controller {
131134
}
132135
```
133136

134-
当使用 `renderString` 时需要指定模板引擎,如果已经定义 `defaultViewEngine` 这里可以省略。
135-
136-
## Locals
137+
当使用 `renderString` 时需指定模板引擎。如果已定义 `defaultViewEngine`,则可省略。
138+
## 本地变量(Locals)
137139

138140
在渲染页面的过程中,我们通常需要一个变量来收集需要传递给模板的变量,在框架里面,我们提供了 `app.locals``ctx.locals`
139141

140-
- `app.locals` 为全局的,一般在 `app.js` 里面配置全局变量。
141-
- `ctx.locals` 为单次请求的,会合并 `app.locals`
142-
- 可以直接赋值对象,框架在对应的 setter 里面会自动 merge。
142+
- `app.locals` 具有全局作用域,一般在 `app.js` 里面配置全局变量。
143+
- `ctx.locals` 具有请求作用域,它会合并 `app.locals` 的内容
144+
- 可以直接对它们赋值对象,框架的对应 setter 将会自动进行 merge 操作
143145

144146
```js
145-
// `app.locals` 会合并到 `ctx.locals
147+
// `app.locals` 的内容会被合并到 `ctx.locals`
146148
ctx.app.locals = { a: 1 };
147149
ctx.locals.b = 2;
148-
console.log(ctx.locals); // { a: 1, b: 2 }
150+
console.log(ctx.locals); // 输出:{ a: 1, b: 2 }
149151

150-
// 一次请求过程中,仅会在第一次使用 `ctx.locals` 时把 `app.locals` 合并进去
152+
// 在一次请求中,只有在首次使用 `ctx.locals` 时才会合并 `app.locals`。
151153
ctx.app.locals = { a: 2 };
152-
console.log(ctx.locals); // 上面已经合并过一次,故输出还是 { a: 1, b: 2 }
154+
console.log(ctx.locals); // 由于已经进行过合并,结果仍然是:{ a: 1, b: 2 }
153155

154-
// 也可以直接赋值整个对象,不用担心会覆盖前面的值,我们通过 setter 做了自动合并
156+
// 也可以直接赋值整个对象,不必担心会覆盖前面的值。setter 已完成自动合并
155157
ctx.locals.c = 3;
156158
ctx.locals = { d: 4 };
157-
console.log(ctx.locals); // { a: 1, b: 2, c: 3, d: 4 }
159+
console.log(ctx.locals); // 输出:{ a: 1, b: 2, c: 3, d: 4 }
158160
```
159161

160-
但在实际业务开发中,controller 中一般不会直接使用这 2 个对象,直接使用 `ctx.render(name, data)` 即可:
162+
但在实际业务开发中,控制器(controller)通常不会直接操作这两个对象,直接使用 `ctx.render(name, data)` 即可:
161163

162-
- 框架会自动把 `data` 合并到 `ctx.locals`
163-
- 框架会自动注入 `ctx`, `request`, `helper` 方便使用
164+
- 框架会自动将 `data` 合并到 `ctx.locals`
165+
- 框架会自动注入 `ctx``request``helper`,便于使用
164166

165167
```js
166168
ctx.app.locals = { appName: 'showcase' };
167169
const data = { name: 'egg' };
168170

169-
// will auto merge `data` to `ctx.locals`, output: egg - showcase
171+
// 框架会自动合并 `data` `ctx.locals`,输出:egg - showcase
170172
await ctx.renderString('{{ name }} - {{ appName }}', data);
171173

172-
// helper, ctx, request will auto inject
174+
// `helper`、`ctx`、`request` 将被自动注入。
173175
await ctx.renderString(
174176
'{{ name }} - {{ helper.lowercaseFirst(ctx.app.config.baseDir) }}',
175-
data,
177+
data
176178
);
177179
```
178180

179181
注意:
180182

181-
- **ctx.locals 有缓存,只在第一次访问 ctx.locals 时合并 app.locals**
182-
- Koa 中的 `ctx.state`由于容易产生歧义,在框架中被覆盖为 locals,即 `ctx.state``ctx.locals` 等价,我们建议使用后者
183+
- `ctx.locals` 有缓存,只在首次访问时合并 `app.locals`
184+
- 在原生 Koa 中的 `ctx.state`由于可能产生歧义,在框架中被覆盖为 `locals`,即 `ctx.state``ctx.locals` 相等,我们推荐使用后者
183185

184186
## Helper
185187

@@ -193,9 +195,9 @@ exports.lowercaseFirst = (str) => str[0].toLowerCase() + str.substring(1);
193195
await ctx.renderString('{{ helper.lowercaseFirst(name) }}', data);
194196
```
195197

196-
## Security
198+
## 安全性(Security
197199

198-
框架内置的 [egg-security] 插件,为我们提供了常见的安全辅助函数,包括 `helper.shtml / surl / sjs` 等等等,强烈建议阅读下[安全](./security.md)
200+
框架内置的 [egg-security] 插件,提供了常见的安全辅助函数,包括 `helper.shtml``surl``sjs` 等,强烈建议阅读安全性相关的[文档内容](./security.md)
199201

200202
[egg-security]: https://github.com/eggjs/egg-security
201203
[egg-view-nunjucks]: https://github.com/eggjs/egg-view-nunjucks

‎site/docs/intro/egg-and-koa.zh-CN.md

+40-39
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,18 @@ order: 1
55

66
## 异步编程模型
77

8-
Node.js 是一个异步的世界,官方 API 支持的都是 callback 形式的异步编程模型,这会带来许多问题,例如
8+
Node.js 是一个异步的世界,官方 API 支持的都是 callback 形式的异步编程模型,这带来了许多问题,例如
99

10-
- [callback hell](http://callbackhell.com/): 最臭名昭著的 callback 嵌套问题。
11-
- [release zalgo](https://oren.github.io/#/articles/zalgo/): 异步函数中可能同步调用 callback 返回数据,带来不一致性
10+
- [callback hell](http://callbackhell.com/)最臭名昭著的 callback 嵌套问题。
11+
- [release zalgo](https://oren.github.io/#/articles/zalgo/)异步函数中可能同步调用 callback 返回数据,导致不一致性
1212

13-
因此社区提供了各种异步的解决方案,最终胜出的是 Promise,它也内置到了 ECMAScript 2015 中。而在 Promise 的基础上,结合 Generator 提供的切换上下文能力,出现了 [co] 等第三方类库来让我们用同步写法编写异步代码。同时,[async function] 这个官方解决方案也于 ECMAScript 2017 中发布,并在 Node.js 8 中实现
13+
因此,社区提供了各种异步的解决方案。最终,Promise 胜出,并内置到了 ECMAScript 2015 中。基于 Promise Generator 提供的切换上下文能力,出现了 [co] 等第三方类库,让我们以同步的写法来编写异步代码。同时,[async function] 这个官方解决方案也在 ECMAScript 2017 中发布,并在 Node.js 8 中得到实现
1414

1515
### async function
1616

17-
[async function] 是语言层面提供的语法糖,在 async function 中,我们可以通过 `await` 关键字来等待一个 Promise 被 resolve(或者 reject,此时会抛出异常), Node.js 现在的 LTS 版本(8.x)已原生支持。
17+
[async function] 是语言层面提供的语法糖。在 async function 中,我们可通过 `await` 关键字等待一个 Promise 被 resolve(或 reject,在此情况下会抛出异常)。
18+
19+
Node.js 现在的 LTS 版本(8.x)已原生支持 async function。
1820

1921
```js
2022
const fn = async function () {
@@ -23,15 +25,15 @@ const fn = async function () {
2325
return { user, posts };
2426
};
2527
fn()
26-
.then((res) => console.log(res))
27-
.catch((err) => console.error(err.stack));
28+
.then(res => console.log(res))
29+
.catch(err => console.error(err.stack));
2830
```
2931

3032
## Koa
3133

32-
> [Koa](https://koajs.com/) 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石
34+
> [Koa](https://koajs.com/) 是一个新的 web 框架,由 Express 幕后的原班人马打造,致力于成为 web 应用和 API 开发领域中的更小、更富有表现力、更健壮的基础设施
3335
34-
Koa 和 Express 的设计风格非常类似,底层也都是共用的[同一套 HTTP 基础库](https://github.com/jshttp),但是有几个显著的区别,除了上面提到的默认异步解决方案之外,主要的特点还有下面几个。
36+
Koa 和 Express 的设计风格十分相似,底层也都是共用[同一套 HTTP 基础库](https://github.com/jshttp)。但它们存在几个明显的区别。除了上面提到的默认异步解决方案之外,Koa 的主要特点还包括以下几个:
3537

3638
### Middleware
3739

@@ -45,16 +47,16 @@ Koa 的中间件和 Express 不同,Koa 选择了洋葱圈模型。
4547

4648
![](https://raw.githubusercontent.com/koajs/koa/a7b6ed0529a58112bac4171e4729b8760a34ab8b/docs/middleware.gif)
4749

48-
所有的请求经过一个中间件的时候都会执行两次,对比 Express 形式的中间件,Koa 的模型可以非常方便的实现后置处理逻辑,对比 Koa Express 的 Compress 中间件就可以明显的感受到 Koa 中间件模型的优势。
50+
每个请求在经过一个中间件时都会执行两次,与 Express 形式的中间件相对,Koa 的模型可以方便地实现后置处理逻辑。比较 Koa Express 的 Compress 中间件,便可明显感受到 Koa 中间件模型的优势。
4951

50-
- [koa-compress](https://github.com/koajs/compress/blob/master/lib/index.js) for Koa.
51-
- [compression](https://github.com/expressjs/compression/blob/master/index.js) for Express.
52+
- [koa-compress](https://github.com/koajs/compress/blob/master/lib/index.js) for Koa
53+
- [compression](https://github.com/expressjs/compression/blob/master/index.js) for Express
5254

5355
### Context
5456

55-
Express 只有 Request 和 Response 两个对象不同,Koa 增加了一个 Context 的对象,作为这次请求的上下文对象(在 Koa 1 中为中间件的 `this`,在 Koa 2 中作为中间件的第一个参数传入)。我们可以将一次请求相关的上下文都挂载到这个对象上。类似 [traceId](https://github.com/eggjs/egg-tracer/blob/1.0.0/lib/tracer.js#L12) 这种需要贯穿整个请求(在后续任何一个地方进行其他调用都需要用到)的属性就可以挂载上去。相较于 request 和 response 而言更加符合语义
57+
Express 只有 Request 和 Response 两个对象不同,Koa 增加了一个 Context 对象,作为该次请求的上下文对象(在 Koa 1 中为中间件的 `this`,在 Koa 2 中作为中间件的第一个参数传入)。我们可将一次请求相关的上下文全部挂载至此对象上。例如,[traceId](https://github.com/eggjs/egg-tracer/blob/1.0.0/lib/tracer.js#L12) 这种需贯穿整个请求(之后在任何地方进行其他调用都需使用)的属性便可挂载上去。这比单独的 request 和 response 对象更加符合语义
5658

57-
同时 Context 上也挂载了 Request 和 Response 两个对象。和 Express 类似,这两个对象都提供了大量的便捷方法辅助开发,例如
59+
同时Context 上也挂载了 Request 和 Response 两个对象。和 Express 类似,两者都提供了许多便捷方法,辅助开发。例如:
5860

5961
- `get request.query`
6062
- `get request.hostname`
@@ -63,7 +65,7 @@ Koa 的中间件和 Express 不同,Koa 选择了洋葱圈模型。
6365

6466
### 异常处理
6567

66-
通过同步方式编写异步代码带来的另外一个非常大的好处就是异常处理非常自然,使用 `try catch` 就可以将按照规范编写的代码中的所有错误都捕获到。这样我们可以很便捷的编写一个自定义的错误处理中间件
68+
通过同步方式编写异步代码的另一个很大好处是,异常处理变得非常自然。我们可以使用 `try catch` 来捕获规范编写代码中的所有错误,从而非常容易地编写自定义的错误处理中间件
6769

6870
```js
6971
async function onerror(ctx, next) {
@@ -75,21 +77,20 @@ async function onerror(ctx, next) {
7577
ctx.status = err.status || 500;
7678
}
7779
}
78-
```
79-
80-
只需要将这个中间件放在其他中间件之前,就可以捕获它们所有的同步或者异步代码中抛出的异常了。
8180

81+
只需将此中间件放在其他中间件前,便可捕获所有同步或异步代码中抛出的异常。
82+
```
8283
## Egg 继承于 Koa
8384

84-
如上述,Koa 是一个非常优秀的框架,然而对于企业级应用来说,它还比较基础。
85+
如上所述,Koa 是一个非常优秀的框架。然而,对于企业级应用来说,它还比较基础。
8586

86-
而 Egg 选择了 Koa 作为其基础框架,在它的模型基础上,进一步对它进行了一些增强
87+
而 Egg 选择了 Koa 作为其基础框架,在它的模型基础上,对其进行了进一步的增强
8788

8889
### 扩展
8990

90-
在基于 Egg 的框架或者应用中,我们可以通过定义 `app/extend/{application,context,request,response}.js` 来扩展 Koa 中对应的四个对象的原型通过这个功能,我们可以快速的增加更多的辅助方法,例如我们在 `app/extend/context.js` 中写入下列代码
91+
在基于 Egg 的框架或者应用中,我们可以通过定义 `app/extend/{application,context,request,response}.js` 来扩展 Koa 中对应的四个对象的原型通过这个功能,我们可以快速增加更多的辅助方法。举例,我们在 `app/extend/context.js` 中写入以下代码
9192

92-
```js
93+
```javascript
9394
// app/extend/context.js
9495
module.exports = {
9596
get isIOS() {
@@ -99,9 +100,9 @@ module.exports = {
99100
};
100101
```
101102

102-
在 Controller 中,我们就可以使用到刚才定义的这个便捷属性了
103+
在 Controller 中,我们就可以使用刚才定义的这个便捷属性了
103104

104-
```js
105+
```javascript
105106
// app/controller/home.js
106107
exports.handler = (ctx) => {
107108
ctx.body = ctx.isIOS
@@ -114,38 +115,38 @@ exports.handler = (ctx) => {
114115

115116
### 插件
116117

117-
众所周知,在 Express 和 Koa 中,经常会引入许许多多的中间件来提供各种各样的功能,例如引入 [koa-session](https://github.com/koajs/session) 提供 Session 的支持,引入 [koa-bodyparser](https://github.com/koajs/bodyparser) 来解析请求 body。而 Egg 提供了一个更加强大的插件机制,让这些独立领域的功能模块可以更加容易编写
118+
众所周知,在 Express 和 Koa 中,我们经常会引入众多中间件来提供各种功能,如引入 [koa-session](https://github.com/koajs/session) 提供 Session 支持,引入 [koa-bodyparser](https://github.com/koajs/bodyparser) 解析请求体。Egg 提供了强大的插件机制,让这些独立领域的功能模块更易于编写
118119

119-
一个插件可以包含
120+
一个插件可以包含
120121

121-
- extend:扩展基础对象的上下文,提供各种工具类、属性
122-
- middleware:增加一个或多个中间件,提供请求的前置、后置处理逻辑
123-
- config:配置各个环境下插件自身的默认配置项
122+
- extend:扩展基础对象的上下文,提供工具类、属性等
123+
- middleware:加入一个或多个中间件,提供请求的前置、后置逻辑处理
124+
- config:配置不同环境下插件的默认配置项
124125

125-
一个独立领域下的插件实现,可以在代码维护性非常高的情况下实现非常完善的功能,而插件也支持配置各个环境下的默认(最佳)配置,让我们使用插件的时候几乎可以不需要修改配置项
126+
在一个独立领域下实现的插件,可以在维护性非常高的情况下提供完善的功能。插件还支持配置各个环境下的默认(最佳)配置,使得使用插件时几乎无需修改配置项
126127

127-
[egg-security](https://github.com/eggjs/egg-security) 插件就是一个典型的例子
128+
[egg-security](https://github.com/eggjs/egg-security) 插件是一个典型的例子
128129

129130
更多关于插件的内容,请查看[插件](../basics/plugin.md)章节。
130131

131132
### Egg 与 Koa 的版本关系
132133

133134
#### Egg 1.x
134135

135-
Egg 1.x 发布时,Node.js 的 LTS 版本尚不支持 async function,所以 Egg 1.x 仍然基于 Koa 1.x 开发,但是在此基础上,Egg 全面增加了 async function 的支持再加上 Egg 对 Koa 2.x 的中间件也完全兼容,应用层代码可以完全基于 `async function` 来开发
136+
Egg 1.x 发布时,Node.js 的 LTS 版本尚不支持 `async function`,因此 Egg 1.x 基于 Koa 1.x 开发。在此基础上,Egg 全面增加了对 `async function` 的支持再加上 Egg 对 Koa 2.x 的中间件完全兼容,应用层代码可以完全基于 `async function` 开发
136137

137138
- 底层基于 Koa 1.x,异步解决方案基于 [co] 封装的 generator function。
138-
- 官方插件以及 Egg 核心使用 generator function 编写,保持对 Node.js LTS 版本的支持,在必要处通过 co 包装以兼容在 async function 中的使用
139-
- 应用开发者可以选择 async function(Node.js 8.x+) 或者 generator function(Node.js 6.x+)进行编写
139+
- Egg 核心和官方插件使用 generator function 编写,通过 co 包装兼容 async function。
140+
- 开发者可以根据 Node.js 版本选择使用 async function 或 generator function。
140141

141142
#### Egg 2.x
142143

143-
Node.js 8 正式进入 LTS 后,async function 可以在 Node.js 中使用并且没有任何性能问题了,Egg 2.x 基于 Koa 2.x,框架底层以及所有内置插件都使用 async function 编写,并保持了对 Egg 1.x 以及 generator function 的完全兼容,应用层只需要升级到 Node.js 8 即可从 Egg 1.x 迁移到 Egg 2.x。
144+
Node.js 8 正式进入 LTS 后,`async function` Node.js 中无性能问题,Egg 2.x 基于 Koa 2.x 开发。框架底层和所有内置插件都采用 `async function` 编写, Egg 1.x generator function 保持完全兼容。应用层只需升级到 Node.js 8即可从 Egg 1.x 迁移到 Egg 2.x。
144145

145-
- 底层基于 Koa 2.x,异步解决方案基于 async function。
146-
- 官方插件以及 Egg 核心使用 async function 编写。
147-
- 建议业务层迁移到 async function 方案
148-
- 只支持 Node.js 8 及以上的版本
146+
- 底层基于 Koa 2.x,异步解决方案采用 async function。
147+
- Egg 核心和官方插件使用 async function 编写。
148+
- 建议业务层迁移到 async function 解决方案
149+
- 仅支持 Node.js 8 及以上版本
149150

150151
[co]: https://github.com/tj/co
151152
[async function]: https://github.com/tc39/ecmascript-asyncawait

0 commit comments

Comments
 (0)
Please sign in to comment.