Zlepšení poskytování a testování výkonu Ember.js

Tento příspěvek se původně objevil na mém osobním blogu.

Používám příkaz cli ember serve nebo zkrácený tvar ember s každý den k vytváření a obsluze lokálně ember aplikací pro vývoj. Všiml jsem si, že ember s --path dist a ember t --path dist jejich zahájení trvalo dlouho. --path flag umožňuje znovu použít existující sestavení na dané cestě.

➜  ~ ember help | grep -- "--path\|^\w" | grep -B1 -- "--path"
ember serve <options...>
  --path (Path) Reuse an existing build at given path.
ember test <options...>
  --path (Path) Reuse an existing build at given path.

Pomalá kontinuální integrace

Tato dlouhá doba startu také výrazně prodloužila celkovou dobu běhu kontinuální integrace, CI, testovacího běhu projektu, na kterém jsem pracoval. Sestavení CI bylo rozděleno do fáze kompilace a fáze testování. Fáze kompilace načte závislosti a zkompiluje aplikaci pomocí ember b a připravuje API na straně serveru pro naše testy kouře plného zásobníku. Aplikace používá ember-cli-typescript a sestavení může trvat asi 2 minuty kompilace strojopisu na CI. Testovací fáze se skládá ze 7 souběžných úloh, které všechny využívají kompilovaná aktiva z fáze kompilace. Díky jedné fázi kompilace a 7 fázím testování bude čas začátku do konce rychlejší. Celková doba běhu bude o něco delší kvůli několika 7 dalším krokům spouštění testovacího prostředí.

Celková doba běhu testovacího běhu CI se však prodloužila více, než by bylo možné přičíst dodatečným spouštěcím krokům, tj. celková doba dokončení všech úloh trvala přibližně o 14 minut déle, než se očekávalo. Díky použití souběžných úloh se zkracuje čas od zahájení sestavení a dokončení sestavení, došlo ke zkrácení doby do zpětné vazby, ale ne očekávané a celková doba běhu se prodloužila více, než se očekávalo.

Co se stane, když spustíte ember t ?

ember je rozhraní příkazového řádku pro Ember.js whereis ember vám řekne, kde je spustitelný soubor, v mém případě ~/.yarn/bin/ember . Otevírám ~/yarn/bin/ember první řádek je #!/usr/bin/env node říká nám, že jde o aplikaci uzlu, která vytvoří ember-cli CLI a run je to. Analýza argumentů příkazového řádku a vytvoření objektu Command zase vytvoří příslušný objekt Task a spustí jej. V tomto případě je to TestTask, který při spuštění vyvolá testem, testovací běh JS používaný Ember.js. TestTask také umožňuje ember addonům vložit middleware do testemu. Toto je velmi podobné ServerTask, který se spouští při použití ember s , s také umožňuje ember addonům vložit middleware do vývojového serveru.

Identifikace fáze pomalého sestavení

Zde a v dokumentech ember-cli je nějaká užitečná dokumentace popisující, jak vysledovat problémy s výkonem sestavení. Pomocí jedné z popsaných technik přidám DEBUG proměnná prostředí před ember s

$ DEBUG==ember-cli:* ember s --path dist
  ember-cli:test-server isForTests: false +10s
  ember-cli:broccoli-watcher serving: /admin/index.html +37s
  ember-cli:broccoli-watcher serving: (prefix stripped) /index.html, was: /admin/index.html +1ms

Proč to u isForTests trvá 10 s a co dělá brokolice, myslel jsem, že sloužíme předkompilované prostředky? Chcete-li se trochu více prohrabat a vytvořit mnohem více informací o ladění, spustili jste DEBUG=*:* ember s --path dist

$ DEBUG=*:* ember s --path dist
...
– Serving on http://localhost:4200/admin/
...
ember-cli-typescript:typecheck-worker Typecheck complete (0 diagnostics) +49s
...

Není to ember-cli:broccoli-watcher ale ember-cli-typescript:typecheck-worker zabírající celou dobu. Skutečným viníkem je middleware typu ember-cli-typescript. Kontrola typu se provádí, i když je kód již transpilován, v případě použití --path vlajka.

Zlepšení výkonu

Změna kódu pro zlepšení výkonu byla malá. Při přidávání middlewaru serveru nebo middlewaru testemu zkontrolujte možnosti předané ember-cli a pokud obsahují příznak cesty, nespouštějte kontrolu typu. Malý ember-cli aktualizace byla také nutná. ember-cli by předal všechny příznaky CLI serverovému middlewaru, ale ne middlewaru testemu. Bez aktualizace ember-cli by ember-cli-typechecking nebyl schopen provést kontrolu, když byl přidán middleware testem. Zajímavé je, že u každého PR jsem strávil mnohem více času zjišťováním, jak efektivně testovat změny, než je implementovat.

Tyto aktualizace výrazně zrychlily dobu sestavení CI a znatelněji zlepšily můj pracovní postup tím, že drasticky zkrátily dobu provádění příkazů ember při použití --path vlajka.