前端工程化最佳實踐

前端無憂發表於2021-07-03

一、程式碼格式化規範

目前專案中使用的 vetur 外掛內建有 prettier 格式化,也可以安裝 prettier code formatter 外掛,eslint 也包含部分程式碼風格檢查的功能,eslint 和 prettier 本身就有部分規則是衝突的,導致格式化混亂,所以必須統一程式碼格式化規範

1、vscode 中的配置優先順序

  • 預設配置檔案(優先順序最低)
  • 使用者配置檔案(優先順序次之)
  • 工程配置檔案 (優先順序最高)

為了統一大家的程式碼風格,統一使用專案中的配置檔案作為配置項。由於 ESLint 的主要功能是程式碼質量檢查,Prettier 的主要功能是程式碼風格檢查,所以不要在 ESLint 中去配置程式碼風格相關的規則。

  • prettier。 一個很流行的程式碼格式化工具,你很容易在編輯器找到實現它的各種外掛,這裡用它在程式碼提交前做程式碼格式化。
  • eslint。 程式碼檢查工具。eslint 也可以負責一部分程式碼格式檢查的工作,但是 prettier 已經做的很好了,所以我便沒用 eslint 的程式碼格式檢查,只讓其負責程式碼錯誤檢查。

2、解決配置衝突

npm i eslint-config-prettier  eslint-plugin-prettier -D

eslint-config-prettier 關閉 Eslint 中與 Prettier 衝突的選項,eslint-plugin-prettier 將 prettier 的規則設定為 eslint 的規則,對不符合規則的進行提示

3、prettierrc 配置檔案說明

//.prettierrc.js
module.exports = {
    printWidth: 160, //編輯器每行的長度,預設80
    tabWidth: 4, //製表符tab的寬度,預設值是2
    useTabs: false, //程式碼縮排是否用製表符tab,預設false
    semi: true, //是否使用分號,預設true,使用分號
    singleQuote: true, //是否使用單引號,預設為false
    quoteProps: 'as-needed', //物件屬性的引號使用 as-needed 僅在需要的時候使用 consistent 有一個屬性需要引號,就都需要引號 preserve 保留使用者輸入的情況
    jsxSingleQuote: false,
    trailingComma: 'none', //末尾逗號 none 末尾沒有逗號 es5 es5有效的地方保留 all 在可能的地方都加上逗號
    bracketSpacing: true, //字面量物件括號中的空格,預設true true - Example: { foo: bar }.  false - Example: {foo: bar}.
    jsxBracketSameLine: false,
    arrowParens: 'avoid', //箭頭函式中的括號always avoid
    htmlWhitespaceSensitivity: 'ignore',
    vueIndentScriptAndStyle: false,//是否給vue中的 <script> and <style>標籤加縮排
    endOfLine: 'auto', //行末尾標識
    eslintIntegration: true, //不讓prettier使用eslint的程式碼格式進行校驗
}

4、eslint 配置檔案說明

//.eslintrc.js
module.exports = {
    root: true,
    env: {
        node: true
    },
    'extends': [
        'plugin:vue/essential',
        "plugin:prettier/recommended",
        // '@vue/standard'
    ],
    rules: {
        'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
        'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
        // 'vue/script-indent': ['error', 4, { 'baseIndent': 1 }],
        // "quotes": [2, "single", { "avoidEscape": true }],
        // 使用prettier來替換eslint的規則
        "prettier/prettier": "error",
        "no-var": 2,//禁用var,用let和const代替
        "no-unused-vars": [2, { "args": "none" }],  //消除未使用的變數  不檢查函式的引數
        "no-redeclare": 2, //禁止多次宣告同一變數
        "no-dupe-keys": 2,//在建立物件字面量時不允許鍵重複
        'eqeqeq': ['error', 'always', { null: 'ignore' }], // 強制使用全等
    },
    parserOptions: {
        parser: 'babel-eslint',
        "ecmaVersion": 6,
        "sourceType": "module"
    }
}

三、程式碼提交規範

1、安裝 husky 和 lint-stage

//husky新版本配置方法完全不一樣,這裡鎖定版本號
npm i husky@4.2.5 lint-stage -D

Husky 能夠阻止不規範的程式碼提交和推送,確保本地的程式碼已經通過檢查才能 push 到遠端。

lint-stage 的作用是隻對當前修改後的檔案進行掃描,即進行 git add 加入到 stage 區的檔案進行掃描即可,完成對增量程式碼進行檢查

2、配置 commitlint 提交規則

npm i @commitlint/cli @commitlint/config-conventional -D
//commitlint.config.js
// https://commitlint.js.org/#/
module.exports = {
    extends: [
        "@commitlint/config-conventional"
    ],
    rules: {
        // 'name:[level, 'always', 72]',level可選0, 1, 2,0為disable,1為warning,2為error,第二位為應用與否,可選always| never,第三位該rule的值
        // update: 更新某功能(不是feat, 不是fix)
        // feat: 新增功能(feature)
        // fix: bug 修復
        // style: 樣式調整
        // merge:分支合併
        // revert:回滾某個更早之前的提交

        // build:主要目的是修改專案構建系統(例如 glup,webpack,rollup 的配置等)的提交
        // ci:主要目的是修改專案繼續整合流程(例如 Travis,Jenkins,GitLab CI,Circle等)的提交
        // docs:文件更新
        // perf:效能, 體驗優化
        // refactor:重構程式碼(既沒有新增功能,也沒有修復 bug)
        // test:新增測試用例或是更新現有測試
        // chore:不屬於以上型別的其他型別
        'type-enum': [2, 'always', ['update', 'feat', 'fix', 'style', 'merge', 'revert', 'build', 'ci', 'docs', 'perf', 'refactor', 'test', 'chore']],
        'type-case': [0], //type小寫
        'type-empty': [0], //type不為為空
        'scope-empty': [0],
        'scope-case': [0],
        'subject-full-stop': [0, 'never'],
        'subject-case': [0, 'never'],
        'header-max-length': [0, 'always', 72]
    }
};

3、配置 package.json 檔案

{
  "name": "name",
  "version": "0.1.0",
  "description": "description",
  "author": "author",
  "private": true,
  "scripts": {
    "dev": "vue-cli-service serve",
    "build": "vue-cli-service build"
  },
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged",
      "commit-msg": "commitlint -e $HUSKY_GIT_PARAMS"
    }
  },
  "lint-staged": {
    "src/**/*.{js,jsx,vue,json,css,less,scss,sass}": [
      "prettier --write",
      "eslint --fix",
      "git add"
    ]
  },
  "dependencies": {
    "axios": "^0.19.0",
    "core-js": "^2.6.5",
    "element-ui": "^2.12.0",
    "md5": "^2.2.1",
    "vue": "^2.6.10",
    "vue-router": "^3.0.3",
    "vuex": "^3.0.1"
  },
  "devDependencies": {
    "@babel/plugin-syntax-dynamic-import": "^7.2.0",
    "@commitlint/cli": "^12.1.4",
    "@commitlint/config-conventional": "^12.1.4",
    "@vue/cli-plugin-babel": "^3.5.0",
    "@vue/cli-plugin-eslint": "^3.5.0",
    "@vue/cli-plugin-unit-mocha": "^3.5.0",
    "@vue/cli-service": "^3.5.3",
    "@vue/eslint-config-standard": "^4.0.0",
    "@vue/test-utils": "1.0.0-beta.29",
    "babel-eslint": "^10.0.1",
    "babel-plugin-component": "^1.1.1",
    "babel-plugin-syntax-dynamic-import": "^6.18.0",
    "compression-webpack-plugin": "^2.0.0",
    "eslint": "^5.8.0",
    "eslint-config-prettier": "^8.3.0",
    "eslint-plugin-prettier": "^3.4.0",
    "eslint-plugin-vue": "^5.0.0",
    "husky": "^4.2.5",
    "lint-staged": "^11.0.0",
    "node-sass": "^4.9.0",
    "sass-loader": "^7.1.0",
    "uglifyjs-webpack-plugin": "^2.1.2",
    "vue-template-compiler": "^2.5.21"
  }
}


4、提交程式碼

husky 會在你提交前,呼叫 pre-commit 鉤子,執行 lint-staged,如果程式碼不符合 prettier 配置的規則,會進行格式化;然後再用 eslint 的規則進行檢查,如果有不符合規則且無法自動修復的,就會停止此次提交。如果都通過了就會講程式碼新增到 stage,然後 commit。

git add .
git commit -m "feat: commit內容"
git push

相關文章