찾다
웹 프론트엔드JS 튜토리얼Angular의 Ivy 컴파일이란 무엇입니까? Ivy 컴파일을 활성화하는 방법은 무엇입니까?

이 글에서는 Angular의 새로운 컴파일 엔진 Ivy에 대해 알아보고, Ivy 컴파일이 무엇인지, 그리고 Ivy 컴파일을 활성화하는 방법을 소개합니다.

Angular의 Ivy 컴파일이란 무엇입니까? Ivy 컴파일을 활성화하는 방법은 무엇입니까?

Angular

Angular는 현재 세계에서 가장 인기 있는 프레임워크 중 하나이지만, 프레임워크에서 배울 수 있는 라이브러리와 컴파일 지식이 많기 때문에 중국에서의 사용률은 높지 않습니다. 동시에 Angular에서 생성된 긴 로딩 시간과 대규모 프로젝트 파일로 인해 ReactVue의 더 나은 패키징 크기와 더 나은 개발 경험에도 패배했습니다. >. React以及Vue更优秀的打包体积以及更好的开发体验所打败。

但如果掌握了Angular的原理之后,我们也能开发出与React应用性能所差无几的Web App。而由于之前Angular 8.0版本之前使用的是View Engine编译器来对Angular项目文件进行编译,造成了打包体积较大以及不容易追踪bug。于是Angular团队推出了Ivy编译器。【相关教程推荐:《angular教程》】

什么是Ivy编译

Ivy是下一代模板编译引擎以及渲染的管道工具,他非常先进,并提供了以前没有的高级功能以及更快的编译速度。实际是IvyAngular之前渲染引擎的完全重写,具体来说是第四次重写,使用Ivy可以独立得编译组件,同时对于热更新也支持的更好,在重写编译应用程序时会只涉及编译发生更改的组件。

下面是一个angular使用Ivy编译前后的体积变化对比:

Angular의 Ivy 컴파일이란 무엇입니까? Ivy 컴파일을 활성화하는 방법은 무엇입니까?

可以看出经过Ivy的优化,打包体积减少了不少。

treeshakable

同时Ivy另一个重要的点是对于项目文件的treeshaking,意思是在编译打包过程中删除未使用的代码,这也可以通过一些工具如Rollup以及Uglify来完成。在构建的过程中,treeshaking工具使用静态分析消除未使用以及未引用的代码。由于代码的静态分析依赖与引用,当有条件的逻辑判断代码存在的时候,工具不能正确识别,会出现失败的情况。

局部性

局部性指的是在使用本地代码独立的编译每个组件的过程,通过对于修改部分的重编译而不是整个项目文件的重新编译来更快地构建,这会显著的提升构建速度。在之前的Angular代码中,每个组件都存在它的父信息,这就导致了编译依赖,从而编译的文件变多。而在Ivy中,每个组件只会生成关于该组件自身的信息,除去了可申明依赖项的名词和包的名称。

Ivy编译样例

在Angular中尝试编写如下代码:

    <div>
        <p>ivy works</p>
        <app-child></app-child>
    </div>

这里的app-child代表一个引用的子组件。通过Ivy编译得到的Ivy.component.js如图

Angular의 Ivy 컴파일이란 무엇입니까? Ivy 컴파일을 활성화하는 방법은 무엇입니까?

而我们再通过在未开启Ivy的条件下进行再一次编译,这一次得到如下的目录结构:

Angular의 Ivy 컴파일이란 무엇입니까? Ivy 컴파일을 활성화하는 방법은 무엇입니까?

这里挑两个主要的文件ivy.component.jsivy.component.ngfactory.js来展示View Engine编译后的文件

Angular의 Ivy 컴파일이란 무엇입니까? Ivy 컴파일을 활성화하는 방법은 무엇입니까?

Angular의 Ivy 컴파일이란 무엇입니까? Ivy 컴파일을 활성화하는 방법은 무엇입니까?

可以看到,编译后的文件种类以及代码量相较于Ivy编译都变多了不少。

AOT编译和JIT编译

Angular 应用主要由组件及其 HTML 模板组成。组件是由Typescript语言编写以及使用装饰器定义而成,由于浏览器无法直接理解 Angular 所提供的组件和模板,因此 Angular 应用程序需要先进行编译才能在浏览器中运行。

这里有一张angular

하지만 Angular의 원리를 익히면 React 애플리케이션과 거의 동일한 성능을 갖춘 웹 앱을 개발할 수도 있습니다. 이전 Angular 8.0 버전에서는 View Engine 컴파일러를 사용하여 Angular 프로젝트 파일을 컴파일했기 때문에 패키징 용량이 크고 버그 추적이 어려웠습니다. 그래서 Angular 팀은 Ivy 컴파일러를 출시했습니다. [관련 튜토리얼 권장 사항: "

angular 튜토리얼Angular의 Ivy 컴파일이란 무엇입니까? Ivy 컴파일을 활성화하는 방법은 무엇입니까?"]

🎜🎜Ivy 컴파일이란🎜🎜🎜Ivy는 차세대 템플릿 컴파일 엔진이자 렌더링 파이프라인 도구로, 매우 발전된 이전 버전의 비교할 수 없는 도구를 제공합니다. 고급 기능과 더 빠른 컴파일 속도. 실제로 IvyAngular의 이전 렌더링 엔진을 완전히 재작성한 것이며, 특히 Ivy를 사용하여 컴파일할 수 있습니다. 또한 구성 요소는 핫 업데이트를 더 잘 지원합니다. 애플리케이션을 다시 작성하고 컴파일할 때 변경된 구성 요소만 컴파일됩니다. 🎜🎜다음은 Ivy를 사용하여 컴파일하기 전과 후의 angular의 볼륨 변화를 비교한 것입니다. 🎜🎜Angular의 Ivy 컴파일이란 무엇입니까? Ivy 컴파일을 활성화하는 방법은 무엇입니까?🎜🎜Ivy 최적화 이후에 볼 수 있는 내용 , 포장량이 많이 줄었습니다. 🎜🎜🎜treeshakable🎜🎜🎜동시에 Ivy의 또 다른 중요한 포인트는 treeshaking)입니다. 프로젝트 파일>은 컴파일 및 패키징 프로세스 중에 사용되지 않는 코드를 삭제한다는 의미입니다. 이 작업은 RollupUglify와 같은 일부 도구를 통해서도 수행할 수 있습니다. 빌드 프로세스 중에 트리쉐이킹 도구는 정적 분석을 사용하여 사용되지 않고 참조되지 않는 코드를 제거합니다. 코드의 정적 분석 종속성과 참조로 인해 조건부 논리 판단 코드가 존재하는 경우 도구가 이를 올바르게 식별할 수 없어 실패가 발생합니다. 🎜🎜🎜Locality🎜🎜🎜로컬리티는 전체 프로젝트 파일을 다시 컴파일하는 것이 아니라 수정된 부분을 다시 컴파일하여 로컬 코드를 사용하여 각 구성 요소를 독립적으로 컴파일하는 프로세스를 말합니다. 더 빠르게 빌드하려면 빌드 속도가 크게 향상됩니다. 이전 Angular 코드에서 각 구성 요소에는 상위 정보가 있으므로 컴파일 종속성이 발생하여 더 많은 컴파일된 파일이 발생합니다. Ivy에서 각 구성 요소는 종속성을 선언할 수 있는 명사 및 패키지 이름을 제외하고 구성 요소 자체에 대한 정보만 생성합니다. 🎜🎜🎜Ivy 컴파일 샘플🎜🎜🎜다음 코드를 Angular로 작성해 보세요. 🎜
{
   "compilerOptions": { ... },
  "angularCompilerOptions": {
    "enableIvy": true
  }
}
🎜여기의 app-child는 다음을 나타냅니다. 참조된 하위 구성요소 Ivy가 컴파일한 Ivy.comComponent.js는 그림과 같습니다🎜🎜Angular의 Ivy 컴파일이란 무엇입니까? Ivy 컴파일을 활성화하는 방법은 무엇입니까?🎜🎜 그리고 Ivy를 열지 않고 다시 컴파일을 하였는데, 이번에는 다음과 같은 디렉토리 구조를 얻어옵니다 : 🎜🎜Angular의 Ivy 컴파일이란 무엇입니까? Ivy 컴파일을 활성화하는 방법은 무엇입니까? 🎜🎜 여기서는 View Engine 컴파일된 파일🎜🎜Angular의 Ivy 컴파일이란 무엇입니까? Ivy 컴파일을 활성화하는 방법은 무엇입니까?ivy.comComponent.js 및 ivy.comComponent.ngfactory.js 두 개의 기본 파일을 선택합니다. title="162804321169320Angular의 Ivy 컴파일이란 무엇입니까? Ivy 컴파일을 활성화하는 방법은 무엇입니까?" alt="Angular의 Ivy 컴파일이란 무엇입니까? Ivy 컴파일을 활성화하는 방법은 무엇입니까?"/ >🎜🎜Angular의 Ivy 컴파일이란 무엇입니까? Ivy 컴파일을 활성화하는 방법은 무엇입니까?🎜🎜 Ivy 컴파일에 비해 컴파일된 파일과 코드의 양이 많이 늘어났습니다. 🎜🎜🎜AOT 컴파일 및 JIT 컴파일🎜🎜🎜Angular 애플리케이션은 주로 구성 요소와 해당 HTML 템플릿으로 구성됩니다. 구성 요소는 Typescript 언어로 작성되고 데코레이터를 사용하여 정의됩니다. 브라우저는 Angular에서 제공하는 구성 요소와 템플릿을 직접 이해할 수 없으므로 Angular 애플리케이션이 필요합니다. 브라우저에서 실행되기 전에 컴파일됩니다. 🎜🎜다음은 angular의 컴파일 프로세스 다이어그램입니다. 🎜🎜🎜🎜

在浏览器下载和运行代码之前的编译阶段,Angular 预先(AOT)编译器会先把你的 Angular HTML 和 TypeScript 代码转换成高效的 JavaScript 代码。 在构建期间编译应用可以让浏览器中的渲染更快速。而在官方文档中给出了使用AOT的部分原因:

  • 更快的渲染
  • 更少的异步请求
  • 较小的 Angular 框架下载大小
  • 尽早检测模板错误
  • 更高的安全性( AOT 在将 HTML 模板和组件提供给客户端之前就将其编译为 JavaScript 文件。没有要读取的模板,没有潜藏风险的客户端 HTML 或 JavaScript eval,受到注入攻击的机会就更少了。)

在早期的Angular8版本之前,Angular并没有采用AOT编译的方法,而是采用了JIT(即时编译)编译来生成应用,它会在运行期间在浏览器中编译你的应用。JIT编的一般步骤是、 首先将Typescript代码(包括用户编写的代码,以及Angular框架、Angular编译器代码)编译成JavaScript代码。接着将这些代码部署到服务器端然后浏览器发起请求下载代码开始执行,接着Angular启动,Angular调用Angular编译器。对于每个组件类、ngModule、Pipe等都需要编译,之前typescript代码编译为javascript代码所保存的metadata,根据metadata编译出浏览器可以执行的Javascript代码前面图里的NgFactory文件。接着通过NgFactories文件来构建整个应用的具体组件。

这里有对AOT与JIT编译详解的文章:Angular编译机制AOT和JIT

开启Ivy编译

Ivy编译默认采用的是AOT编译方法,在之前angular主要使用的都是JIT编译,如果需要使用Ivy编译,需要修改tsconfig.app.ts中添加angularCompilerOptions选项以及开启enableIvy

{
   "compilerOptions": { ... },
  "angularCompilerOptions": {
    "enableIvy": true
  }
}

其次要确认的是angular配置文件angular.jsonaot设置为true

Ivy运行时

新的运行时引擎基于increnmental DOM的概念。这是一种使用指令表达和应用更新到 DOM 树的方法。DOM 更新是 Angular 中变化检测的主要部分,因此这个概念可以方便地应用到框架中。在在这篇文章中可以了解更多关于它的内容,它解释了这个概念背后的推理,并将它与React 中的Virtual DOM进行了对比。增量 DOM 也恰好是一个,但是新的 Ivy 引擎没有使用它,而是实现了自己的增量DOM版本。

在之前Angular的主要实现逻辑是实例化组件、创建DOM节点以及进行更改检测,而这个整体是通过一个很小的原子单元实现的(atomic unit)。编译器只是生成有关的组件以及组件中定义元素的元数据meta data。如下图

Angular의 Ivy 컴파일이란 무엇입니까? Ivy 컴파일을 활성화하는 방법은 무엇입니까?

而新的Ivy引擎下的步骤如下:

Angular의 Ivy 컴파일이란 무엇입니까? Ivy 컴파일을 활성화하는 방법은 무엇입니까?

可与看出模板指令是实例化组件、创建 DOM 节点和运行变更检测的逻辑所在。但是它已经从整体的解释器转移到了单个的指令中。而Ivy带来的另一个优点是对于变更检测(change detection)的调试。新的Ivy编译环境下可以直接在模板函数中放置断点即可调试组件的变更检测。

新的编译器还会将一组独立的Typescript类转换编译为表示Class组件的的AST。这些转换都会被实现为一种纯函数,这个函数接受表示装饰器的元数据meta data并将该定义作为静态字段添加到组件类中。

위는 Ivy 컴파일 엔진에 대한 소개이며, 새로운 Ivy는 원래 변경 감지에도 변경 사항을 적용합니다. 이에 대해서는 변경 사항에 대한 다음 기사에서 논의하겠습니다. 탐지. Ivy编译引擎的介绍,而新的Ivy对于原来的变更检测也会带来变化,这个在下次关于变更检测的文章中进行总结。

参考文章:

强烈推荐Eliassy大佬对于Ivy

참조 기사:

EliassyIvy 소개 및 시연을 적극 권장합니다. Angular 애플리케이션 디버깅의 검은 기술!

원본 주소: https://juejin.cn/post/6988811689344892941🎜🎜저자: edison🎜🎜🎜더 많은 프로그래밍 관련 지식을 보시려면 🎜프로그래밍 비디오🎜를 방문해 주세요! ! 🎜

위 내용은 Angular의 Ivy 컴파일이란 무엇입니까? Ivy 컴파일을 활성화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 掘金--edison에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
C/C에서 JavaScript까지 : 모든 것이 어떻게 작동하는지C/C에서 JavaScript까지 : 모든 것이 어떻게 작동하는지Apr 14, 2025 am 12:05 AM

C/C에서 JavaScript로 전환하려면 동적 타이핑, 쓰레기 수집 및 비동기 프로그래밍으로 적응해야합니다. 1) C/C는 수동 메모리 관리가 필요한 정적으로 입력 한 언어이며 JavaScript는 동적으로 입력하고 쓰레기 수집이 자동으로 처리됩니다. 2) C/C를 기계 코드로 컴파일 해야하는 반면 JavaScript는 해석 된 언어입니다. 3) JavaScript는 폐쇄, 프로토 타입 체인 및 약속과 같은 개념을 소개하여 유연성과 비동기 프로그래밍 기능을 향상시킵니다.

JavaScript 엔진 : 구현 비교JavaScript 엔진 : 구현 비교Apr 13, 2025 am 12:05 AM

각각의 엔진의 구현 원리 및 최적화 전략이 다르기 때문에 JavaScript 엔진은 JavaScript 코드를 구문 분석하고 실행할 때 다른 영향을 미칩니다. 1. 어휘 분석 : 소스 코드를 어휘 단위로 변환합니다. 2. 문법 분석 : 추상 구문 트리를 생성합니다. 3. 최적화 및 컴파일 : JIT 컴파일러를 통해 기계 코드를 생성합니다. 4. 실행 : 기계 코드를 실행하십시오. V8 엔진은 즉각적인 컴파일 및 숨겨진 클래스를 통해 최적화하여 Spidermonkey는 유형 추론 시스템을 사용하여 동일한 코드에서 성능이 다른 성능을 제공합니다.

브라우저 너머 : 실제 세계의 JavaScript브라우저 너머 : 실제 세계의 JavaScriptApr 12, 2025 am 12:06 AM

실제 세계에서 JavaScript의 응용 프로그램에는 서버 측 프로그래밍, 모바일 애플리케이션 개발 및 사물 인터넷 제어가 포함됩니다. 1. 서버 측 프로그래밍은 Node.js를 통해 실현되며 동시 요청 처리에 적합합니다. 2. 모바일 애플리케이션 개발은 재교육을 통해 수행되며 크로스 플랫폼 배포를 지원합니다. 3. Johnny-Five 라이브러리를 통한 IoT 장치 제어에 사용되며 하드웨어 상호 작용에 적합합니다.

Next.js (백엔드 통합)로 멀티 테넌트 SAAS 애플리케이션 구축Next.js (백엔드 통합)로 멀티 테넌트 SAAS 애플리케이션 구축Apr 11, 2025 am 08:23 AM

일상적인 기술 도구를 사용하여 기능적 다중 테넌트 SaaS 응용 프로그램 (Edtech 앱)을 구축했으며 동일한 작업을 수행 할 수 있습니다. 먼저, 다중 테넌트 SaaS 응용 프로그램은 무엇입니까? 멀티 테넌트 SAAS 응용 프로그램은 노래에서 여러 고객에게 서비스를 제공 할 수 있습니다.

Next.js (Frontend Integration)를 사용하여 멀티 테넌트 SaaS 응용 프로그램을 구축하는 방법Next.js (Frontend Integration)를 사용하여 멀티 테넌트 SaaS 응용 프로그램을 구축하는 방법Apr 11, 2025 am 08:22 AM

이 기사에서는 Contrim에 의해 확보 된 백엔드와의 프론트 엔드 통합을 보여 주며 Next.js를 사용하여 기능적인 Edtech SaaS 응용 프로그램을 구축합니다. Frontend는 UI 가시성을 제어하기 위해 사용자 권한을 가져오고 API가 역할 기반을 준수하도록합니다.

JavaScript : 웹 언어의 다양성 탐색JavaScript : 웹 언어의 다양성 탐색Apr 11, 2025 am 12:01 AM

JavaScript는 현대 웹 개발의 핵심 언어이며 다양성과 유연성에 널리 사용됩니다. 1) 프론트 엔드 개발 : DOM 운영 및 최신 프레임 워크 (예 : React, Vue.js, Angular)를 통해 동적 웹 페이지 및 단일 페이지 응용 프로그램을 구축합니다. 2) 서버 측 개발 : Node.js는 비 차단 I/O 모델을 사용하여 높은 동시성 및 실시간 응용 프로그램을 처리합니다. 3) 모바일 및 데스크탑 애플리케이션 개발 : 크로스 플랫폼 개발은 개발 효율을 향상시키기 위해 반응 및 전자를 통해 실현됩니다.

JavaScript의 진화 : 현재 동향과 미래 전망JavaScript의 진화 : 현재 동향과 미래 전망Apr 10, 2025 am 09:33 AM

JavaScript의 최신 트렌드에는 Typescript의 Rise, 현대 프레임 워크 및 라이브러리의 인기 및 WebAssembly의 적용이 포함됩니다. 향후 전망은보다 강력한 유형 시스템, 서버 측 JavaScript 개발, 인공 지능 및 기계 학습의 확장, IoT 및 Edge 컴퓨팅의 잠재력을 포함합니다.

Demystifying JavaScript : 그것이하는 일과 중요한 이유Demystifying JavaScript : 그것이하는 일과 중요한 이유Apr 09, 2025 am 12:07 AM

JavaScript는 현대 웹 개발의 초석이며 주요 기능에는 이벤트 중심 프로그래밍, 동적 컨텐츠 생성 및 비동기 프로그래밍이 포함됩니다. 1) 이벤트 중심 프로그래밍을 사용하면 사용자 작업에 따라 웹 페이지가 동적으로 변경 될 수 있습니다. 2) 동적 컨텐츠 생성을 사용하면 조건에 따라 페이지 컨텐츠를 조정할 수 있습니다. 3) 비동기 프로그래밍은 사용자 인터페이스가 차단되지 않도록합니다. JavaScript는 웹 상호 작용, 단일 페이지 응용 프로그램 및 서버 측 개발에 널리 사용되며 사용자 경험 및 크로스 플랫폼 개발의 유연성을 크게 향상시킵니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구