该帖子最初发布于 我的网站:https://dsebastien.net
在本文中,我将介绍(几乎)这个全新版本中值得注意的所有内容。 我还将重点介绍围绕 Angular 的变化,就像我在之前的文章中所做的一样 角度11 和 角度10.
如果您只是在寻找鸟瞰图,请查看 正式发布公告. 在这里,我将更深入地研究发行说明。
加入常春藤联盟…
Angular 团队一直致力于 常春藤 (新的编译和渲染管道)自 2018 年以来。它终于与 Angular 8 一起发布。从 Angular 9 开始,Ivy 一直是新项目的默认设置,并且生态系统正在慢慢迁移到它。 使用 Angular 12, 旧的视图引擎现已正式弃用. 它将在未来的主要版本中删除。 此外,无法使用 View Engine 创建新应用程序。 最后,Ivy 现在是新库项目的默认设置。
在这一点上,库作者仍然可以依靠视图引擎感谢 ngcc
(Angular 的兼容性编译器),但现在是他们评估是否可以将他们的库迁移到 Ivy 的时候了。 几周前,Minko Gechev 发表了 一篇文章 详细解释一下。 另外,查看相关 RFC.
万一你不知道 ngcc
是在创建 Angular 项目或安装依赖项后运行的小过程。 当您看到类似消息时 Compiling ... : es2015 as esm2015
, 它的 ngcc
做它的工作。 什么 ngcc
确实是编译依赖于 View Engine 的库,以便 Ivy 可以使用这些库。
像我一样,你可能已经注意到 ngcc
需要大量时间来执行,并且对开发人员体验有非常负面的影响。 这就是为什么 Angular 生态系统尽快迁移到 Ivy 至关重要。 其次,在生态系统的大部分发展之前,Angular 团队将不得不保留 View Engine,由于多种原因,这是有问题的。 最后但并非最不重要的一点是,依赖于 View Engine 的库不能依赖于 Ivy 的库。
库作者可能不能太快迁移到 Ivy,但他们应该明确推动不情愿的用户升级。 无论如何,前进的道路是尽快将所有东西迁移到 Ivy
有一篇关于常春藤的优秀文章 在那边.
再见量角器
XNUMX 月,Angular 团队宣布计划终止对 量角器 在2022的末尾。
从 Angular 12 开始,Protractor 不会默认包含在新项目中。 相反,Angular CLI 将提供使用其他解决方案的选项,例如 塞浦路斯(Cypress), 网络驱动程序IO或 测试咖啡厅。 这意味着 ng e2e
未来应该继续支持命令。
如解释 这个通告,早在 2013 年量角器创建时, 网络驱动程序 不是 一个标准和端到端 (e2e) 测试很难编写,而且是维护的噩梦。 量角器通过包装带来了创新的解决方案 硒网络驱动程序,并提供了一种控制执行流程的方法。
当然,从那时起,很多事情都发生了变化。 我们现在有 WebDriver
API, async
和 await
(即使是顶级 await
,哇)。 此外,生态系统也在进化。 解决方案如 塞浦路斯(Cypress), 剧作家, 木偶戏 已经获得了很多(当之无愧的)人气。 例如,像 Cypress 这样的工具提供比 Protractor 更好的开发人员体验,利用现代标准,甚至支持跨浏览器测试(以及其他强大的功能)。 当前事实上的 e2e 测试工具的另一个好处是它们与框架无关,这是非常有价值的。
长话短说,维护量角器对 Angular 团队没有多大意义。 现在发展量角器需要太多的努力,并会引发大量的突破性变化。 您可以在 RFC 中找到更多详细信息,这是一个有趣的阅读。
时间线对于投入大量时间和精力使用 Protractor 编写 e2e 测试的团队/项目很重要。 Angular 团队仍在忙于评估通过 RFC 收集的反馈,因此我们可能会在今年晚些时候了解更多信息。
无论如何; 如果您还没有尝试过 Cypress,请尝试一下,您不会失望的! 顺便说一句,我一直建议大家开始使用 NX,一个很棒的解决方案,包括对 Angular、React、Next.js、Cypress 等的支持
空合并
Angular 12 支持使用 空联合运算符 在 Angular 模板中。 这太棒了! TypeScript 已支持该运算符 从3.7版本开始.
如果你还没有听说过这个运营商,那么让我给你一个简短的解释。 这个想法是能够定义一个回退值,以防万一 null
or undefined
。 这是一个例子:
If foo
is null
or undefined
, 然后 x
将设置为 true
(即回退值),我们可以将其设置为我们喜欢的任何值。
没有这个厉害 ??
运算符,我们将不得不这样写:
let x = foo !== null && foo !== undefined ? foo : true;
现在 Angular 也支持它,我们终于可以编写表达式,例如:
{{ age ?? calculateAge() }}
而不是旧的和更冗长的选择。 整洁的!
您可以了解有关此更改的更多信息 此处.
打字稿 4.2 支持
Angular 12 引入了对 打字稿4.2,这意味着我们现在可以使用 吨 新的精彩语言功能。 此外,已取消对 TypeScript 4.0 和 4.1 的支持。
以下是 TS 4.2 包含内容的简要概述:
智能类型别名保留:预期类型由代码编辑器显示,而不是像以前那样显示的原始类型。 你可以了解更多 此处.
元组类型中的前导/中间休息元素:我们现在可以在元组中的任何地方包含 rest 元素(有一些警告)。 这对于我们这些不时依赖元组的人来说非常酷。 了解更多 此处.
了解您的项目结构:TS 4.2 包括 新旗帜 被称为 --explainFiles
,它指示 TypeScript 输出有关为什么文件包含在您的程序中的信息。 这对于故障排除非常有用。
未调用功能检查的改进:TypeScript 现在可以检测更多未调用函数的情况。 例如在写作时 foo
而不是 foo()
. 可以找到更多详细信息和示例 此处.
现在可以将解构变量显式标记为未使用: let [_first, second] = getValues();
,这太棒了; 没有更多的错误时 noUnusedLocals
已启用!
实际上还有很多,比如更严格的检查 in
运算符,以及一些可能会影响您的重大更改。 所以一定要检查一下 发行说明.
Webpack 5 支持
Angular 11 给我们带来了 对 Webpack 5 的实验性支持. 在 Angular 12 中,Webpack 5 支持现已投入生产。 哇!
如果你没有看 网络包 5,你会惊讶的。 Webpack 5 于 2020 年 XNUMX 月发布,因此它现在非常稳定。 Webpack 目前在 5.37版 (几天前发布)。
这是关于 Webpack 5 发生了什么变化的简短说明,以及为什么我对此感到如此高兴 🤩
首先,如你所知,Webpack 是 键 Angular CLI 难题的一部分,它在包大小、构建性能等方面发挥着重要作用。
其次,Webpack 5 是一个主要版本是有原因的。 它包括许多重大更改,这解释了为什么 Angular 和生态系统中的无数实用程序/库需要一段时间才能升级。
在发行说明中,Webpack 团队表示 Webpack 5 侧重于:
- 提高构建性能 坚持 缓存
- 使用更好的算法和默认值改进长期缓存
- 通过更好的 Tree Shaking 和代码生成来改善包大小
- 提高与Web平台的兼容性
- 清理内部结构
- 现在引入重大更改(哈哈),让它们尽可能长时间地保留在 v5 上
Webpack 5 最酷的特性是它的 支持模块联合,这提供了必要的基础,以促进 微前端的创建. 这有点超出了本文的范围,但简而言之,模块联合使不同的构建可以表现得像一个巨大的连接模块图,并允许我们从远程构建中导入和使用模块。 退房 官方文件 了解更多。
在主要的变化中,Webpack 5 删除了以前不推荐使用的所有内容(例如, NoEmitOnErrorsPlugin
, ModuleConcatenationPlugin
, NamedModulesPlugin
), 以及 IgnorePlugin
和 BannerPlugin
.
此外,之前自动注入的 Node.js polyfill 已被删除; 这是该版本中最大的变化之一。 这些 polyfill 最初允许 Webpack 让我们在浏览器中使用为 Node.js 制作的模块。 这很酷,但它有一个主要的缺点:更大的捆绑包。 此外,这些 polyfill 的用处越来越小,因为要么有与浏览器兼容的库替代品,要么有浏览器支持的特定发行版。 从 Webpack 5 开始,由于这些 polyfill 不再自动添加,我们可能会偶然发现一些惊喜。 例如,如果我们在浏览器中使用为 Node.js 制作的模块,而没有意识到它以前是通过 Webpack 工作的。 你可以了解更多 此处.
Webpack 5 引入了对长期缓存的更好支持。 在生产模式下,它现在默认包含新算法:
chunkIds: "deterministic"
moduleIds: "deterministic"
mangleExports: "deterministic"
正如该值所示,这些算法为块和模块分配确定性 ID,为导出分配确定性名称。
Webpack 5 能够通过跟踪对导出的嵌套属性的访问(欢迎使用 Matrix)来执行嵌套树抖动,这将进一步改进树抖动。 另外,现在可以 分析模块的导出和导入之间的依赖关系. 也有改进 CommonJS 摇树. 还有一吨 更多优化.
Webpack 5 还包括许多改进开发人员体验的更改。 例如,有一个 新命名的块 ID 算法 在开发模式下默认启用。 这种新算法为块提供了人类可读的名称。 这 target
财产也被大大地 改善.
老实说,我没有足够的空间来介绍 Webpack 5 的所有新内容, 那里的 只是 方式 也有 许多. 所以我会停在这里
如果你只是通过 Angular CLI 间接使用 Webpack,那么大部分内容对你来说应该是“透明的”。 但是如果你使用的是 自定义 Webpack 构建 在你的项目中,那么你应该看看 迁移指南.
最后,如果您对 Webpack 的下一步感到好奇,请查看 2021年路线图 当然是 最新发行说明.
不推荐使用 IE11 支持
尽管听起来很悲伤(我在开玩笑谁?😂),Angular 12 正在弃用对 IE11 的支持。 Internet Explorer 对我们大多数人来说已经死了,但不幸的是,许多组织仍在生产中使用它。 因此,Angular 11 将取消对 IE 13 的支持,这意味着这些组织确实需要开始远离 IE(无论如何这是一件好事)。 别再找借口!
一旦 IE 支持消失,Angular 将变得更小、更快,从而对我们所有人都更好。 此外,一旦保持与旧浏览器向后兼容的负担将消失(IE11 是其中的最后一个!),那么 Angular 将能够利用现代 API(例如, CSS 变量, 路口观察员, CSS网格, 代理, 网络动画及 更多).
我真的等不及 IE 支持消失了!
默认严格
是是是是🤩。 从 Angular 12 开始, Angular 的严格模式 在 CLI 中默认启用。 这太棒了。
如您所知,我非常喜欢 TypeScript 的严格模式,但也非常喜欢 Angular 的严格模式。 如果您想了解更多,请查看 我去年写的文章 和 Minko Gechev 的 解释变化的文章.
默认情况下生产构建
到目前为止,运行 ng build
命令创建了一个开发版本。 从 Angular 12 开始, ng build
现在将默认为生产版本。
希望它可以帮助一些团队避免在生产环境中构建和部署开发版本的错误。 虽然,我担心犯这个错误的团队仍然有其他问题要处理
Sass 支持内联样式
Angular 很早就支持 Sass,但到目前为止,我们只能在外部样式表中使用 Sass。 使用 Angular 12,现在可以将 Sass 与内联组件样式一起使用(即,在 styles
属性)。
这需要通过设置新的 inlineStyleLanguage
财产 true
in angular.json
.
顺风支持
顺风 现在得到了 Angular 的正式支持。 实际上,在 v11.2 中的 Angular CLI 中引入了支持。
顺风是 忙着接管世界,特别是现在它有一个 rad JIT 编译器,并且在 Angular 中内置对它的支持真是太好了。
以前,需要将 Tailwind 添加到 Angular 项目 自定义 Webpack 构建. 没有了! 现在,添加 Tailwind 就像安装软件包一样简单,创建 tailwind.config.js
文件使用 npx tailwindcss init
,并确保启用 Tailwind 的 JIT 模式.
Http 改进
Angular 12 围绕其 HTTP 支持引入了许多改进。
请求和拦截器的元数据
首先, HttpClient
现在可用于存储和检索请求的自定义元数据。 这对 HTTP 拦截器特别有用。 此功能可以通过新的 HttpContext
.
以前,为拦截器提供上下文很复杂,但现在会简单得多。 现在,提供的不同 HTTP 方法 HttpClient
包括一个新的 context: HttpContext
选项,我们可以用来传递地图。
内塔内尔基础 写了一篇关于这个的文章,所以 如果您想了解更多,请查看.
HttpParams 上的 appendAll
HttpParams
班级现在有一个新的 appendAll
方法,可用于一次轻松添加一组参数:
appendAll(params: {[param: string]: string|string[]}): HttpParams
参数现在可以作为数字和布尔值传递
以前,数字和布尔值不能直接用作 HTTP 参数。 我们必须将它们转换为字符串。 没有了!
状态码
Angular 以 const 枚举的形式为 HTTP 状态代码引入了自己的人类可读名称列表。
以前,如果我们想要拥有人类可读的名称,我们必须引入我们自己的解决方案。 由于这个新功能,我们现在可以改为使用 HttpStatusCode
.
例如:
if (response.status === HttpStatusCode.Ok) { ...
}
对于那些在后端和前端都使用 TypeScript 的人来说,这不是很有用(因为我们可能都已经有了自己的抽象),但是如果您的项目只在前端使用 TypeScript/Angular,那么它是一个不错的改进。
Xhr工厂
XhrFactory
类已移至不同的包。 现在被曝光了 angular/common
而不是 angular/common/http
.
请注意,升级中已包含迁移,因此如果您运行,您甚至不会注意到 ng update
路由器更改
Angular 路由器在 Angular 12 中发生了一些变化。
首先, routerLinkActiveOptions
指令得到了加强。 现在,可以指定是否需要对 URL 的不同部分进行精确匹配,以便向链接添加 CSS 类。
以前,我们只能要求对整个 URL 进行完全匹配(或不完全匹配):
<a routerLink="/products/foo" routerLinkActive="highlight-product" [routerLinkActiveOptions]="{ exact: true }"
> foo
</a>
现在,我们可以为路径、查询参数、矩阵参数和片段提供细粒度的匹配规则。
<a routerLink="/products/foo" routerLinkActive="highlight-product" [routerLinkActiveOptions]="{ paths: 'exact', queryParams: 'subset', matrixParams: 'ignored', fragment: 'ignored' }"
> foo
</a>
支持的值为 exact
, ignored
和 subset
,可用于 queryParams
和 matrixParams
. 对于路径,您可以传入 exact
or subset
及 exact
or ignored
等加工。为 fragment
.
请注意 isActive
路由器的方法也接受这些新选项。
片段可以为空
直到现在, ActivatedRouteSnapshot.fragment
不可为空。 这在 Angular 12 中发生了变化。不过不要太担心; ng update
让你满意。
表格
更好地控制发出的事件
emitEvent
选项已添加到各种方法中 FormGroup
和 FormArray
. 由于这一变化,现在可以控制在更多情况下是否需要发出事件。
例如,以前当使用 removeControl
的方法 FormGroup
,然后总是发出一个事件。 通过此更改,我们现在将能够避免此类问题。
emitEvent
选项已添加到以下方法中 FormGroup
:
addControl
removeControl
setControl
以及以下方法 FormArray
:
push
insert
removeAt
setControl
clear
最小和最大验证器支持模板驱动的表单
min
和 max
Angular 的验证器现在可以与模板驱动的表单一起使用:
<input [(ngModel)]="foo.bar" [min]="min" [max]="42" />
请注意,这是一个重大更改,因为之前会忽略这些更改。
i18n
Angular 的 i18n 系统在此版本中发生了变化。
正如公告博客文章中所指出的,目前正在使用许多旧的消息 ID 格式。 这些是脆弱的,并且由于空格、格式模板和 ICU 表达式可能会出现问题。
Angular 12 引入了一种新的规范消息 id 格式(即,一种格式来统治它们)。 这种格式更具弹性和更直观。
这种格式将减少不必要的翻译无效和相关的重新翻译成本,例如由于空格更改而导致翻译不匹配的应用程序。
从 v11 开始,新项目会自动配置为使用新消息 ID,现在有工具可以使用现有翻译迁移现有项目。 如果你担心,那么你可以使用 localize-migrate
迁移消息 ID 的工具:
ng extract-i18n --format=legacy-migrate
npx localize-migrate --files=*.xlf --map-file=messages.json
您可以找到更多信息 此处.
性能改进
在此版本中,有许多性能改进。 最明显的是升级到 Webpack 5,但还有更多:
许多未使用的方法已从 DomAdapter
. 它很酷,因为它的方法不可摇树,并且包含在所有 Angular 应用程序中,如 相应的公关.
Angular 现在为安全的属性访问生成更少的代码; 例如对于模板表达式,如 a?.b
和新支持的空合并: a ?? b
.
即使存在重定向的源文件,Angular 编译器现在也支持增量编译。 以前,当 TypeScript 对源文件进行重复数据删除时,无法重用先前编译的工作。 你可以阅读更多关于那个 此处.
Angular 编译器现在缓存源文件的文件系统路径。 以前,它反复调用 fs.resolve()
,这很耗时。
getDirectives
功能得到了改进。 随着这一变化, ng
命名空间也已扩展为包括一个新的 getDirectiveMetadata
效用。
还有 多一点.
ng API 改进
ng
调试接口 Angular 12 改进了我们可以从浏览器开发工具中使用的功能。
有一个新函数叫做 getDirectiveMetadata
,可用于检索有关组件和指令的信息。 我认为我们不会经常需要它,但未来的开发工具改进很可能会依赖于此。 你可以了解更多 在这里.
一个新的分析器函数称为 esetProfiler
也已实施,并且也可用于生产模式。 可以在多种情况下调用该新函数。 例如,它可以用于跟踪模板创建持续时间、模板更新、生命周期钩子处理等。同样,这个 API 将被即将推出的开发工具利用,为我们提供关于我们的应用程序如何执行的更深入的信息运行。
在这一点上这仍然是实验性的,但我想我们稍后会听到更多关于这个的信息。 我很想知道 Sentry 之类的工具是否/何时会集成对收集此类信息的支持,以便为我们提供有用的性能仪表板。
在 Angular 12 发布几天后,Angular 团队已经 公布 适用于 Google Chrome 的全新 Angular Dev Tools 的可用性。 你可以下载那些 此处.
使用全新的浏览器扩展,您可以在开发过程中轻松检查 Angular 应用程序。 它支持:
- 可视化应用程序的结构(即检查组件树)
- 探索和编辑组件
- 性能分析
使用嵌入式分析器,我们可以记录更改检测事件,并在发生时预览这些事件。 对于每个变更检测周期,我们可以查看花费了多长时间,哪些组件花费的时间最长,该周期是否导致丢帧。
Angular 之前通过 Angular 拥有半官方的开发工具 奥古里 项目(这是新工具的基础!),但那些与 Ivy 不兼容。 所以这对 Angular 社区来说是个好消息!
还有更多...
有 多一吨 此版本中的细微更改。 这是一个快速概览。
APP_INITIALIZER 现在支持 Observables
到目前为止,不可能将 Observables 与 APP_INITIALIZER
. 从 Angular 12 开始,我们现在可以这样做,这将允许更清晰的代码!
如果你还不知道 Angular 的这个特性, APP_INITIALIZER
is 令牌 我们可以使用它来定义需要在应用程序初始化期间执行的函数。 如果该函数是异步的,则返回一个 Promise
或 Observable
(new :p),然后 Angular 在启动应用程序之前等待它完成。
这种变化非常受欢迎,因为这意味着我们可以使用 RxJS 编写更多代码,而不必“退回”到 Promise
API。
您可以阅读有关此内容的更多信息 此处.
对动画的运行时控制
以前,禁用动画的唯一方法是提供 NoopAnimationsModule
. 从 Angular 12 开始,现在可以根据运行时信息禁用动画,使用 BrowserAnimationModule.withConfig
方法,并将其传递给 disableAnimations
布尔属性。
位置服务上的新 historyGo 方法
LocationService
Angular 现在包括一个 historyGo
方法,可用于导航到会话历史记录中的特定页面,由其与当前页面的相对位置标识。 这个方法对应原生 window.history.go
方法。 查看 MDN 对于一些例子。
语言服务改进
为 IDE 提供有关 Angular 代码的所有有用见解的语言服务也在此版本中得到了改进。
在 Angular 12 中,语言服务默认启用(以前它需要我们选择加入)。
从 Angular 12 开始,它还会检测 严格的模板类型检查 未启用,并且 将建议您启用这些.
语言服务现在还包括性能跟踪功能,可用于跟踪性能。 这可以在 VSCode 中启用, 如这里解释 (虽然这是相当低的水平)。
如果您还不了解语言服务,请查看 官方文档,或由 忍者小队, 或这个 介绍视频.
直接从 HTML 模板禁用 lint 规则
Angular 模板编译器现在会跟踪 HTML 注释。
以前,无法从 HTML 模板中禁用 linter 规则,因为 Angular 模板编译器会忽略注释。 解决方法是从组件的控制器禁用整个模板的这些规则。 由于此更改,现在可以从模板更精确地执行此操作:
<!-- eslint-disable-next-line @angular-eslint/template/no-any -->
<span>{{ $any(foo).bar }}</span>
是的,更干净的代码!
DatePipe 现在支持 ICU 标准 Stand Alone 星期几
此前,它 不可能 使用 DatePipe 将日期格式化为独立的星期几。
由于这一变化,现在支持芬兰语日期格式,我相信这对 Angular 社区的一小部分人来说是个好消息 😉
在可注入装饰器的providIn 字段中支持forwardRef
现在可以使用 forwardRef
字幕可视电话用于 providedIn
的领域 @Injectable
装饰器。
ResourceHost 接口上的新 transformResource 挂钩
A transformResource
方法已添加到 ResourceHost
界面。 多亏了这一点,工具现在可以做一些事情,比如引入对内联样式的预处理器支持。 这就是启用对带有内联样式的 SASS 的新支持的原因。
可以创建自定义路由器插座实现
到目前为止,创建自定义路由器出口是可能的,但需要跳过一些障碍(即,注册自定义出口 ChildrenOutletContexts
).
Angular 12 提供了一个 对自定义路由器插座的清洁支持.
Bug修复
像往常一样,此版本中包含大量错误修复。
这是发行说明的副本:
- 动画: 确保一致的转换命名空间顺序(#19854)(01cc995)
- 动画: 更新支持的节点版本范围以仅包含 LTS 版本(#41822)(e918250)
- 动画: 当根视图被移除时清理 DOM 元素(#41059)(c49b280)
- 动画: 允许对 shadow DOM 中的元素进行动画(#40134)(爸爸42c8), 关闭 #25672
- 动画: 当根视图被移除时清理 DOM 元素(#41001)(a31da48)
- 巴泽尔: 更新支持的节点版本范围以仅包含 LTS 版本(#41822)(8503246)
- 巴泽尔: 更新构建工具以获取 rules_nodejs 中的最新更改(#40710)(696f7bc)
- 巴泽尔: 更新集成测试以使用 规则_nodejs@3.1.0 (#40710)(34of89a)
- 巴泽尔: 更新 JSON.parse 使用的类型转换(#40710)(2c90391)
- 卧推: 更新 JSON.parse 使用的类型转换(#40710)(e721a5d)
- 共同: 使用 HttpClient 请求正文为布尔值添加正确的 ContentType(#38924)(#41885)(922a602)
- 共同: 更新支持的节点版本范围以仅包含 LTS 版本(#41822)(f2b6fd8)
- 共同: 视口滚动条在 shadow DOM 中找不到元素(#41644)(c0f5ba3), 关闭 #41470
- 共同: 暂时重新导出并弃用
XhrFactory
(#41393)(7dfa446) - 共同: 删除根视图时清理位置更改侦听器(#40867)(38524c4), 关闭 #31546
- 共同: 允许数字或布尔值作为 http 参数(#40663)(91CDC11), 关闭 #23856
- 共同: 避免在 NgTemplateOutlet 中改变上下文对象(#40360)(d3705b3), 关闭 #24515
- 编译器: 在封装样式中保留@page 规则(#41915)(3e365ba), 关闭 #26269
- 编译器: 从中剥离范围选择器
@font-face
规则(#41815)(2a11cda), 关闭 #41751 - 编译器: 更新支持的节点版本范围以仅包含 LTS 版本(#41822)(8126)
- 编译器: 在部分编译中错误处理的非文字内联模板 (#41583)(ab257b3)
- 编译器: 不为备用命名空间内的 ng-template 生成更新指令(#41669)(2BCBBDA), 关闭 #41308
- 编译器: 避免使用后向跨度解析 EmptyExpr (#41581)(e1a2930)
- 编译器: 处理区分大小写的 CSS 自定义属性(#41380)(e112e32), 关闭 #41364
- 编译器: 在部分组件声明的 JIT 编译期间包括使用的组件(#41353)(ff9470b), 关闭 #41104 #41318
- 编译器: 支持多个
:host-context()
选择器(#40494)(07b7af3), 关闭 #19199 - 编译器: 更新 JSON.parse 使用的类型转换(#40710)(f728490)
- 编译器-cli: 使用 ” 作为间接模板的源映射 URL (#41973)(7a4d980), 关闭 #40854
- 编译器-cli: 将链接器公开为 Babel 插件(#41918)(8fdac8f)
- 编译器-cli: 更喜欢参考发射器中的非混叠导出(#41866)(75bb931), 关闭 #41443 #41277
- 编译器-cli: 允许链接器处理缩小的布尔值(#41747)(1fb6724), 关闭 #41655
- 编译器-cli: 匹配字符串索引部分声明(#41747)(f885750), 关闭 #41655
- 编译器-cli: 更新支持的节点版本范围以仅包含 LTS 版本(#41822)(5b463f4)
- 编译器-cli: 模板中的自动完成文字类型。 (#41456)(#41645)(8b2b5ef)
- 编译器-cli: 如果组件没有内联样式(#41602)(a5fe8b9)
- 编译器-cli: 确保编译器跟踪
ts.Program
s 正确 (#41291)(德阿克74) - 编译器-cli: 防止在增量重新编译中删除默认导入(#41557)(7f16515), 关闭 #41377
- 编译器-cli: 解决
rootDirs
到绝对(#41359)(3E0FDA9), 关闭 #36290 - 编译器-cli: 加
useInlining
键入检查配置的选项(#41043)(09aefd2), 关闭 #40963 - 编译器-cli:
readConfiguration
现有选项应覆盖 tsconfig 中的选项(#40694)(b7c4d07) - 编译器-cli: 延长
angularCompilerOptions
在来自节点的 tsconfig (#40694)(5eb1954), 关闭 #36715 - 编译器-cli: 更新 ngcc 集成测试以获取 rules_nodejs 的最新变化(#40710)(d7f5755)
- 编译器-cli: 更新 JSON.parse 使用的类型转换(#40710)(b75d7cb)
- 核心: 不要保留动态编译的组件和模块(#42003)(1449c5c), 关闭 #19997
- 核心: 围绕 ngOnDestroy 生命周期钩子调用分析器(#41969)(e9ddc57)
- 核心: AsyncPipe 现在与 RxJS 7 兼容(#41590)(9759支链)
- 核心: 使用表达式绑定处理多个 i18n 属性(#41882)(73c6c64), 关闭 #41869
- 核心: 更新支持的节点版本范围以仅包含 LTS 版本(#41822)(f9c1f08)
- 核心: 检测使用 TS 4.2 (#41305)(274dc15), 关闭 #41298
- 核心: Switch 开关
emitDistinctChangesOnlyDefaultValue
为真(#41121)(7096246) - 核心: 删除重复的 EMPTY_OBJ 常量(#41066)(BF158E7)
- 核心: 删除重复的 EMPTY_ARRAY 常量(#40991)(e12d9de)
- 核心: 允许更新 EmbeddedViewRef 上下文(#40360)(a3e1719), 关闭 #24515
- 核心: 使 DefaultIterableDiffer 保持重复的顺序(#23941)(a826926), 关闭 #23815
- 核心: NgZone 合并选项应该正确触发 onStable (#40540)(22f9e45)
- 元素: 更新支持的节点版本范围以仅包含 LTS 版本(#41822)(4f5d094)
- 元素: 更新 JSON.parse 使用的类型转换(#40710)(EFD4149)
- 形式: 更新支持的节点版本范围以仅包含 LTS 版本(#41822)(DC975BA)
- HTTP: 超时完成请求(#39807)(61a0b6d), 关闭 #26453
- HTTP: 在 XMLHttpRequest 中止事件(#40767)(3897265), 关闭 #22324
- 语言服务: 更新支持的节点版本范围以仅包含 LTS 版本(#41822)(9b6198c)
- 语言服务: 使用脚本版本进行增量编译(#41475)(78236bf)
- 语言服务: 仅在模板中提供 Angular 属性补全(#41278)(0226a11)
- 语言服务: 添加插件选项以强制严格模板(#41062)(e9e7c33)
- 语言服务: 使用 Ivy 和 View Engine 的单一入口点(#40967)(e986a97)
- 本地化: 放松错误以警告丢失目标(#41944)(35ceed2), 关闭 #21690
- 本地化: 更新支持的节点版本范围以仅包含 LTS 版本(#41822)(658ed1f)
- 本地化: 更新 JSON.parse 使用的类型转换(#40710)(4b469c9)
- 国家电网公司: 检测使用 TS 4.2 (#41305)(8d3da56), 关闭 #41298
- 平台浏览器: 如果使用 shadow DOM 封装,则防止样式节点的内存泄漏(#42005)(d555555), 关闭 #36655
- 平台浏览器: 更新支持的节点版本范围以仅包含 LTS 版本(#41822)(ea05差价合约)
- 平台浏览器: 配置
XhrFactory
使用BrowserXhr
(#41313)(e0028e5), 关闭 #41311 - 平台浏览器: 更新 JSON.parse 使用的类型转换(#40710)(7ecfd2d)
- 平台浏览器动态: 更新支持的节点版本范围以仅包含 LTS 版本(#41822)(bc45029)
- 平台服务器: 更新支持的节点版本范围以仅包含 LTS 版本(#41822)(4b9d4fa)
- 路由器: 更新支持的节点版本范围以仅包含 LTS 版本(#41822)(0067EDD)
- 路由器: 仅当重用策略指示它应该重新附加时才检索存储的路由(#30263)(4), 关闭 #23162
- 路由器: 递归合并空路径匹配(#41584)(1179dc8), 关闭 #41481
- 路由器: 片段可以为空(#37336)(b555160), 关闭 #23894 #34197
- 路由器: 更新 JSON.parse 使用的类型转换(#40710)(350达达)
- 服务人员: 更新支持的节点版本范围以仅包含 LTS 版本(#41822)(6b823d7)
- 服务人员: 更新 JSON.parse 使用的类型转换(#40710)(4f7ff96)
- 升级: 使用 ngMocks 时保留 $interval.flush (#30229)(87dc851)
- 升级: 更新支持的节点版本范围以仅包含 LTS 版本(#41822)(10c4523)
顺便说一下,你有没有注意到 AsyncPipe
一直 修补 通过 Ben Lesh 兼容 RxJS 6 和 7? 多么酷啊?
重大变化
像往常一样,此版本有许多重大更改。
As 官方发布说明 很清楚,我只是在这里复制/粘贴:
- 缩小的 UMD 包不再包含在分布式 NPM 包中。
- 动画:当移除根视图时,DOM 元素现在可以正确移除。 如果您使用 SSR 并使用应用程序的 HTML 进行渲染,则需要确保在销毁应用程序之前将 HTML 保存到变量中。 测试也有可能通过尝试查找在先前测试中未删除的元素而意外依赖旧行为。 如果是这种情况,则应更新失败的测试以确保它们具有正确的设置代码来初始化它们所依赖的元素
- 常见: 方法
PlatformLocation
类,即onPopState
和onHashChange
, 用于返回void
. 现在这些方法返回可以调用以删除事件处理程序的函数 - 常见的:方法
HttpParams
班级现在接受string | number | boolean
而不是string
为参数值。 如果您在应用程序中扩展了此类,则必须更新方法的签名以反映这些更改 - 编译器-cli:链接的库不再生成旧的 i18n 消息 ID。 任何为这些消息提供翻译的下游应用程序都需要使用
localize-migrate
命令行工具 - 核心: Angular 不再维护对 node v10 的支持,所以如果你仍然在你的开发环境中使用它,那么真的是时候升级了!
- 核心: 以前
ng.getDirectives
如果给定的 DOM 节点没有与之关联的 Angular 上下文(例如,如果在 Angular 应用程序之外为 DOM 元素调用了一个函数),则函数会抛出错误。 此行为与下的其他调试实用程序不一致ng
命名空间,它在不引发异常的情况下处理了这种情况。 现在调用ng.getDirectives
此类 DOM 节点的函数将导致从该函数核心返回一个空数组:切换默认值emitDistinctChangesOnlyDefaultValue
这会更改默认行为并可能导致某些依赖于不正确行为的应用程序失败
emitDistinctChangesOnly
标志也已被弃用,并将在未来的主要版本中删除
以前的实现会触发更改 QueryList.changes.subscribe
每当 QueryList
被重新计算。 这导致了人为的大量更改通知,因为重新计算可能 QueryList
结果在同一个列表中。 当 QueryList
重新计算是一个实现细节,它不应该决定更改事件应该多久触发一次。
不幸的是,彻底修复该行为导致太多现有应用程序失败。 出于这个原因,Angular 认为这个修复是一个破坏性的修复,并在 @ContentChildren
和 @ViewChildren
,控制行为。
export class QueryCompWithStrictChangeEmitParent { @ContentChildren('foo', { // This option is the new default with this change. emitDistinctChangesOnly: true, }) foos!: QueryList<any>;
}
v12 之前的向后兼容性emitDistinctChangesOnlyDefaultValue
被设置为 false
. 这个变化
将默认值更改为 true
.
- 核心: 的类型
APP_INITIALIZER
令牌已更改为更准确地反映由 Angular 处理的返回值的类型。 以前,每个初始值设定项回调都被键入以返回any
,这是现在Promise<unknown> | Observable<unknown> | void
. 万一您的应用程序使用Injector.get
orTestBed.inject
API注入APP_INITIALIZER
令牌,您可能需要更新代码以考虑更严格的类型。
此外,TypeScript 可能会报告 TS2742 错误,如果 APP_INITIALIZER
token 用于表达式,其推断类型必须发送到 .d.ts 文件中。 为了解决这个问题,需要一个显式的类型注释,通常是 Provider
or Provider[]
.
-
核心: 最低支持
zone.js
版本是0.11.4
. 因此,这意味着如果您使用的是旧版本,则也该升级项目中的 zone.js 了! -
形式:
emitEvent
选项已添加到以下FormArray
和FormGroup
方法: -
表单组.addControl
-
FormGroup.removeControl
-
表单组.setControl
-
FormArray.push
-
FormArray.插入
-
FormArray.removeAt
-
FormArray.setControl
-
表格数组.clear
如果您的应用程序具有扩展的自定义类 FormArray
or FormGroup
类并覆盖
上述方法,您可能需要更新您的实现以将新选项纳入
帐户并确保覆盖从类型的角度来看是兼容的。
- 形式: 先前
min
和max
上定义的属性<input type="number">
被表单模块忽略。 现在这些属性的存在将
触发最小/最大验证逻辑(以防万一formControl
,formControlName
orngModel
指令也存在于给定的输入中)和
相应的表单控件状态将反映这一点。 - 平台浏览器:
XhrFactory
已从@angular/common/http
至@angular/common
.
之前
import { XhrFactory } from '@angular/common/http';
后
import { XhrFactory } from '@angular/common';
- 路由器: 严格的空检查将报告可能为空的片段。
迁移路径:添加空检查。 - 路由器: 的类型
RouterLinkActive.routerLinkActiveOptions
输入是
扩展以允许更精细的控制。 之前读过的代码
此属性可能需要更新以适应新类型。
更新路线图
根据目前的Angular 路线图,团队现在正忙于以下改进:
- 在调试和分析时改善开发人员体验。 这应该有助于我们理解组件结构(我想像 React Dev Tools 允许 React 一样)和变化检测
- 通过自动拆卸来改善测试时间和调试:这应该可以改善测试和测试时间之间的隔离。 这 试验台 也将改为每次测试执行后自动清理和拆除测试环境
- 使用 ES2017+ 作为默认输出:他们将识别障碍并移除它们,以便可以升级默认输出语言
- 将 MDC Web 集成到 Angular Material 中
- 提高 Angular Material 组件的可访问性
- 发布有关高级概念的指南,例如变更检测、性能分析、与 Zone.js 的交互等
- 更新 e2e 测试策略(参见上文)
- 准备升级到 RxJS v7+。 你可能知道,RxJS 7 已经 最近发布. 希望我们很快就能升级
未来,Angular 团队计划:
- 研究微前端架构:他们可能会为我们引入使用 Angular 轻松创建微前端的方法
- 通过对 Angular 表单进行严格键入来改善开发人员体验(我们非常需要这个)
- 使 Zone.js 成为可选项,这将简化框架、改进调试、减少包大小,甚至允许利用原生的 async/await 语法
- 通过集成 Angular 编译器(
ngc
) 作为 TypeScript 编译器插件 - 允许向宿主元素添加指令。 这也是社区长期以来的要求!
- 使 NgModules 成为可选项以简化学习曲线
- 为我们提供更简单的方法在组件级实现代码拆分
角材料和角 CDK
Sass 迁移
在内部,Angular Material 和 CDK 都迁移到了 新的 Sass 模块系统.
如果您的应用程序使用其中任何一个,那么您需要确保已替换 node-sass
by sass
:https://www.npmjs.com/package/sass。 这 node-sass
包不再维护!
通过这次迁移,Sass 主题 API 得到了增强,现在它允许我们利用 Sass 的 @use
效用。
现在有一个单一的入口点 @angular/material
和 @angular/cdk
.
最后,为了清晰起见,API 也进行了更改。 在此过程中,许多函数、mixin 和变量已被重命名。
您可以在新的主题指南中找到有关这些更改的更多信息:https://github.com/angular/components/blob/master/guides/theming.md。 此外,请注意 https://material.angular.io 上的指南已被重写以展示新的 API,并包括解释。
升级过程会自动将代码迁移到新的 Sass API。 你可以找到之前/之后的例子 此处.
角度 CDK 更改
版本 12 包括许多 变化 到 Angular CDK。
在这里,我只会列出新功能,但如果您想了解有关错误修复和性能改进的详细信息,可以查看发行说明:
- 拖放:丢弃的事件现在包括一个
dropPoint
属性,确定鼠标指向的确切点,当物品被放下时。 更多信息 此处 - 拖放: 预览容器 现在可以定制
- 表:新指令允许 启用回收视图转发器,它缓存已处理的行并在数据集更改时重用它们。 这有助于提高性能(减少延迟)
- 表: 加强 粘性元素的偏移量
StickyUpdate
接口 - 步进:当用户试图离开一个步骤时,一个
interacted
事件现在将是 发射 - 步进:方向现在可以是 变
- 无障碍:一个
FocusOptions
对象 现在可以通过 进入各种焦点陷阱方法 - 测试:新的 WebDriver 线束环境。 我还没有深入研究这个,所以我不能告诉你更多。 退房 公关
角度材质变化
还有一些 角材料的变化. 同样,请查看发行说明以获取错误修复的完整列表。
新功能:
- 日期选择器: 不再依赖 在对话中
- 步进:现在可以动态更改方向(参见 CDK 中的类似更改)
- 步进: 允许内容 懒惰地渲染
- 菜单: 允许更新菜单位置 以编程方式
- 垫子错误: 现在使用
aria-live="polite"
而不是role="alert"
. 更多细节 此处 - 标签: 添加方法 以编程方式将焦点设置在特定选项卡上
- 清单:现在返回一个带有更改选项的数组
selectAll
和deselectAll
方法。 查看 公关 了解详细信息 - 滑动切换: 允许 全局配置默认颜色 通过提供者
- 工具提示: 现在通过组件上的一个类公开工具提示的有效位置
- 广播电台, 复选框 和 滑块: 将这些组件的背景颜色包含在 打印样式表
实验版也有一些变化:https://github.com/angular/components/blob/master/CHANGELOG.md#material-experimental。
角度通用
Angular Universal 12 也是 刚出炉.
有了这个版本,环球现在 默认内联关键 CSS,这很酷。
环球现在包括一个新的 proxyConfig
提供自定义代理配置的选项 ssr-dev-server
建造者。
在这个版本中,有一个新的(实验性的)SSR 引擎叫做 三叶草 (让我想起 Java 生态系统中的一个优质工具)。 这个新引擎看起来很有前途。 它旨在简化事情,让我们摆脱 Window is undefined
错误,消除对 SSR/预渲染的多次构建的需要,无需额外构建即可生成应用程序 shell,等等。 稍后我们可能会听到更多关于它的信息。 如果你好奇,那就去看看 公关.
该版本包括一个 建设者 可用于使用新的 Universal Clover 方法生成静态页面(即预渲染)。
最后,这个版本还包括 TLS 支持 对于开发服务器。
谷歌地图
如您所知,Angular 包含用于 Google Maps 和 Youtube 的组件。 版本 12 为 Google Maps 组件带来了一些改进:
- 现在包括一个
icon
输入以轻松自定义标记 - 现在发出一个
clusterClick
集群时的事件 已被点击 - 包括 一个包装器 围绕 Google Maps Geocoder API,并导出
MapDirectionsResponse
,之前没有曝光的 - 引入支持 渲染热图
- 加强
MapDirectionsRenderer
,允许在地图上渲染方向,以及MapDirectionsService
, 包装google.maps.DirectionsService
计算 两点之间的路线. - 全新
options
输入 标记聚类器,类似于其他指令。
升级
像往常一样,有一个完整的升级指南可用,并且 ng update
会帮助你:https://update.angular.io/?l=3&v=11.0-12.0
如果你正在使用 NX (你真的应该),请注意 Nx 12.3 已经包含对 Angular 12 的支持! 了解更多 此处. 作为一个额外的好处,Nx 还将帮助您从 TSLint 迁移到 ESLint(现在是时候了!)
结论
在本文中,我探索了 Angular 12 的新特性。
像往常一样,这是发布是 英勇 (还能是什么?!😎)。
常春藤正在向前迈进,希望我们“很快”不会因为 ngcc
,随着生态系统的迁移。 此版本有许多很棒的更改,因此请立即查看并升级!
今天就到这里!
PS:如果您想了解有关产品/软件/Web 开发的大量其他很酷的东西,请查看 开发概念 系列,(https://mailchi.mp/fb661753d54a/developassion-newsletter)[订阅我的时事通讯],以及 来推特打个招呼!
- SEO 支持的内容和 PR 分发。 今天得到放大。
- 柏拉图区块链。 Web3 元宇宙智能。 知识放大。 访问这里。
- Sumber: https://www.codementor.io/dsebastien/angular-12-in-depth-1j62geeq5n
- 1
- 11
- 2018
- 2020
- 2022
- 7
- 9
- a
- Able
- 关于
- 关于它
- 以上
- 绝对
- 接受
- 接受
- ACCESS
- 访问
- 账号管理
- 准确
- 通
- 添加
- 增加
- 高级
- 优点
- 后
- 目标
- 警惕
- 算法
- 算法
- 所有类型
- 允许
- 允许
- 单
- 已经
- 替代
- 替代品
- 尽管
- 时刻
- 其中
- 和
- 角度方向
- 动画
- 公布
- 公告
- 另一个
- 分析数据
- API
- APIs
- 应用
- 出现
- 应用领域
- 应用领域
- 的途径
- 四月
- 架构
- 围绕
- 排列
- 刊文
- 刊文
- 相关
- 属性
- 作者
- 自动表
- 自动
- 可用性
- 可使用
- 巴贝尔
- 背部
- 后端
- 背景
- 酒吧
- 基于
- 基础
- 因为
- before
- 作为
- 得益
- 更好
- 之间
- 大
- 最大
- 位
- 博客
- 品牌
- 新品牌
- 破坏
- 带来
- 带
- 浏览器
- 浏览器
- 问题
- 建立
- 建设者
- 建筑物
- 建立
- 内建的
- 种子套餐
- 负担
- 被称为
- 调用
- 能力
- 案件
- 例
- 原因
- 造成
- 更改
- 更改
- 查
- 支票
- 铬
- 明晰
- 程
- 类
- 清除
- 明确地
- 关闭
- 簇
- 码
- 收藏
- 颜色
- 未来
- 注释
- 社体的一部分
- 兼容性
- 兼容
- 完成
- 复杂
- 元件
- 组件
- 概念
- 关心
- 结论
- 已联繫
- 考虑
- 一贯
- 常数
- 消耗
- 容器
- 内容
- 上下文
- 继续
- 控制
- 调节器
- 控制
- Cool
- 核心
- 对应
- 价格
- 可以
- 课程
- 外壳
- 覆盖
- 创建信息图
- 创建
- 创造
- 创建
- 危急
- 跨浏览器
- 关键
- 的CSS
- 好奇
- 电流
- 目前
- 习俗
- 自定义属性
- 定制
- 日期
- 天
- 一年中的
- 死
- 处理
- 更深
- 默认
- 依靠
- 部署
- 深度
- 细节
- 详情
- 检测
- 确定
- 确定
- 开发
- 开发商
- 研发支持
- DID
- 不同
- DIG
- 指令
- 直接
- 分布
- 分布
- 做
- DOM
- 向下
- 下载
- 缺点
- 下降
- 滴
- 重复
- ,我们将参加
- 每
- 更容易
- 容易
- 生态系统
- 有效
- 努力
- 或
- 分子
- 嵌入式
- enable
- 使
- 封装
- 端至端
- 能源
- 发动机
- 增强
- 更多
- 确保
- 条目
- 环境
- 环境中
- 错误
- 故障
- 特别
- 等
- 醚(ETH)
- 评估
- 甚至
- 活动
- 事件
- 每个人
- 一切
- 进化
- 演变
- 例子
- 例子
- 优秀
- 例外
- 执行
- 执行
- 现有
- 扩大
- 预期
- 体验
- 说明
- 解释
- 说明
- 介绍
- 解释
- 探讨
- 探险家
- 出口
- 裸露
- 表达式
- 延长
- 延期
- 外部
- 额外
- 促进
- 失败
- 相当
- 秋季
- 风扇
- 高效率
- 快
- 恐惧
- 专栏
- 特征
- 联邦
- 反馈
- 少数
- 部分
- 字段
- 文件
- 档
- 终于
- 找到最适合您的地方
- 寻找
- 大火
- 固定
- 流
- 专注焦点
- 重点
- 以下
- 力
- 申请
- 格式
- 形式
- 向前
- 发现
- Foundations
- 分数
- FRAME
- 骨架
- 止
- 前端
- ,
- 功能
- 功能
- 进一步
- 未来
- 生成
- 产生
- 发电
- 得到
- GitHub上
- 给
- 特定
- 给
- 给予
- Go
- 去
- 非常好
- 谷歌
- Google Chrome
- Google地图
- 图形
- 大
- 指南
- 指南
- 处理
- 硬
- 有
- 听说
- 帮助
- 此处
- hi
- 高
- 近期亮点
- 历史
- 钩
- 希望
- 主持人
- 创新中心
- HTML
- HTTPS
- 巨大
- 人类可读
- 生病
- 主意
- 确定
- 鉴定
- 影响力故事
- 实施
- 履行
- 实施
- 进口
- 重要
- 进口
- 改善
- 改善
- 改进
- 改善
- in
- 包括
- 包括
- 包括
- 不正确
- 表示
- 间接
- info
- 信息
- 原来
- 创新
- 输入
- 可行的洞见
- 安装
- 安装
- 例
- 代替
- 说明
- 整合
- 整合
- 积分
- 互动
- 有趣
- 接口
- 内部
- 网络
- 介绍
- 介绍
- 推出
- 介绍
- 直观的
- 投资
- 隔离
- 问题
- IT
- 爪哇岛
- JIT
- 工作
- 加入
- JSON
- 保持
- 类
- 知道
- 语言
- 大
- 名:
- 潜伏
- 最新
- 联盟
- 泄漏
- 学习用品
- 学习
- 遗产
- Level
- 杠杆作用
- 库
- 自学资料库
- Line
- 友情链接
- 链接
- 清单
- 圖書分館的位置
- 长
- 长时间
- 长期
- 不再
- 看
- 看着
- 寻找
- 占地
- 低
- 制成
- 保持
- 维护
- 主要
- 多数
- 使
- 制作
- 制作
- 许多
- 地图
- 地图
- 匹配
- 匹配
- 材料
- 矩阵
- 最大
- 手段
- 内存
- 菜单
- 合并
- 的话
- 条未读消息
- 元数据
- 方法
- 方法
- 微软
- 可能
- 迁移
- 移民
- 最低限度
- 未成年人
- 失踪
- 错误
- 时尚
- 现代
- 模块
- 模块
- 更多
- 最先进的
- 移动
- 移动
- Mozilla的
- 多
- 命名
- 亦即
- 名称
- 本地人
- 导航
- 必要
- 需求
- 需要
- 负
- 净
- 全新
- 新功能
- 消息
- 订阅电子邮件
- 下页
- Next.js
- 节点
- Node.js的
- 节点
- 值得一提的
- 通知
- 数
- 数字
- 对象
- 明显
- 发生
- 十月
- 官方
- 正式
- 老
- 一
- 操作者
- 附加选项
- 附加选项
- 秩序
- 组织
- 本来
- 其他名称
- 奥特莱斯
- 学校以外
- 简介
- 己
- 包
- 包
- 参数
- 参数
- 尤其
- 部分
- 通过
- 通过
- 径
- 演出
- 性能
- 表演
- 执行
- 透视
- 片
- 管道
- 地方
- 计划
- 柏拉图
- 柏拉图数据智能
- 柏拉图数据
- 插入
- 点
- 声望
- 位置
- 可能
- 帖子
- 可能
- 强大
- 恰恰
- 比较喜欢
- 存在
- 当下
- 漂亮
- 防止
- 预览
- 以前
- 先前
- 先
- 大概
- 问题
- 过程
- 处理
- 生产
- 剖析
- 曲目
- 项目
- 项目
- 有希望
- 正确
- 财产
- 提供
- 提供
- 提供
- 代理
- 出版
- 推
- 困扰
- 质量
- 快速
- 提高
- 范围
- 原
- RE
- 应对
- 阅读
- 实现
- 原因
- 原因
- 建议
- 记录
- 减少
- 反映
- 注册
- 有关
- 释放
- 发布
- 远程
- 去掉
- 去除
- 翻译
- 反复
- 更换
- 报告
- 请求
- 要求
- 要求
- 必须
- 弹性
- 响应
- REST的
- 导致
- 成果
- 回报
- 返回
- 回报
- 摆脱
- 路障
- 角色
- 根
- 路线
- 路由器
- 第
- 定位、竞价/采购和分析/优化数字媒体采购,但算法只不过是解决问题的操作和规则。
- 运行
- 运行
- 安全
- 同
- 萨斯
- 保存
- 情景
- 范围
- 其次
- 似乎
- 感
- 系列
- 服务
- 会议
- 集
- 设置
- 格局
- 阴影
- 短
- 应该
- 展示
- 签名
- 类似
- 简易
- 简化
- 自
- 单
- 情况
- 尺寸
- 尺寸
- 慢慢地
- 小
- 小
- So
- 至今
- 方案,
- 解决方案
- 一些
- 东西
- 听起来
- 来源
- 太空
- 具体的
- 稳定
- 站
- 标准
- 标准
- 开始
- 开始
- Status
- 留
- 步
- 仍
- Stop 停止
- 商店
- 存储
- 故事
- 策略
- 严格
- 严格
- 结构体
- 样式
- 订阅
- 这样
- 超级
- SUPPORT
- 支持
- 支持
- 惊喜
- Switch 开关
- 系统
- 顺风
- 顺风
- 采取
- 需要
- 服用
- 目标
- 团队
- 队
- 模板
- 模板
- test
- 测试
- 测试
- 其
- 事
- 事
- 今年
- 通过
- 次
- 耗时的
- 时间表
- 时
- 至
- 一起
- 象征
- 吨
- 音
- 也有
- 工具
- 工具
- 顶级
- 向
- 追踪
- 追踪
- 跟踪时
- 跟踪
- 改造
- 过渡
- 翻译
- 透明
- 触发
- true
- 类型
- 打字稿
- 一般
- 下
- 理解
- 普遍
- 未使用
- 即将上市
- 更新
- 更新
- 最新动态
- 更新
- 升级
- 网址
- us
- 用法
- 使用
- 用户
- 用户
- 公用事业
- 效用
- 验证
- 验证者
- 有价值
- 折扣值
- 价值观
- 各个
- Ve
- 版本
- 查看
- W3
- 等待
- 通缉
- 警告
- 卷筒纸
- 的WebPack
- 周
- 周
- 欢迎进入
- 什么是
- 是否
- 这
- 而
- WHO
- 将
- 中
- 也完全不需要
- 韩元
- 精彩
- 工作
- 工作
- 加工
- 将
- 写
- 写作
- 书面
- X
- 年
- 您一站式解决方案
- YouTube的
- 和风网