【薦】Angular官方代碼風格指南

本文為筆者對Angular官網風格指南的整理版本,刪除/增加了部分內容。另外,原文對每個規範都作出了原因的解釋,個別還有示例,需要的請點擊查看原文。

原鏈接:英文文檔 / 中文文檔

單一職責

  • 一個文件定義一樣東西,比如一個組件、一個服務、一個管道、一個指令
  • 每個文件最多不要超過400行
  • 定義功能單一的函數
  • 一個函數最多不要超過75行

命名規範

  • 文件名採用feature.type.**,feature表示特性,type表示類型
    • 模塊用 .module.ts
    • 路由模塊用 -routing.module.ts
    • 組件用 .component.ts|html|css
    • 服務用 .service.ts
    • 管道用 .pipe.ts
    • 指令用 .directive.ts
    • 類型用 .model.ts
    • 數據用 .data.ts
  • 用"-"來分割單詞,比如hero-list.component.ts
  • 單元測試文件名保持和測試對象一致,並以.spec.ts結尾
  • 端到端測試文件名保持和測試對象一致,並以.e2e-spec.ts結尾
  • 類名用大寫駝峰規則,並且保持跟文件名的一致
    • 模塊:比如app.module.ts定義的類名為AppModule
    • 路由模塊:比如app-routing.module.ts定義的類名魏AppRoutingModule
    • 組件:比如hero-list.component.ts定義的類名為HeroListComponent
    • 服務:比如logger.service.ts定義的類名為LoggerService
    • 管道:比如address.pipe.ts定義的類名為AddressPipe
    • 指令:比如highlight.directive.ts定義的類名為HighlightDirective
    • 類型:按模塊來劃分,一個.model.ts定義多個類型
    • 數據:比如address-book.data.ts定義的變數名為addressBook
  • 腳本啟動入口的文件名規定為main.ts,裡面不包括任何業務邏輯,但要記得處理失敗的情況

// main.tsimport { platformBrowserDynamic } from @angular/platform-browser-dynamic;import { AppModule } from ./app/app.module;platformBrowserDynamic().bootstrapModule(AppModule) .then(success => console.log(`Bootstrap success`)) .catch(err => console.error(err));

  • 指令選擇器的命名採用小寫駝峰規則,比如clickOutSide
  • 組件選擇器的命名採用分隔符「-」連接小寫字母的形式,比如hero-list

代碼規範

  • 類命名採用大寫駝峰規則
  • 常量定義用const,並且全部大寫,如果有多個單詞,用「_」連接,比如HERO_URL
  • 支持ES6的環境下,禁止使用var定義變數
  • 變數命名盡量控制在3個單詞以內,有常見縮寫形式的單詞可採用縮寫形式
  • 介面類型用大寫駝峰規則,不建議以I為前綴,考慮用類代替介面
  • 屬性和方法名用小寫駝峰,私有屬性和方法不建議以「_」為前綴
  • 建議用空一行的方式來區分第三方庫的導入和項目本身文件的導入

項目結構

  • 好的項目結構的準則就是快速定位,快速識別,儘可能保持扁平,不要寫冗餘/重複代碼
  • 把所有項目代碼放入src文件夾,為每個特性創建文件夾
  • 第三方庫放在src外的一個文件夾
  • 每個組件、服務、管道、指令都獨成一個文件
  • 當組件有多個附屬文件時(htm,css,ts,spec.ts),建議創建一個獨立的文件夾

模塊

  • 在src/app下創建根模塊,建議命名為app.module.ts
  • 為每個特性創建一個模塊,並且保持文件夾命名和模塊命名一致
  • 共享模塊建議用SharedModule命名,放在app/shared/shared.module.ts中
  • 在共享模塊中定義復用的組件、指令和管道,避免在共享模塊中定義服務
  • 在共享模塊中導入所有必需的模塊,比如CommonModule和FormsModule,導出所有復用的模塊、組件、指令、管道
  • 考慮將只用一次的類放在核心特性模塊中,並且僅在根模塊中導入,建議寫guard.ts來保證
  • 核心特性模塊建議用CoreModule命名,放在app/core/core.module.ts中
  • 將單例服務放在核心特性模塊中,比如ExceptionService和LoggerService
  • 在核心特性模塊中導入所有必需的模塊,比如CommonModule和FormsModule,導出所有定義的組件,服務等
  • 將全局僅用一次的組件放在核心特性模塊,然後只在AppModule中導入,比如NavComponent和SpinnerComponent
  • 獨立的特性模塊可以做成懶載入模塊,避免在任何地方導入懶載入模塊,不然模塊就會直接載入

組件

  • 當模板/樣式超過3行時,寫成單獨文件
  • 刪除無樣式定義的樣式文件
  • 模板/樣式的定義與組件命名保持一致
  • 導入時使用相對路徑
  • 用裝飾器@Input和@Output來修改輸入輸出數據,而不是使用元數據中的inputs和outputs屬性
  • 不推薦重命名輸入輸出數據
  • 按照變數,構造器,生命周期函數,一般方法的順序定義;一般方法按頁面的功能模塊放一起,被調用的方法寫在後面;變數和方法均先公有後私有排列;
  • 組件中只寫跟視圖相關的邏輯,把其他的業務邏輯放在服務中
  • 將可復用的業務邏輯放在服務中
  • 不推薦事件命名加上on前綴
  • 將展示邏輯放在組件的類中,而不是在模板中

指令

  • 當有跟模板無關的展示邏輯時,使用屬性指令,比如[highlight]指令
  • 推薦使用@HostListener和@HostBinding,而不是元數據的host屬性

服務

  • 保持單例服務的使用規則,服務用來在特性模塊或者應用中共享數據和方法
  • 跟函數一樣,一個服務只有一個目的
  • 把服務注入在最高層的組件/模塊中,使得該單例服務能在子組件、子模塊中共享
  • 使用@Injectable裝飾服務類,而不是@Inject裝飾參數
  • 跟數據相關的操作,比如xhr請求,本地儲存等抽象成服務

生命周期

  • 需要生命周期鉤子時,實現相關的介面,可有效防止錯誤

輔助工具

  • 用codelyzer來保持代碼遵守該指南,當然你可以根據自己情況調整
  • 使用IDE的代碼片段工具來快速生成具有一致性的代碼片段,比如給VS Code安裝snippets

本文首發知乎,不當之處歡迎指正。


推薦閱讀:

怎樣理解 CSS :after 偽元素的作用?
贊同數超過10k再點贊會變成NaN?
一道Promise經典問題
推薦閱讀-第10期
h5調用底層介面的一些知識

TAG:Angular? | 前端框架 | 前端开发 |