成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

angular源碼分析之platformBrowserDynamic

zhoutao / 1725人閱讀

摘要:生成項(xiàng)目后,中的代碼這里調(diào)用了包中導(dǎo)出的函數(shù)這個(gè)函數(shù)是瀏覽器平臺(tái)的工廠函數(shù)執(zhí)行會(huì)返回瀏覽器平臺(tái)的實(shí)例函數(shù)是通過函數(shù)創(chuàng)建的這個(gè)函數(shù)接收個(gè)參數(shù)父平臺(tái)工廠函數(shù)平臺(tái)名稱服務(wù)提供商的數(shù)組顧名思義函數(shù)的作用是創(chuàng)建平臺(tái)工廠的函數(shù)在框架被加

cli生成項(xiàng)目后,main.ts中的代碼

import { enableProdMode } from "@angular/core";
import { platformBrowserDynamic } from "@angular/platform-browser-dynamic";

import { AppModule } from "./app/app.module";
import { environment } from "./environments/environment";

if (environment.production) {
  enableProdMode();
}

platformBrowserDynamic().bootstrapModule(AppModule).catch(err => console.error(err));

這里調(diào)用了@angular/platform-browser-dynamic包中導(dǎo)出的platformBrowserDynamic函數(shù),這個(gè)函數(shù)是瀏覽器平臺(tái)的工廠函數(shù),執(zhí)行會(huì)返回瀏覽器平臺(tái)的實(shí)例

export const platformBrowserDynamic = createPlatformFactory(platformCoreDynamic, "browserDynamic", INTERNAL_BROWSER_DYNAMIC_PLATFORM_PROVIDERS);

platformBrowserDynamic函數(shù)是通過createPlatformFactory函數(shù)創(chuàng)建的,這個(gè)函數(shù)接收3個(gè)參數(shù),parentPlatformFactory(父平臺(tái)工廠函數(shù)),name(平臺(tái)名稱),providers(服務(wù)提供商的數(shù)組)

export function createPlatformFactory(
    parentPlatformFactory: ((extraProviders?: StaticProvider[]) => PlatformRef) | null,
    name: string, providers: StaticProvider[] = []): (extraProviders?: StaticProvider[]) =>
    PlatformRef {
  const desc = `Platform: ${name}`;
  const marker = new InjectionToken(desc);
  return (extraProviders: StaticProvider[] = []) => {
    let platform = getPlatform();
    if (!platform || platform.injector.get(ALLOW_MULTIPLE_PLATFORMS, false)) {
      if (parentPlatformFactory) {
        parentPlatformFactory(
            providers.concat(extraProviders).concat({provide: marker, useValue: true}));
      } else {
        const injectedProviders: StaticProvider[] =
            providers.concat(extraProviders).concat({provide: marker, useValue: true});
        createPlatform(Injector.create({providers: injectedProviders, name: desc}));
      }
    }
    return assertPlatform(marker);
  };
}

在angular框架被加載后,會(huì)執(zhí)行這個(gè)函數(shù),并傳入了三個(gè)參數(shù)分別為 platformCoreDynamic, "browserDynamic", INTERNAL_BROWSER_DYNAMIC_PLATFORM_PROVIDERS

看第一個(gè)參數(shù)platformCoreDynamic:

export const platformCoreDynamic = createPlatformFactory(platformCore, "coreDynamic", [
    {provide: COMPILER_OPTIONS, useValue: {}, multi: true},
    {provide: CompilerFactory, useClass: JitCompilerFactory, deps: [COMPILER_OPTIONS]},
]);

第一個(gè)參數(shù)也是通過createPlatformFactory函數(shù)創(chuàng)建的一個(gè)工廠函數(shù),這里執(zhí)行的時(shí)候又傳入了三個(gè)參數(shù)platformCore,"coreDynamic"和一個(gè)提供商數(shù)組

第一個(gè)參數(shù)platformCore:

export const platformCore = createPlatformFactory(null, "core", _CORE_PLATFORM_PROVIDERS);

又是通過createPlatformFactory函數(shù)創(chuàng)建的... ,但好在沒有在繼續(xù)傳入父平臺(tái)作為參數(shù),所以應(yīng)用初始化時(shí)執(zhí)行的第一個(gè)函數(shù)就是這個(gè)了

這里有點(diǎn)繞,屢一下函數(shù)的執(zhí)行過程:

createPlatformFactory(null, "core", _CORE_PLATFORM_PROVIDERS)執(zhí)行返回platformCore函數(shù)

createPlatformFactory(platformCore, "coreDynamic", [...])執(zhí)行返回platformCoreDynamic函數(shù)

createPlatformFactory(platformCoreDynamic, "browserDynamic", INTERNAL_BROWSER_DYNAMIC_PLATFORM_PROVIDERS)執(zhí)行返回platformBrowserDynamic函數(shù)

platformBrowserDynamic()執(zhí)行返回平臺(tái)實(shí)例

要注意到這里創(chuàng)建的都是工廠函數(shù),而不是平臺(tái)實(shí)例,在angular框架被加載后,就會(huì)開始執(zhí)行,此時(shí)應(yīng)用還沒有正式啟動(dòng)

在執(zhí)行platformBrowserDynamic()后,應(yīng)用開始啟動(dòng),實(shí)例化core平臺(tái)(這里的調(diào)用順序就不貼出來了,雖然工廠函數(shù)的調(diào)用順序是platformBrowserDynamic->platformCoreDynamic->platformCore,但是實(shí)例化的只有core平臺(tái))

coreDynamic平臺(tái)和browserDynamic平臺(tái)的工廠函數(shù)并不是創(chuàng)建子平臺(tái)的實(shí)例,而是添加服務(wù)提供商,被實(shí)例化的只有一個(gè)平臺(tái)實(shí)例,只不過會(huì)改變PLATFORM_IDtoken的值

core平臺(tái)實(shí)例化之前,首先創(chuàng)建了應(yīng)用的根注入器

createPlatform(Injector.create({providers: injectedProviders, name: desc}));

core平臺(tái)實(shí)例化過程中,又通過子平臺(tái)工廠函數(shù)的參數(shù)和區(qū)域變量,傳入了一些服務(wù)提供商,然后將這些提供商統(tǒng)一注冊(cè)到了注入器中:

// 這里的變量名是我命名的不是源碼中的名字,用以區(qū)分各個(gè)平臺(tái)下注冊(cè)的提供商
export const browserDynamic_PROVIDERS: StaticProvider[] = [
  {provide: PLATFORM_ID, useValue: PLATFORM_BROWSER_ID},
  {provide: PLATFORM_INITIALIZER, useValue: initDomAdapter, multi: true},
  {provide: PlatformLocation, useClass: BrowserPlatformLocation, deps: [DOCUMENT]},
  {provide: DOCUMENT, useFactory: _document, deps: []},
  {
    provide: COMPILER_OPTIONS,
    useValue: {providers: [{provide: ResourceLoader, useClass: ResourceLoaderImpl, deps: []}]},
    multi: true
  },
  {provide: PLATFORM_ID, useValue: PLATFORM_BROWSER_ID}
];

export const coreDynamic_PROVIDERS: StaticProvider[] = [
  {provide: COMPILER_OPTIONS, useValue: {}, multi: true},
  {provide: CompilerFactory, useClass: JitCompilerFactory, deps: [COMPILER_OPTIONS]}
];

export const core_PROVIDERS: StaticProvider[] = [
  // Set a default platform name for platforms that don"t set it explicitly.
  {provide: PLATFORM_ID, useValue: "unknown"},
  {provide: PlatformRef, deps: [Injector]},
  {provide: TestabilityRegistry, deps: []},
  {provide: Console, deps: []},
]

然后進(jìn)行初始化的操作,包括BrowserDomAdapter(DOM適配器)和BrowserGetTestability

export function createPlatform(injector: Injector): PlatformRef {
  if (_platform && !_platform.destroyed &&
      !_platform.injector.get(ALLOW_MULTIPLE_PLATFORMS, false)) {
    throw new Error(
        "There can be only one platform. Destroy the previous one to create a new one.");
  }
  _platform = injector.get(PlatformRef);
  // 初始化操作 browserDynamic平臺(tái)下的PLATFORM_INITIALIZER服務(wù)
  const inits = injector.get(PLATFORM_INITIALIZER, null);
  if (inits) inits.forEach((init: any) => init());
  return _platform;
}

這里初始化操作是通過PLATFORM_INITIALIZERtoken注入,然后遍歷執(zhí)行,所以也可以在應(yīng)用中注入PLATFORM_INITIALIZER,然后執(zhí)行一些啟動(dòng)時(shí)的自定義的任務(wù).

到這里,core平臺(tái)的實(shí)例化就完成了.

ps:

除了platform-browser-dynamic之外還有platform-browser模塊,這兩個(gè)模塊的區(qū)別是編譯方式的不同,platform-browser-dynamic模塊提供jit編譯,也就是說編譯在瀏覽器內(nèi)完成,而platform-browser模塊提供aot編譯,編譯在本地完成.

在代碼層面上來說,platform-browser模塊下core平臺(tái)的子平臺(tái)只有browser平臺(tái),而platform-browser-dynamic模塊下,core平臺(tái)的子平臺(tái)包含coreDynamic平臺(tái)和browserDynamic平臺(tái),并添加了額外的服務(wù)提供商

  {
    provide: COMPILER_OPTIONS,
    useValue: {providers: [{provide: ResourceLoader, useClass: ResourceLoaderImpl, deps: []}]},
    multi: true
  },
  {provide: CompilerFactory, useClass: JitCompilerFactory, deps: [COMPILER_OPTIONS]},

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/108828.html

相關(guān)文章

  • angular源碼分析platformBrowserDynamic

    摘要:生成項(xiàng)目后,中的代碼這里調(diào)用了包中導(dǎo)出的函數(shù)這個(gè)函數(shù)是瀏覽器平臺(tái)的工廠函數(shù)執(zhí)行會(huì)返回瀏覽器平臺(tái)的實(shí)例函數(shù)是通過函數(shù)創(chuàng)建的這個(gè)函數(shù)接收個(gè)參數(shù)父平臺(tái)工廠函數(shù)平臺(tái)名稱服務(wù)提供商的數(shù)組顧名思義函數(shù)的作用是創(chuàng)建平臺(tái)工廠的函數(shù)在框架被加 cli生成項(xiàng)目后,main.ts中的代碼 import { enableProdMode } from @angular/core; import { platf...

    FWHeart 評(píng)論0 收藏0
  • 試讀angular源碼第一章:開場(chǎng)與platformBrowserDynamic

    摘要:而且大部分人一聽說就會(huì)本能地避開。至于啟動(dòng)項(xiàng)目,都是這一行開始的。應(yīng)用是模塊化的,它擁有自己的模塊化系統(tǒng),稱作。開場(chǎng)來個(gè)自我介紹 angular 源碼閱讀 項(xiàng)目地址 文章地址 angular 版本:8.0.0-rc.4 歡迎看看我的類angular框架 關(guān)于為什么寫這么一個(gè)項(xiàng)目 聲明:僅僅為個(gè)人閱讀源碼的理解,不一定完全正確,還需要大佬的指點(diǎn)。 其實(shí)市面上很多關(guān)于 vue和react 的源碼...

    RiverLi 評(píng)論0 收藏0
  • angular2初入眼簾-多components協(xié)作

    摘要:我們使用了模式書寫,并引入了思想,這些以前只在里見到的設(shè)計(jì),現(xiàn)在里也有體現(xiàn),并且在本章中會(huì)著重講解多的協(xié)作。如果之前寫過,那對(duì)于這種書寫方式一定無比熟悉。每次數(shù)據(jù)的變更,無論是還是,都將變化冒泡到,然后由再向下逐級(jí)推送各組件是否重繪。 前集回顧 在上一章里我們講了如何在angular2下開發(fā)一個(gè)component(還沒做的趕緊去學(xué)吧)。我們使用了Unidirectional Data ...

    dreamans 評(píng)論0 收藏0
  • angular2初入眼簾-搭個(gè)環(huán)境

    angular2是什么?我猜不容我贅述,各位一定略有耳聞,無論是曾經(jīng)AngularJS的擁躉,亦或是React的粉絲,都或多或少的對(duì)她有過一點(diǎn)了解。未見其物、先聞其聲,angular2在問世之前已經(jīng)做足了宣傳,想必諸位也一定被下面各種詞匯所震懾,什么:TypeScript、 ES5、 ES6、 Dart、 Immutable、 Unidirectional Data Flow、 Reactive ...

    everfight 評(píng)論0 收藏0
  • angular2初入眼簾-了解component

    摘要:通過增加刪除元素改變布局的。譬如和控制元素顯示隱藏,或者改變?cè)匦袨榈摹F┤缭O(shè)計(jì)看過我之前介紹以手寫依賴注入的朋友應(yīng)該已經(jīng)對(duì)行為驅(qū)動(dòng)多少有些了解了。她有,并且包含了至少一個(gè)和一個(gè)標(biāo)簽。,將左邊的事件傳遞給了右邊的表達(dá)式通常就是事件處理函數(shù)。 前集回顧 在上一章里我們講了如何為angular2搭建開發(fā)環(huán)境(還沒搭起來的趕緊去看哦),并使之跑起來我們的第一個(gè)My First Angular...

    ixlei 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

zhoutao

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<