From d17cf5f50665b9fb8e6c1825c9c4ab31270f91ea Mon Sep 17 00:00:00 2001
From: Zhicheng WANG
Date: Fri, 7 Jun 2019 13:37:23 +0800
Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E8=AE=A2=E5=90=88=E5=B9=B6?=
=?UTF-8?q?=E5=86=B2=E7=AA=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
aio/content/guide/architecture-components.md | 2 +-
aio/content/guide/attribute-directives.md | 2 +-
aio/content/guide/cheatsheet.md | 20 +++------
aio/content/guide/component-styles.md | 2 +
aio/content/guide/dependency-injection.md | 3 +-
aio/content/guide/deployment.md | 2 +-
aio/content/guide/elements.md | 2 +-
aio/content/guide/file-structure.md | 17 ++++----
aio/content/guide/glossary.md | 6 ++-
aio/content/guide/ivy.md | 11 +++--
aio/content/guide/lazy-loading-ngmodules.md | 2 +-
aio/content/guide/npm-packages.md | 6 +--
aio/content/guide/releases.md | 4 +-
aio/content/guide/router.md | 43 ++++++++------------
aio/content/guide/setup.md | 10 +++--
aio/content/guide/visual-studio-2015.md | 18 ++++----
aio/content/marketing/docs.md | 16 ++++----
aio/content/start/data.md | 14 +++----
aio/content/start/deployment.md | 8 ++--
aio/content/start/forms.md | 6 +--
aio/content/start/index.md | 6 +--
aio/content/start/routing.md | 6 +--
aio/content/tutorial/index.md | 5 +--
aio/content/tutorial/toh-pt6.md | 10 +++++
24 files changed, 116 insertions(+), 105 deletions(-)
diff --git a/aio/content/guide/architecture-components.md b/aio/content/guide/architecture-components.md
index 26f7c29b5c..3fdaa054e2 100644
--- a/aio/content/guide/architecture-components.md
+++ b/aio/content/guide/architecture-components.md
@@ -154,7 +154,7 @@ Notice how custom components like this mix seamlessly with native HTML in the sa
Without a framework, you would be responsible for pushing data values into the HTML controls and turning user responses into actions and value updates. Writing such push and pull logic by hand is tedious, error-prone, and a nightmare to read, as any experienced front-end JavaScript programmer can attest.
如果没有框架,你就要自己负责把数据值推送到 HTML 控件中,并把来自用户的响应转换成动作和对值的更新。
-手动写这种数据推拉逻辑会很枯燥、容易出错,难以阅读 —— 用过 jQuery 的程序员一定深有体会。
+手动写这种数据推拉逻辑会很枯燥、容易出错,难以阅读 —— 有前端 JavaScript 开发经验的程序员一定深有体会。
Angular supports *two-way data binding*, a mechanism for coordinating the parts of a template with the parts of a component. Add binding markup to the template HTML to tell Angular how to connect both sides.
diff --git a/aio/content/guide/attribute-directives.md b/aio/content/guide/attribute-directives.md
index efeeaa5773..394de3a88e 100644
--- a/aio/content/guide/attribute-directives.md
+++ b/aio/content/guide/attribute-directives.md
@@ -36,7 +36,7 @@ There are three kinds of directives in Angular:
You saw a component for the first time in the [Getting Started](start "Getting Started with Angular") tutorial.
*组件*是这三种指令中最常用的。
-你在[快速上手](guide/quickstart)例子中第一次见到组件。
+你在[快速上手](start "Getting Started with Angular")例子中第一次见到组件。
*Structural Directives* change the structure of the view.
Two examples are [NgFor](guide/template-syntax#ngFor) and [NgIf](guide/template-syntax#ngIf).
diff --git a/aio/content/guide/cheatsheet.md b/aio/content/guide/cheatsheet.md
index cf6226b7de..2af73ac457 100644
--- a/aio/content/guide/cheatsheet.md
+++ b/aio/content/guide/cheatsheet.md
@@ -1271,33 +1271,25 @@ so the @Directive configuration applies to components as well
An interface for defining a class that the router should call first to determine if it should activate this component. Should return a boolean|UrlTree or an Observable/Promise that resolves to a boolean|UrlTree.
An interface for defining a class that the router should call first to determine if it should deactivate this component after a navigation. Should return a boolean|UrlTree or an Observable/Promise that resolves to a boolean|UrlTree.
-
+
An interface for defining a class that the router should call first to determine if it should deactivate this component after a navigation. Should return a boolean|UrlTree or an Observable/Promise that resolves to a boolean|UrlTree.
-
An interface for defining a class that the router should call first to determine if it should deactivate this component after a navigation. Should return a boolean or an Observable/Promise that resolves to a boolean.
An interface for defining a class that the router should call first to determine if it should activate the child route. Should return a boolean|UrlTree or an Observable/Promise that resolves to a boolean|UrlTree.
-
-
+
An interface for defining a class that the router should call first to determine if it should activate the child route. Should return a boolean|UrlTree or an Observable/Promise that resolves to a boolean|UrlTree.
-
An interface for defining a class that the router should call first to determine if it should activate the child route. Should return a boolean or an Observable/Promise that resolves to a boolean.
@@ -1328,7 +1320,7 @@ so the @Directive configuration applies to components as well
An interface for defining a class that the router should call first to check if the lazy loaded module should be loaded. Should return a boolean|UrlTree or an Observable/Promise that resolves to a boolean|UrlTree.
diff --git a/aio/content/guide/component-styles.md b/aio/content/guide/component-styles.md
index 27885a6289..0e19d65835 100644
--- a/aio/content/guide/component-styles.md
+++ b/aio/content/guide/component-styles.md
@@ -172,6 +172,8 @@ to the current component and all its descendants, be sure to include the `:host`
`::ng-deep`. If the `::ng-deep` combinator is used without the `:host` pseudo-class selector, the style
can bleed into other components.
+把伪类 `::ng-deep` 应用到如何一条 CSS 规则上就会完全禁止对那条规则的视图包装。任何带有 `::ng-deep` 的样式都会变成全局样式。为了把指定的样式限定在当前组件及其下级组件中,请确保在 `::ng-deep` 之前带上 `:host` 选择器。如果 `::ng-deep` 组合器在 `:host` 伪类之外使用,该样式就会污染其它组件。
+
The following example targets all `
` elements, from the host element down
through this component to all of its child elements in the DOM.
diff --git a/aio/content/guide/dependency-injection.md b/aio/content/guide/dependency-injection.md
index e547a49fbd..71cbd583df 100644
--- a/aio/content/guide/dependency-injection.md
+++ b/aio/content/guide/dependency-injection.md
@@ -376,7 +376,8 @@ The `@Injectable()` decorator is the standard decorator for service classes.
The decorator requirement is imposed by TypeScript. TypeScript normally discards parameter type information when it [transpiles](guide/glossary#transpile) the code to JavaScript. TypeScript preserves this information if the class has a decorator and the `emitDecoratorMetadata` compiler option is set `true` in TypeScript's `tsconfig.json` configuration file. The CLI configures `tsconfig.json` with `emitDecoratorMetadata: true`.
- 对装饰器的需求是 TypeScript 强制要求的。当 TypeScript 把代码[转译](guide/glossary#transpile)成 JavaScript 时,一般会丢弃参数的类型信息。只有当类具有装饰器,并且 `tsconfig.json` 中的编译器选项 `emitDecoratorMetadata` 为 `true` 时,TypeScript 才会保留这些信息。CLI 所配置的 `tsconfig.json` 就带有 `emitDecoratorMetadata: true`。
+ 装饰器是 TypeScript 强制要求的。当 TypeScript 把代码[转译](guide/glossary#transpile)成 JavaScript 时,一般会丢弃参数的类型信息。只有当类具有装饰器,并且 `tsconfig.json` 中的编译器选项 `emitDecoratorMetadata` 为 `true` 时,TypeScript 才会保留这些信息。CLI 所配置的 `tsconfig.json` 就带有 `emitDecoratorMetadata: true`。
+
This means you're responsible for putting `@Injectable()` on your service classes.
这意味着你有责任给所有服务类加上 `@Injectable()`。
diff --git a/aio/content/guide/deployment.md b/aio/content/guide/deployment.md
index 6e3f06e563..f89985e4a9 100644
--- a/aio/content/guide/deployment.md
+++ b/aio/content/guide/deployment.md
@@ -538,7 +538,7 @@ showing exactly which classes are included in the bundle.
Here's the output for the _main_ bundle of an example app called `cli-quickstart`.
-下面是 "快速上手" 应用中 `main` 包的输出。
+下面是范例应用 `cli-quickstart` 中 `main` 包的输出。
diff --git a/aio/content/guide/elements.md b/aio/content/guide/elements.md
index 7d9c8cb85c..b83a7073fc 100644
--- a/aio/content/guide/elements.md
+++ b/aio/content/guide/elements.md
@@ -12,7 +12,7 @@ The browser maintains a `CustomElementRegistry` of defined custom elements, whic
[自定义元素](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements)这项特性目前受到了 Chrome、Opera 和 Safari 的支持,在其它浏览器中也能通过腻子脚本(参见[浏览器支持](#browser-support))加以支持。
自定义元素扩展了 HTML,它允许你定义一个由 JavaScript 代码创建和控制的标签。
-浏览器会维护一个自定义元素(也叫 Web Components)的注册表 `CustomElementRegistry`,它把一个可实例化的 JavaScript 类映射到 HTML 标签上。
+浏览器会维护一个自定义元素的注册表 `CustomElementRegistry`,它把一个可实例化的 JavaScript 类映射到 HTML 标签上。
The `@angular/elements` package exports a `createCustomElement()` API that provides a bridge from Angular's component interface and change detection functionality to the built-in DOM API.
diff --git a/aio/content/guide/file-structure.md b/aio/content/guide/file-structure.md
index d6a8e8d067..a420b0948a 100644
--- a/aio/content/guide/file-structure.md
+++ b/aio/content/guide/file-structure.md
@@ -20,14 +20,15 @@ ng new <my-project>
When you run this command, the CLI installs the necessary Angular npm packages and other dependencies in a new workspace, with a root-level application named *my-project*.
The workspace root folder contains various support and configuration files, and a README file with generated descriptive text that you can customize.
-当你运行这个命令时,CLI 会在一个新的工作区中安装必需的 Angular npm 包和其它依赖项,其根文件夹名叫 *project_name*。该工作空间的根文件夹中包含一些工作空间配置文件,和一个带有自动生成的描述性文本的自述文件,你可以自定义它。
+当你运行这个命令时,CLI 会在一个新的工作区中安装必需的 Angular npm 包和其它依赖项,其根应用名叫 *my-project*。
+该工作空间的根文件夹中包含一些工作空间配置文件,和一个带有自动生成的描述性文本的自述文件,你可以自定义它。
By default, `ng new` creates an initial skeleton application at the root level of the workspace, along with its end-to-end tests.
The skeleton is for a simple Welcome application that is ready to run and easy to modify.
The root-level application has the same name as the workspace, and the source files reside in the `src/` subfolder of the workspace.
-`ng new` 还会默认创建一个初始的骨架应用,以及它的端到端测试项目。这个骨架是一个简单的 Welcome 应用,它可以运行,也很容易修改。这个*根应用*与工作空间同名,其源文件位于工作空间的 `src/` 子文件夹中。
+`ng new` 还会默认创建一个位于工作空间根级的骨架应用,及其端到端测试项目。这个骨架是一个简单的 Welcome 应用,它可以运行,也很容易修改。这个*根应用*与工作空间同名,其源文件位于工作空间的 `src/` 子文件夹中。
This default behavior is suitable for a typical "multi-repo" development style where each application resides in its own workspace.
@@ -57,7 +58,7 @@ See [Setting up for a multi-project workspace](#multiple-projects) below.
All projects within a workspace share a [CLI configuration context](guide/workspace-config).
The top level of the workspace contains workspace-wide configuration files, configuration files for the root-level application, and subfolders for the root-level application source and test files.
-每个工作空间中的所有项目共享同一个 [CLI 配置环境](guide/workspace-config) 。该工作空间的顶层包含着全工作空间级的配置文件。
+每个工作空间中的所有项目共享同一个 [CLI 配置环境](guide/workspace-config) 。该工作空间的顶层包含着全工作空间级的配置文件、根应用的配置文件以及一些包含根应用的源文件和测试文件的子文件夹。
| WORKSPACE CONFIG FILES | PURPOSE |
| :--------------------- | :------------------------------------------|
@@ -91,13 +92,13 @@ The top level of the workspace contains workspace-wide configuration files, conf
By default, the CLI command `ng new my-app` creates a workspace folder named "my-app" and generates a new application skeleton in a `src/` folder at the top level of the workspace.
A newly generated application contains source files for a root module, with a root component and template.
-CLI 命令`ng new my-app` 会默认创建名为 “my-app” 的工作空间文件夹,并为工作空间顶层的根应用生成一个新的应用骨架。新生成的应用包含一个根模块的源文件,包括一个根组件及其模板。
+CLI 命令`ng new my-app` 会默认创建名为 “my-app” 的工作空间文件夹,并在 `src/` 文件夹下为工作空间顶层的根应用生成一个新的应用骨架。新生成的应用包含一个根模块的源文件,包括一个根组件及其模板。
When the workspace file structure is in place, you can use the `ng generate` command on the command line to add functionality and data to the application.
This initial root-level application is the *default app* for CLI commands (unless you change the default after creating [additional apps](#multiple-projects)).
-当工作空间文件结构到位时,可以在命令行中使用 `ng generate` 命令往该应用中添加功能和数据。这个初始的起步者应用是 CLI 命令的*默认应用*(除非你在创建[其它应用](#multiple-projects)之后更改了默认值)。
+当工作空间文件结构到位时,可以在命令行中使用 `ng generate` 命令往该应用中添加功能和数据。这个初始的根应用是 CLI 命令的*默认应用*(除非你在创建[其它应用](#multiple-projects)之后更改了默认值)。
@@ -207,10 +208,12 @@ Project-specific [TypeScript](https://www.typescriptlang.org/) configuration fil
An `e2e/` folder at the top level contains source files for a set of end-to-end tests that correspond to the root-level application, along with test-specific configuration files.
+根级的 `e2e/` 文件夹中包含一组针对根应用的端到端测试的源文件,以及测试专属的配置文件。
+
+
For a multi-project workspace, application-specific end-to-end tests are in the project root, under `projects/project-name/e2e/`.
-`e2e/` 子文件夹包含一组和应用对应的端到端测试的源文件,以及测试专属的配置文件。
-
+对于多项目的工作空间,应用专属的端到端测试文件都位于项目各自的根目录下,即 `projects/project-name/e2e/`。
e2e/
diff --git a/aio/content/guide/glossary.md b/aio/content/guide/glossary.md
index 83465f9191..4616c6be81 100644
--- a/aio/content/guide/glossary.md
+++ b/aio/content/guide/glossary.md
@@ -302,7 +302,8 @@ CLI 支持开发周期中的所有阶段,比如构建、测试、打包和部
* To begin using the CLI for a new project, see [Local Environment Setup](guide/setup-local "Setting up for Local Development").
- 要开始使用 CLI 来创建新项目,参见[快速起步](guide/quickstart)。
+ 要开始使用 CLI 来创建新项目,参见[建立本地开发环境](guide/setup-local "Setting up for Local Development")。
+
* To learn more about the full capabilities of the CLI, see the [CLI command reference](cli).
要了解 CLI 的全部功能,参见 [CLI 命令参考手册](cli)。
@@ -1069,6 +1070,7 @@ To learn more, see [Pipes](guide/pipes).
要了解更多,参见[管道](guide/pipes)页。
+{@a polyfill}
## polyfill
## 腻子脚本(polyfill)
@@ -1255,7 +1257,7 @@ Add these schematics to the npm package that you use to publish and share your l
For more information, see [Schematics](guide/schematics) and [Integrating Libraries with the CLI](guide/creating-libraries#integrating-with-the-cli).
- 欲知详情,参见 [devkit 文档](https://www.npmjs.com/package/@angular-devkit/schematics)。
+ 欲知详情,参见[原理图](guide/schematics)和[把库与 CLI 集成](guide/creating-libraries#integrating-with-the-cli)。
{@a schematics-cli}
diff --git a/aio/content/guide/ivy.md b/aio/content/guide/ivy.md
index df7d26232e..b4ea625cf0 100644
--- a/aio/content/guide/ivy.md
+++ b/aio/content/guide/ivy.md
@@ -4,15 +4,16 @@
Ivy is the code name for Angular's [next-generation compilation and rendering pipeline](https://blog.angular.io/a-plan-for-version-8-0-and-ivy-b3318dfc19f7). Starting with Angular version 8, you can choose to opt in to start using a preview version of Ivy and help in its continuing development and tuning.
+Ivy 是 Angular [下一代编译和渲染管道](https://blog.angular.io/a-plan-for-version-8-0-and-ivy-b3318dfc19f7)的代号。从 Angular 的版本 8 开始,你就可以开始选用 Ivy 的预览版,并帮助我们继续对它开发和调优了。
+
+
To preview Ivy, use `@angular/core@next` version of Angular (8.1.x), rather than `@angular/core@latest` (8.0.x), as it contains all the latest bug fixes and improvements.
+ 要想预览 Ivy,请使用 Angular 的 `@angular/core@next` 版(8.1.x),而不是 `@angular/core@latest` 版(8.0.x),因为它包含了最近的所有 BUG 修复和改进。
-Ivy 是 Angular [下一代编译和渲染管道](https://blog.angular.io/a-plan-for-version-8-0-and-ivy-b3318dfc19f7)的代号。从 Angular 的版本 8 开始,你就可以开始选用 Ivy 了,以帮助它继续开发和调优。
-
-
## Using Ivy in a new project
## 在新项目中使用 Ivy
@@ -53,6 +54,8 @@ To update an existing project to use Ivy, set the `enableIvy` option in the `ang
AOT compilation with Ivy is faster and should be used by default. In the `angular.json` workspace configuration file, set the default build options for your project to always use AOT compilation.
+利用 Ivy 进行 AOT 编译会更快,应该默认使用它。在工作空间配置文件 `angular.json` 中,为你的项目设置默认构建选项,让它总是使用 AOT 编译。
+
```json
{
"projects": {
@@ -74,4 +77,4 @@ To stop using the Ivy compiler, set `enableIvy` to `false` in `tsconfig.app.json
要停止使用 Ivy 编译器,请在 `enableIvy` 中把 `tsconfig.app.json` 设置为 `false` ,或者把它完全删除。
-
+同时,从默认的构建选项中移除 `"aot": true`(如果有)。
diff --git a/aio/content/guide/lazy-loading-ngmodules.md b/aio/content/guide/lazy-loading-ngmodules.md
index 90aed15969..1568226f56 100644
--- a/aio/content/guide/lazy-loading-ngmodules.md
+++ b/aio/content/guide/lazy-loading-ngmodules.md
@@ -243,7 +243,7 @@ In `AppRoutingModule`, update the `routes` array with the following:
The import statements stay the same. The first two paths are the routes to the `CustomersModule` and the `OrdersModule` respectively. Notice that the lazy loading syntax uses `loadChildren` followed by a function that uses the browser's built-in `import('...')` syntax for dynamic imports. The import path is the relative path to the module.
-这些 `import` 语句没有变化。前两个路径分别路由到了 `CustomersModule` 和 `OrdersModule`。注意看惰性加载的语法:`loadChildren` 后面紧跟着一个字符串,它指向模块的相对路径,然后是一个 `#`,然后是该模块的类名。
+这些 `import` 语句没有变化。前两个路径分别路由到了 `CustomersModule` 和 `OrdersModule`。注意看惰性加载的语法:`loadChildren` 后面紧跟着一个函数,它使用浏览器内置的 `import('...')` 语法来实现动态导入。这里的导入路径是到那个模块的相对路径。
### Inside the feature module
diff --git a/aio/content/guide/npm-packages.md b/aio/content/guide/npm-packages.md
index e22804b7f9..b280c4259f 100644
--- a/aio/content/guide/npm-packages.md
+++ b/aio/content/guide/npm-packages.md
@@ -18,7 +18,7 @@ Alternatively, you can use the [yarn client](https://yarnpkg.com/) for downloadi
See [Local Environment Setup](guide/setup-local "Setting up for Local Development") for information about the required versions and installation of `Node.js` and `npm`.
-参见[快速起步](guide/quickstart#prerequisites),以了解所需的 Node.js 和 npm 版本。
+参见[建立本地开发环境](guide/setup-local "Setting up for Local Development"),以了解所需的 `Node.js` 和 `npm` 版本。
If you already have projects running on your machine that use other versions of Node.js and npm, consider using [nvm](https://github.com/creationix/nvm) to manage the multiple versions of Node.js and npm.
@@ -82,9 +82,9 @@ The `dependencies` section of `package.json` contains:
* [**Angular packages**](#angular-packages): Angular core and optional modules; their package names begin `@angular/`.
- *[*Angular 包**:Angular 的核心和可选模块,它们的包名以 `@angular/` 开头。
+ [**Angular 包**:Angular 的核心和可选模块,它们的包名以 `@angular/` 开头。
-* **[Support packages**](#support-packages): 3rd party libraries that must be present for Angular apps to run.
+* [**Support packages**](#support-packages): 3rd party libraries that must be present for Angular apps to run.
[**支持包**](#support-packages):那些 Angular 应用运行时必需的第三方库。
diff --git a/aio/content/guide/releases.md b/aio/content/guide/releases.md
index 8cd5181dbd..9fe1f92db4 100644
--- a/aio/content/guide/releases.md
+++ b/aio/content/guide/releases.md
@@ -183,9 +183,11 @@ Version | Status | Released | Active Ends | LTS Ends
------- | ------ | ------------ | ------------ | ------------
版本 | 状态 | 发布 | 停止活动 | LTS 结束
^8.0.0 | Active | May 28, 2019 | Nov 28, 2019 | Nov 28, 2020
+^8.0.0 | 活跃 | 2019年5月28日 | 2019年11月28日 | 2020年11月28日
^7.0.0 | LTS | Oct 18, 2018 | Apr 18, 2019 | Apr 18, 2020
-^7.0.0 | 活动 | 2018年10月18日 | 2019年4月18日 | 2020年4月18日
+^7.0.0 | LTS | 2018年10月18日 | 2019年4月18日 | 2020年4月18日
^6.0.0 | LTS | May 3, 2018 | Nov 3, 2018 | Nov 3, 2019
+^6.0.0 | LTS | 2018年5月3日 | 2018年11月3日 | 2019年11月3日
Angular versions ^4.0.0 and ^5.0.0 are no longer under support.
diff --git a/aio/content/guide/router.md b/aio/content/guide/router.md
index 964cdd6458..6c965f41c7 100644
--- a/aio/content/guide/router.md
+++ b/aio/content/guide/router.md
@@ -4260,7 +4260,7 @@ A guard's return value controls the router's behavior:
-**Note:**The guard can also tell the router to navigate elsewhere, effectively canceling the current navigation. When
+**Note:** The guard can also tell the router to navigate elsewhere, effectively canceling the current navigation. When
doing so inside a guard, the guard should return `false`;
**注意**:守卫还可以告诉路由器导航到别处,这样也会取消当前的导航。要想在守卫中这么做,就要返回 `false`;
@@ -4400,8 +4400,7 @@ The admin feature file structure looks like this:
@@ -5377,8 +5368,10 @@ The `loadChildren` property takes a function that returns a promise using the br
The path is the location of the `AdminModule` (relative to the app root).
After the code is requested and loaded, the `Promise` resolves an object that contains the `NgModule`, in this case the `AdminModule`.
-给它一个 `loadChildren` 属性(替换掉 `children` 属性),把它设置为 `AdminModule` 的地址。
-该地址是 `AdminModule` 的文件路径(相对于 `app` 目录的),加上一个 `#` 分隔符,再加上导出模块的类名 `AdminModule`。
+给它一个 `loadChildren` 属性(替换掉 `children` 属性)。
+`loadChildren` 属性接收一个函数,该函数使用浏览器内置的动态导入语法 `import('...')` 来惰性加载代码,并返回一个承诺(Promise)。
+其路径是 `AdminModule` 的位置(相对于应用的根目录)。
+当代码请求并加载完毕后,这个 `Promise` 就会解析成一个包含 `NgModule` 的对象,也就是 `AdminModule`。
diff --git a/aio/content/guide/setup.md b/aio/content/guide/setup.md
index 86560383ad..e863bcb09c 100644
--- a/aio/content/guide/setup.md
+++ b/aio/content/guide/setup.md
@@ -1,6 +1,6 @@
# Setup for Upgrading from AngularJS
-# 搭建本地开发环境
+# 准备从 AngularJS 升级