Angular作為目前最為流行的前端框架,受到了前端開發者的普遍歡迎。不論是初學Angular的新手,還是有一定Angular開發經驗的開發者,了解本文中的12個經典面試問題,都將會是一個深入了解和學習Angular 2的知識概念的絕佳途徑。
在文中,我們將會接觸到許多Angular 2的重要概念,並附擴展閱讀資料和自查小測試,供大家評估自己對Angular的了解程度。
相關教學推薦:《angular教學》
元件特定hooks:
Angular 2是一個平台,不僅是一種語言
具備ES6和Typescript的好處。
靈活的路由,具備延遲載入功能Angular 2不具有雙向digest cycle,這是與Angular 1不同的。在Angular2中,組件中發生的任何改變總是從當前組件傳播到其所有子組件。如果一個子組件的變更需要反映到其父組件的層次結構中,我們可以透過使用事件發射器api來發出事件。
簡而言之,EventEmitter是在@ angular/core模組中定義的類,由元件和指令使用,用來發出自訂事件。
@output() somethingChanged = new EventEmitter();
我們使用somethingChanged.emit(value)方法來發出事件。這通常用在setter中,當類別中的值被更改完成。
可以透過模組的任何一個元件,使用訂閱方法來實現事件發射的訂閱。
myObj.somethingChanged.subscribe(val) => this.myLocalMethod(val));
擴充讀取:
#http://stackoverflow.com/questions/36076700/what-is- the-proper-use-of-an-eventemitter
https://angular.io/docs/ts/latest/api/core/index/EventEmitter-class.HTML
所有企業應用程式都會遵循一組編碼慣例和準則,以更好的方式維護程式碼。 Codelyzer是一個開源工具,用於運行和檢查是否遵循了預先定義的編碼準則。 Codelyzer僅對Angular和TypeScript專案進行靜態程式碼分析。
Codelyzer運行在tslint的頂部,其編碼約定通常在tslint.json檔案中定義。 Codelyzer可以直接透過Angularcli或npm來運作。像Visual Studio Code和Atom這樣的編輯器也支援codelyzer,只需要透過做一個基本的設定來實現。
要在Visual Studio程式碼中設定codelyzer,我們可以在檔案 - >選項 - >使用者設定中新增tslint規則的路徑。
{ "tslint.rulesDirectory": "./node_modules/codelyzer", "typescript.tsdk": "node_modules/typescript/lib" }
從cli執行的程式碼:ng lint。
從npm中執行的程式碼: npm run lint
# 擴充讀取:
透過限制api,選擇使用已知或安全環境/瀏覽器的app來防止XSRF攻擊。
延伸閱讀:https://angular.io/docs/ts/latest/guide/security.HTML#!#best -practices
優化取決於應用程式的類型和大小以及許多其他因素。但一般來說,在最佳化Angular 2應用程式時,我會考慮以下幾點:
考慮AOT編譯。
確保應用程式已經經過了捆綁,uglify和tree shaking。
確保應用程式不存在不必要的import語句。
確保應用程式中已經移除了不使用的第三方函式庫。
所有dependencies 和dev-dependencies都是明確分開的。
如果應用程式較大時,我會考慮延遲載入而不是完全捆綁的應用程式。
延伸閱讀:
#https://medium.com/@areai51/ the-4-stages-of-perf-tuning-for-your-angular2-app-922ce5c1b294#.pw4m2srmr
#https://www.lucidchart.com/techblog/2016/ 05/04/angular-2-best-practices-change-detector-performance/
在大多數的情況下,第三方函式庫都帶有它的.d.ts 文件,用於型別定義。在某些情況下,我們需要透過向現有類型提供一些更多的屬性來擴展現有類型,或者如果我們需要定義其它類型以避免TypeScript警告。
如果我們需要擴展外部庫的類型定義,一個好的做法是,我們並非對node_modules或現有的typings資料夾進行改動,而是創建一個命名為「自訂類型」的新文件夾,來儲存所有的自訂類型。
要定義應用程式(JavaScript / Typescript)物件的類型,我們應該在應用程式對應模組的models資料夾中,定義介面和實體類別。
對於這些情況,我們可以透過建立我們自己的「 .d.ts」檔案來實現定義或擴充類型。
延伸閱讀:
#https://www.typescriptlang.org/docs/handbook/declaration-merging .HTML
https://typescript.codeplex.com/wikipage?title=Writing Definition (.d.ts) Files
http ://stackoverflow.com/questions/32948271/extend-interface-defined-in-d-ts-file
Shadow DOM是HTML規範的一部分,它允許開發人員封裝自己的HTML標記,CSS樣式和JavaScript。 Shadow DOM以及其它一些技術,使開發人員能夠像
因為shadow DOM本質上是靜態的,同時也是開發人員無法存取的,所以它是一個很好的候選對象。因為它快取的DOM將在瀏覽器中呈現得更快,並提供更好的效能。此外,還可以相對地很好地管理shadow DOM,同時偵測Angular 2應用程式的改變,並且可以有效地管理視圖的重新繪製。
延伸閱讀:
#https://developer.mozilla.org/en-US/docs/Web /Web_Components/Shadow_DOM
https://glazkov.com/2011/01/14/what-the-heck-is-shadow-dom/
#https://code.tutsplus.com/tutorials/intro-to-shadow-dom--net-34966
更快的下載:由於應用程式已經編譯,許多Angular編譯器相關函式庫就不再需要捆綁,應用程式包變得更小,所以該應用程式可以更快下載。
更少的Http請求數:如果應用程式沒有捆綁來支援延遲載入(或任何原因),對於每個關聯的HTML和CSS,都會有一個單獨的伺服器請求。但是預先編譯的應用程式會將所有模板和樣式與元件對齊,因此到伺服器的Http請求數量會更少。
更快的渲染:如果應用程式不是AOT編譯,那麼應用程式完全載入時,編譯過程會發生在瀏覽器中。這需要等待下載所有必需的元件,然後等待編譯器花費時間來編譯應用程式。使用AOT編譯,就能實現最佳化。
在建置時偵測錯誤:由於預先編譯,可以偵測到許多編譯時錯誤,能夠為應用程式提供更好的穩定性。
缺點:
只適用於HTML和CSS,其它檔案類型需要前面的建置步驟
沒有watch模式,必須手動完成(bin / ngc-watch.js)並編譯所有檔案
需要維護AOT版本的bootstrap檔案(使用cli等工具時不需要)
在編譯之前,需要清理步驟
延伸閱讀:https:/ /angular.io/docs/ts/latest/cookbook/aot-compiler.HTML
從堆疊溢出就是一個差異:
當非同步作業完成或失敗時,Promise會處理單一事件。
Observable類似於(在許多語言中的)Stream,當每個事件呼叫回呼函數時,允許傳遞零個或多個事件。通常Observable比Promise更受歡迎,因為它不但提供了Promise特性,還提供了其它特性。使用Observable可以處理0,1或多個事件。你可以在每種情況下使用相同的API。 Observable是可取消的,這相比於Promise也具有優勢。如果伺服器的HTTP請求結果或其它一些非同步操作不再需要,則Observable的訂閱者可以取消訂閱,而Promise將最終呼叫成功或失敗的回調,即使你不需要通知或其提供的結果。 Observable提供像map,forEach,reduce之類的類似數組的運算符,還有強大的運算符,如retry()或replay()等,使用起來是相當方便的。
Promises vs Observables
示範效果:http://ng2-quiz.anuraggandhi.com/答案在這裡(實作程式碼):https://www.codeproject.com /Articles/1167451/Quiz-Application-in-Angular
更多程式相關知識,請造訪:程式設計教學! !
以上是12個關於Angular的經典訪談題的詳細內容。更多資訊請關注PHP中文網其他相關文章!