각도 - 개별 구성 요소 로드 지연
25638 단어 architecturewebdevjavascriptangular
시간의 추이에 따라 우리의 웹 응용 프로그램은 점점 더 많은 일을 해야 할 것이다. 이것은 페이지의 불러오는 시간에 영향을 줄 것이다. 동적 변화 부분을 가진 대형 동적 폼을 구축할 때 이 점은 매우 뚜렷하다.
현재 폼에 필요한 구성 요소만 불러올 수 있다면, 모든 구성 요소를 한 번에 불러오는 것이 아니라, 불러오는 시간이 줄어들 뿐만 아니라, 클라이언트에게 불필요한 코드도 공개하지 않을 것입니다. (이것은 js 파일에 존재하지만 UI는 그것을 보여주지 않습니다.)
지금 우리는 이미 이러한 예와 몇 가지 좋은 점을 소개했는데, 이것은 어떻게 한 것입니까?Angular primary는 단순한 해결 방법 없이 프레임의 유효성을 확보하고 항상 구축의 질을 확보할 수 있는 매우 폐쇄적인 프레임입니다.
그러나 여전히 한 가지 방식, 한 가지 각도의 방식이 있다.
@Component({
selector: 'app-parentMock',
template: ``,
})
export class ParentComponent implements OnInit {
constructor(
private componentFactoryResolver: ComponentFactoryResolver,
) {}
}
ComponentFactoryResolver는 런타임 시 구성 요소를 생성하는 클래스입니다.그것은 약간의 이상한 행동을 했지만, 우리는 이 예를 계속합시다.
@Component({
selector: 'app-parentMock',
template: ``,
})
export class ParentComponent implements OnInit {
demoObj = {
demo: {
load: () => import('../mock/mock.component')
}
}
constructor(
private componentFactoryResolver: ComponentFactoryResolver,
) {}
async ngOnInit(): Promise<void> {
await this.loadComponent();
}
async loadComponent() {
/** This saves loads the raw un-angular data into the loadFile */
const loadFile: {default: any} = await this.demoObj.demo.load();
}
}
위 코드 세그먼트에서 보듯이 변수loadFile의 형식 {default:any}이 있는 구성 요소를 불러올 상대적인 경로를 포함하는 대상이 있습니다.이것은 처음에는 가치가 없었다.어셈블리에서 이러한 작업을 수행하려면 어셈블리 아래쪽(어셈블리 외부에 있지만)에서 로드를 지연하고 다음을 추가해야 합니다.이게 굉장히 중요해요.
export default MockComponent
지금은 까다로운 부분이니, 내가 상세하게 설명하겠다.
@Component({
selector: 'app-parentMock',
template: `
<ng-template #lazyTab></ng-template>
`,
})
export class ParentComponent implements OnInit {
/** The html element we will be loading the component into */
@ViewChild('lazyTab', {static: true}) lazyTab: ViewContainerRef;
lazyLoadedCompoent: ComponentRef<any>;
demoObj = {
demo: {
load: () => import('../mock/mock.component')
}
}
constructor(
private componentFactoryResolver: ComponentFactoryResolver,
private injector: Injector,
) {}
async ngOnInit(): Promise<void> {
await this.loadComponent();
}
async loadComponent() {
/** This saves loads the raw un-angular data into the loadFile */
const loadFile: {default: any} = await this.demoObj.demo.load();
/** This loads the Angular component into the the varibale for later use */
const actualComponent = this.componentFactoryResolver.resolveComponentFactory(loadFile.default);
const viewRef: ViewContainerRef = this.lazyTab.viewContainerRef;
/** Clear any existing html inside of of the ng-container */
viewRef.clear()
/** We both insert the component in to the ref and save it for later use
*
* Adding the injector is to let it load other requiered things like services and other dependecies it might have
*/
this.lazyLoadedCompoent = viewRef.createComponent<any>(actualComponent, null, this.injector)
}
}
마지막 한 소절 보여주세요.lazyTab(html에서): 템플릿 참조 변수입니다. 이 변수를 사용하여 angular이 lazyLoaded 구성 요소를 어디에 삽입하는지 알려 드리겠습니다.
@ViewChild('lazyTab'..: 템플릿 참조 변수를 사용하기 위해 typescript에 대한 접근을 제공합니다
loadFile: 생성된 원본 어셈블리를 저장하기 위해 생성된 변수
actualComponent: 우리가 실행할 때 만든 각도 구성 요소
현재 우리는 구성 요소를 불러왔습니다. 구성 요소에 입력이나 출력을 추가해서 전체 응용 프로그램과 동기화하기를 원할 수도 있습니다.
계속하기 전에 각도 변화 검측과 NgZone은 Angular의 모든 마법 중의 주요 흑마법에 대해 이야기할 필요가 있다고 생각합니다.
NgZone은 애플리케이션이 변화에 반응하고 자체 업데이트하도록 하는 도구입니다.어느 정도에 그것의 작업 범위는 유한하다.각도 범위 밖에서 작업하면 변경 사항이 감지되지 않으므로 UI 업데이트가 없습니다.
@Component({
selector: 'app-parentMock',
template: `
<ng-template #lazyTab></ng-template>
`,
})
export class ParentComponent implements OnInit {
/** The html element we will be loading the component into */
@ViewChild('lazyTab', {static: true}) lazyTab: ViewContainerRef;
lazyLoadedCompoent: ComponentRef<any>;
demoObj = {
demo: {
load: () => import('../mock/mock.component')
}
}
constructor(
private componentFactoryResolver: ComponentFactoryResolver,
private injector: Injector,
private zone: NgZone,
) {}
async ngOnInit(): Promise<void> {
await this.loadComponent();
}
async loadComponent() {
/** This saves loads the raw un-angular data into the loadFile */
const loadFile: {default: any} = await this.demoObj.demo.load();
/** This loads the Angular component into the the varibale for later use */
const actualComponent = this.componentFactoryResolver.resolveComponentFactory(loadFile.default);
const viewRef: ViewContainerRef = this.lazyTab.viewContainerRef;
/** Clear any existing html inside of of the ng-container */
viewRef.clear()
/** We both insert the component in to the ref and save it for later use
*
* Adding the injector is to let it load other requiered things like services and other dependecies it might have
*/
this.lazyLoadedCompoent = viewRef.createComponent<any>(actualComponent, null, this.injector)
/** To ensure the next changes are kept inside the Angular Zone Scope */
this.zone.run(() => {
this.lazyLoadedCompoent.instance['any-INPUT-you want'] = 'Lazy Loaded Component'
})
}
}
구역뛰다이 입력을 설정하거나 초기화할 때, 게으른 부하 구성 요소의 변화가 ngOnChanges를 실행하는 것을 감지합니다.그럼 지금 출력은요?출력은 우리가 전달하는 함수인데 어떻게 실현합니까?
@Component({
selector: 'app-parentMock',
template: `
<ng-template #lazyTab></ng-template>
`,
})
export class ParentComponent implements OnInit {
/** The html element we will be loading the component into */
@ViewChild('lazyTab', {static: true}) lazyTab: ViewContainerRef;
lazyLoadedCompoent: ComponentRef<any>;
demoObj = {
demo: {
load: () => import('../mock/mock.component')
}
}
constructor(
private componentFactoryResolver: ComponentFactoryResolver,
private injector: Injector,
private zone: NgZone,
) {}
async ngOnInit(): Promise<void> {
await this.loadComponent();
}
async loadComponent() {
/** This saves loads the raw un-angular data into the loadFile */
const loadFile: {default: any} = await this.demoObj.demo.load();
/** This loads the Angular component into the the varibale for later use */
const actualComponent = this.componentFactoryResolver.resolveComponentFactory(loadFile.default);
const viewRef: ViewContainerRef = this.lazyTab.viewContainerRef;
/** Clear any existing html inside of of the ng-container */
viewRef.clear()
/** We both insert the component in to the ref and save it for later use
*
* Adding the injector is to let it load other requiered things like services and other dependecies it might have
*/
this.lazyLoadedCompoent = viewRef.createComponent<any>(actualComponent, null, this.injector)
/** To ensure the next changes are kept inside the Angular Zone Scope */
this.zone.run(() => {
/** INPUT */
this.lazyLoadedCompoent.instance['any-INPUT-you want'] = 'Lazy Loaded Component'
/** OUTPUT */
this.lazyLoadedCompoent.instance['an-OUTPUT-type-of-new-Emitter'].subscribe((dataPassedByTheEmit: any) => {
console.log(dataPassedByTheEmit);
/** Do what ever you want wit it */
})
})
}
}
그래서 출력은 Emitter 형식입니다. 이것은 우리가 그것을 구독하고 lazyLoaded 구성 요소에서 보내는 데이터를 얻을 수 있음을 의미합니다.이것은 놀랍게도 프로그램이 실행될 때 불러오는 완전한 활성 구성 요소가 있습니다.
우리 먼저 결점을 이야기합시다
어떤 질문이나 평론에 대해서도 언제든지 평론을 발표해 주십시오. 저는 기꺼이 대답할 것입니다
Reference
이 문제에 관하여(각도 - 개별 구성 요소 로드 지연), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/hopemanryan/angular-lazy-load-single-component-3g0h텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)