Angular代碼風格

寫在前面

自身的良好編碼風格只能律己诫睬,而無法律人蕴纳;我喜歡 Angular 其中主要一個因素是有一整套的工具風格指南爵卒,它可以極大的簡化團隊開發(fā)溝通成本锌仅,但是有些小缺失例如在編碼風格上官方只提供 TypeScript 的部分,對于其他文件并沒有一套指南以及智能化瞎抛。

VSCode 是我開發(fā) Angular 應用的首選艺演,本文也將以此 IDE 為基準;任何提到的擴展都可以通過市場來獲取桐臊。

Angular 應用是由組件樹組成胎撤,一個組件從文件來看包含:TypeScript、HTML豪硅、Less(或其他 CSS 預處理器)哩照,其中 HTML 可能被包含至 ts 文件里。

當然除此之外還包含一些 JSON 文件懒浮、Bash 文件等辟躏,當此部分不在本文討論內。

TSLint

Angular 創(chuàng)建后就已經包含 tslint.json(它是 TSLint 的配置文件)琢锋,并且所有默認規(guī)則都按官方風格指南具體踐行调衰。

而 TSLint 的配置文件,默認使用內置預設 tslint:recommended 版本,并在此基礎上加入 Angular 質量檢查工具 codelyzer,所有這些規(guī)則你可以通過 tslint rulescodelyzer 找到每項規(guī)則的說明赶撰。

規(guī)則的寫法要么是 boolean 類型,或者使用數組對該規(guī)則指定額外參數柱彻。

運行 ng lint 命令時豪娜,當你某個字符串變量使用雙引號,它會提示:

ERROR: /src/app/app.component.ts[9, 16]: " should be '

我們也可以安裝 TSLint 擴展讓這個觸發(fā)機制放在正在編碼過程中實時反饋:

  1. 當有不符合風格指南會出現(xiàn)一個綠色的波浪線哟楷,按 command+. > Fix: " Should be '
  2. 通過終端 PROBLEMS 面板查看所有已打開文件且不符合風格指南的明細

嗯瘤载,讓你按五次 command+. 快捷鍵,我一定會瘋掉卖擅;TSLint 擴展支持在保存文件時自動修復鸣奔,只需要在項目根目錄 .vscode/settings.json 配置:

{
  "editor.codeActionsOnSave": {
    "source.fixAll": true
  }
}

配置

tsline.json 有許多規(guī)則是針對任何 TypeScript,而 codelyzer 是專門針對 Angular惩阶,以下幾個可能你需要認識項:

directive-selector挎狸、component-selector

限定 Direcitve、Component 的 selector 選擇器屬性值的風格断楷,默認必須是 app 開頭锨匆,有時候對于一些共享型組件設置不同的風格,例如一個業(yè)務型富文本框 xx-editor脐嫂,需要在 tslint.json 修改配置:

"directive-selector": [
  true,
  "attribute",
  ["app", "xx"],
  "camelCase"
],
"component-selector": [
  true,
  "element",
  ["app", "xx"],
  "kebab-case"
]

component-class-suffix统刮、directive-class-suffix

指令或組件類名必須是寫駝峰命名法來命名紊遵,且必須使用 Component账千、Directive 后綴;若團隊可能已經習慣類似 View 作為后綴暗膜,則:

"component-class-suffix": [true, "Component", "View"],
"directive-class-suffix": [true, "Directive", "View"]

use-life-cycle-interface

強制實現(xiàn)生命周期鉤子接口匀奏,例如 ngOnInit

export class HeroButtonComponent implements OnInit {
  ngOnInit() {
    console.log('The component is initialized');
  }
}

interface-name

TypeScript 指導原則不建議使用 “I” 前綴;因此建議增加:

"interface-name": [true, "never-prefix"]
// 錯誤寫法
export interface IUser {
  id: number;
}
// 正確寫法
export interface User {
  id: number;
}

美化

TSLint 并不支持美化(雖然有幾個項看起來像是在“美化”)学搜,而美化的工作取決于你采用什么 IDE娃善,例如 VSCode 默認是使用 4 個空格表示一個 Tab 鍵。

EditorConfig

我不建議依賴 IDE 默認的代碼格式配置瑞佩,所以就有一個 .editorconfig 組織來規(guī)范一些簡單的統(tǒng)一規(guī)范配置聚磺。

Angular 項目時也會有 .editorconfig 的配置,雖然有這個配置文件炬丸,但在 VSCode 也有自己的一套規(guī)范并且優(yōu)先級更高瘫寝,所以要想讓 EditorConfig 生效需要額外安裝 EditorConfig for VS Code 插件蜒蕾。

Editorconfig 只包含一些最基礎的項,要想讓代碼統(tǒng)一風格的美化還是需要更強大的 Prettier焕阿。

Prettier

她支持市場上許多語言咪啡,其中包含 TypeScript、HTML暮屡、Less 這一些都符合 Angular 項目的必備撤摸;你需要引入 prettier 以及 VSCode Prettier - Code formatter 擴展。

配置

在根目錄下創(chuàng)建 .prettierrc 配置文件以及 .prettierignore 忽略美化配置文件褒纲;Editorconfig 選項與 Prettier 選項高度重疊准夷,并且后者會強制替換前者,例如:

# .editorconfig
indent_size = 4
# .prettierrc
{
  "tabWidth": 2
}

表示一個 Tab 寬度使用 2 個空格莺掠;我個人建議 Prettier 不應該覆蓋 EditorConfig 的部分冕象,它們包含:tabWidthuseTabs汁蝶、endOfLine渐扮。

而一個簡單的 Prettier 配置差不多這樣:

{
  // 單行最大長度
  "printWidth": 140,
  // 語句末尾添加分號
  "semi": true,
  // 使用單引號而非雙引號
  "singleQuote": true,
  // 尾逗號
  "trailingComma": "all"
}

如果你想忽略一些不想美化的文件,例如 Markdown掖棉,則 . prettierignore

*.md

同樣如果你期望每次保存文件時自動美化代碼墓律,只需要在項目根目錄 .vscode/settings.json 配置:

{
  "editor.formatOnSave": true
}

Prettier 與 TSLint

Prettier 配置 項會有部分與 tslint.json 項重復,例如:Prettier 的 printWidthtsline.jsonmax-line-length幔亥,對于 Prettier 以她為優(yōu)先耻讽,反之使用 ng lint 會以 tslint.json 優(yōu)先。

這對我們來說有些困惑帕棉,TSLint 包含了一些代碼”美化性"(例如:max-line-length)针肥,事實上,這更應該是 Prettier 的專長(所有配置都跟代碼美化相關)香伴。

tslint-config-prettier

好在 tslint-config-prettier 幫助清理這些可能會產生沖突規(guī)則的解決方案:

"extends": [
  "tslint:recommended",
  "tslint-config-prettier"
]

prettier 提供一種檢查機制:

tslint-config-prettier-check ./tslint.json

你會發(fā)現(xiàn)默認的 Angular 項目中會有 max-line-length慰枕、object-literal-key-quotesquotemark 三項是沖突的即纲,我們可以關掉 tsline.json 這三項的配置具帮,讓 Prettier 來代替。

{
  "rules": {
    "max-line-length": [false, 140],
    "object-literal-key-quotes": [false, "as-needed"],
    "quotemark": [false, "single"]
  }
}

HTML

Prettier 默認會自動識別 Angular 項目并使用其引擎低斋,當然也包含對 templatetemplateUrl 兩種寫法蜂厅。

printWidth

會決定一段 HTML 超出長度范圍后屬性會自動換行:

<h1 style="color: #f50;" data-long="long" data-long-long="long" data-long-long-long="long" data-long-long-long-long="long">
  Share Component
</h1>

變成:

<h1
  style="color: #f50;"
  data-long="long"
  data-long-long="long"
  data-long-long-long="long"
  data-long-long-long-long="long"
>
  Share Component
</h1>

htmlWhitespaceSensitivity

空白敏感這一點同 Angular 的 preserveWhitespaces 類似,如果你的 Angular 項目配置了 preserveWhitespaces: false 則無須理會膊畴;反之設定不同的參數會影響美化的效果掘猿,若項目對空白敏感有需求可以設定為 strict 會強制清除空白,例如:

<h1
  style="color: #f50;"
  data-long="long"
  data-long-long="long"
  data-long-long-long="long"
  data-long-long-long-long="long"
  >Share Component</h1
>

Less

不管哪種 CSS 預處理器都可以使用 stylelint 作為代碼檢查工具唇跨,安裝 stylelint稠通、stylelint-config-standard 并在根目錄 .stylelintrc 配置:

{
  "extends": [ "stylelint-config-standard" ],
  "plugins": [ ],
  "rules": { },
  "ignoreFiles": [ "src/assets/**/*" ]
}

package.json 定義一條:

{
  "scripts": {
    "lint:style": "stylelint 'src/**/*.less' --syntax less"
  }
}

若缺少 ; 會被收到 Missed semicolon 錯誤:

:host {
  width: 100px;
  height: 100px
  display: block;
}
src/app/app.component.less
 3:11  ?  Missed semicolon   CssSyntaxError

stylelint 有自己的一套規(guī)則礁遵,而 stylelint-config-standard 只是官方提供一種默認規(guī)則

Prettier

前面提到 Prettier 也支持 Less采记,需要額外安裝依賴包 prettier-stylelint 佣耐,并修改 .stylelintrc 配置:

{
  "extends": [
    "stylelint-config-standard",
    "stylelint-config-prettier"
  ],
  "plugins": [ ],
  "rules": {
    "selector-type-no-unknown": [
      true,
      {
        "ignoreTypes": [
          "/^app-/"
        ]
      }
    ],
    "selector-pseudo-element-no-unknown": [
      true,
      {
        "ignorePseudoElements": [
          "ng-deep"
        ]
      }
    ]
  },
  "ignoreFiles": [ "src/assets/**/*" ]
}

但是依然無法生效,由于在 VSCode 下面 EditorConfig for VS Code 擴展默認并沒有開啟它唧龄,在 .vscode/settings.json 增加:

{
  "prettier.stylelintIntegration": true
}

加上之前已經開啟保存時自動修復功能兼砖,同樣也適用 Less 即保存時根據 .stylelintrc 配置修復及美化。

一些有趣的插件

stylelint-config-rational-order

Css 語言同一類型的相關屬性可能會很多既棺,而將這些相關屬性進行分組對于維護非常有幫助讽挟,安裝 stylelint-orderstylelint-config-rational-order丸冕,并修改 .stylelintrc 配置:

{
  "extends": [
    "stylelint-config-standard",
    "stylelint-config-rational-order",
    "stylelint-config-prettier"
  ],
  "plugins": [
    "stylelint-order"
  ],
  "rules": { },
  "ignoreFiles": [ "src/assets/**/*" ]
}

stylelint-declaration-block-no-ignored-properties

當設置 display: inline 內聯(lián)時耽梅,此時再寫 width: 100px 是無意義的,而該組件可以自動移除這種無效屬性胖烛。

{
  "plugins": [
    "stylelint-declaration-block-no-ignored-properties"
  ],
  "rules": {
    "plugin/declaration-block-no-ignored-properties": true,
  }
}

智能點

至此眼姐,涉及 Angular 所需要的代碼風格運用已全部完結,這些檢查我們都大多數是依靠 VSCode 編輯器的擴展輔助完成佩番。

事實上众旗,我們只需要增加幾個命令來對整個項目進行檢查,確保整個項目的代碼能按所配置的風格執(zhí)行趟畏。

命令行

{
  "scripts": {
    "lint": "npm run lint:ts && npm run lint:style",
    "lint:ts": "tslint -p tsconfig.app.json -c tslint.json 'src/**/*.ts' --fix",
    "lint:style": "stylelint 'src/**/*.less' --syntax less --fix"
  }
}

tslint贡歧、stylelint 命令行對應的參數說明,都可以通過上述提供官網找得到赋秀。

運行 npm run lint 可以對整個項目進行檢查及修復利朵;若有包含 CI 可以直接使用它。

Git

如果可以將這一過程在向源碼倉庫提交代碼時進行檢查的話猎莲,可以在向代碼倉儲提交前就發(fā)現(xiàn)問題绍弟,需要安裝 huskylint-staged益眉,并且修改 package.json

{
  "lint-staged": {
    "src/**/*.ts": [
      "npm run lint:ts",
      "git add"
    ],
    "src/**/*.less": [
      "npm run lint:style",
      "git add"
    ]
  },
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  }
}

當向源碼倉庫 Commit 時會自動先執(zhí)行命令行才會 git add晌柬。

總結

當我寫完最后一節(jié)時姥份,Angular8 發(fā)布了正式版郭脂;所以我把原本準備的樣板項目 ng-code-style-boilerplatef526a0c) 切換成 Angular8,但完全適用 Angular7.x 版本澈歉。

Angular 風格指南中文版)對于喜愛 Angular 是必讀展鸡、常讀的文章,它指引團隊更友好的編寫代碼埃难,個人良好編碼風格可能律己莹弊,但無法律人涤久,而這種風格指南可以減少無差別的團隊溝通。

本文雖然以 Angular 的角度出發(fā)忍弛,但大部分內容同樣適用 React响迂、Vue 等。

(完)

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末细疚,一起剝皮案震驚了整個濱河市蔗彤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疯兼,老刑警劉巖然遏,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吧彪,居然都是意外死亡待侵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門姨裸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秧倾,“玉大人,你說我怎么就攤上這事傀缩≈锌瘢” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵扑毡,是天一觀的道長胃榕。 經常有香客問我,道長瞄摊,這世上最難降的妖魔是什么勋又? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮换帜,結果婚禮上楔壤,老公的妹妹穿的比我還像新娘。我一直安慰自己惯驼,他們只是感情好蹲嚣,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著祟牲,像睡著了一般隙畜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上说贝,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天议惰,我揣著相機與錄音,去河邊找鬼乡恕。 笑死言询,一個胖子當著我的面吹牛俯萎,可吹牛的內容都是我干的。 我是一名探鬼主播运杭,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼夫啊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辆憔?” 一聲冷哼從身側響起涮母,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎躁愿,沒想到半個月后叛本,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡彤钟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年来候,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逸雹。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡营搅,死狀恐怖,靈堂內的尸體忽然破棺而出梆砸,到底是詐尸還是另有隱情转质,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布帖世,位于F島的核電站休蟹,受9級特大地震影響,放射性物質發(fā)生泄漏日矫。R本人自食惡果不足惜赂弓,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哪轿。 院中可真熱鬧盈魁,春花似錦、人聲如沸窃诉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽飘痛。三九已至珊膜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間敦冬,已是汗流浹背辅搬。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留脖旱,地道東北人堪遂。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像萌庆,于是被迫代替她去往敵國和親溶褪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容