【发布时间】:2017-05-17 22:36:00
【问题描述】:
我指的是this documentation 并遇到了编译概念。可以使用 JIT 或 AOT 编译。但是,我发现它非常简短,需要详细了解以下几点,
- 这两种技术的区别
- 关于何时使用什么的建议
【问题讨论】:
标签: angular compilation
我指的是this documentation 并遇到了编译概念。可以使用 JIT 或 AOT 编译。但是,我发现它非常简短,需要详细了解以下几点,
【问题讨论】:
标签: angular compilation
JIT - 及时编译 TypeScript 以执行它。
AOT - 在构建阶段编译 TypeScript。
【讨论】:
ng build 来将 TS 转换为 JS
Benyamin 和 Nisar 在这里提到了一些优点。我会补充的。
虽然从理论上讲,对于生产目的而言,AOT 看起来比 JIT 更有吸引力,但我怀疑 AOT 是否真的值得!
嗯,我找到了nice stats by Jeff Cross,它确实证明了 AOT 显着减少了应用程序的引导时间。以下来自 Jeff Cross 帖子的快照将让您快速了解它,
【讨论】:
实际上只有一个 Angular 编译器。 AOT 和 JIT 之间的区别在于时间和工具。使用 AOT,编译器在构建时使用一组库运行一次;使用 JIT,它每次都在运行时使用一组不同的库为每个用户运行。
【讨论】:
虽然有一些答案,但我也想补充一些我的发现,因为 我真的对实际编译的内容感到困惑情况下,TS --> JS 发生转换。我从Jeff's blog 中提取了一些段落作为参考。
开发者编写的TS代码编译为JS代码。现在,这个编译的js 代码由浏览器再次编译,以便html 可以根据用户操作动态呈现,因此angular 的代码(用于组件、更改检测、依赖注入)也在运行时生成.
(浏览器编译器接收应用程序的指令和组件,以及它们相应的 HTML 和 CSS,并创建组件工厂,以使用其所有视图创建逻辑快速剔除实例。)
在浏览器中引导 Angular 2 应用程序时,JIT 编译器会执行大量工作以在运行时分析应用程序中的组件并在内存中生成代码。当页面刷新时,所有已经完成的工作都被扔掉,JIT 编译器重新做一遍。
开发者写的TS代码编译成JS代码,这个js
也已经为 Angular 编译过。现在,这个编译 js 代码再次被浏览器编译,这样html 就可以被渲染了。但是,这里的问题是 angular 的功能已经被 AOT 编译器处理,因此浏览器不必担心组件创建、更改检测、依赖关系注射。所以,我们有:
更快的渲染
使用 AOT,浏览器会下载应用程序的预编译版本。浏览器加载可执行代码,因此它可以立即呈现应用程序,而无需等待先编译应用程序。
更少的异步请求
编译器在应用程序 JavaScript 中内联外部 HTML 模板和 CSS 样式表,消除了对这些源文件的单独 ajax 请求。
较小的 Angular 框架下载大小
如果应用程序已经编译,则无需下载 Angular 编译器。编译器大约是 Angular 本身的一半,因此省略它会大大减少应用程序的负载。
尽早检测模板错误
AOT 编译器在构建步骤中检测并报告模板绑定错误,然后用户才能看到它们。
更好的安全性
AOT 早在将 HTML 模板和组件提供给客户端之前就将其编译为 JavaScript 文件。由于没有要读取的模板,也没有危险的客户端 HTML 或 JavaScript 评估,因此注入攻击的机会更少。
Benyamin、Nisar 和 Gaurang 的要点已经涵盖了其余差异。
欢迎指正
【讨论】:
【讨论】:
我们在开发 Angular 项目期间使用的 JIT 编译器。在此编译(TS 到 JS 的转换)中发生在应用程序的运行时。 在构建应用程序代码以在生产中部署应用程序期间使用 AOT 时,我们使用 ng build --prod 命令构建应用程序代码,该命令生成一个名为 webpack 的文件夹,webpack 包含所有文件的捆绑包(HTML , CSS 和 typescript) 压缩的 javascript 格式。
生产环境生成的webpack文件夹的大小远小于开发环境生成的文件夹(使用命令...ng build),因为webpack文件夹内不包含编译器,提高了性能应用程序。
【讨论】: