eslint prettier husky lint-staged typescript eslint-config-alloy
爲構建項目代碼質量保駕護航一、新建一個文件夾,打開命令行,npm init -y
建立package.json
二、安裝依賴npm install --save-dev eslint babel-eslint eslint-config-alloy
三、在項目根目錄下建立一個.eslintrc.js
或 .eslintrc.json
的配置文件:javascript
// .eslintrc.js module.exports = { extends: [ 'alloy', ], };
四、在項目根目錄下建立一個index.js
,複製下面內容:css
var myName = 'Tom'; console.log(`My name is ${myNane}`);
五、在命令行輸入npx eslint index.js
html
// eslint 報錯信息: ✖ 2 problems (2 errors, 0 warnings) error Unexpected var, use let or const instead no-var error 'myNane' is not defined no-undef
六、使用npx eslint index.js --fix
自動修復某些規則前端
// 這時 var 變成了 let // 還剩下一個沒法自動修復的錯誤 ✖ 1 problem (1 error, 0 warnings) error 'myNane' is not defined no-undef
一、因爲 ESLint 默認使用 Espree 進行語法解析,沒法識別 TypeScript 的一些語法,故咱們須要安裝 @typescript-eslint/parser,替代掉默認的解析器,別忘了同時安裝 typescript:vue
npm install --save-dev typescript @typescript-eslint/parser
二、接下來須要安裝對應的插件 @typescript-eslint/eslint-plugin 它做爲 eslint 默認規則的補充,提供了一些額外的適用於 ts 語法的規則。java
npm install --save-dev @typescript-eslint/eslint-plugin
三、修改配置文件node
module.exports = { extends: [ 'alloy', ], parser: '@typescript-eslint/parser', plugins: ['@typescript-eslint'], rules: { // 禁止使用 var 'no-var': "error", // 優先使用 interface 而不是 type '@typescript-eslint/consistent-type-definitions': [ "error", "interface" ] } }
no-var
是 ESLint 原生的規則(咱們剛剛已經用到了這個規則,它被包含在alloy
中,此處會覆蓋),@typescript-eslint/consistent-type-definitions 是 @typescript-eslint/eslint-plugin 新增的規則關閉、警告和報錯的含義以下:
四、新建index.ts
文件:react
var myName = 'Tom'; console.log(`My name is ${myNane}`); console.log(`My name is ${myName.toStrng()}`); type Foo = {};
五、在命令行輸入npx eslint index.ts
,以下能夠看到報錯信息以及可修復項jquery
1:1 error Unexpected var, use let or const instead no-var 2:27 error 'myNane' is not defined no-undef 4:6 error Use an `interface` instead of a `type` @typescript-eslint/consistent-type-definitions ✖ 3 problems (3 errors, 0 warnings) 2 errors and 0 warnings potentially fixable with the `--fix` option.
一、根目錄新建一個src文件夾,將咱們的index.js
和index.ts
放進去
二、在package.json
中的scripts
新增:git
{ "scripts": { // 由於eslint不是全局安裝的,因此要使用npx "eslint": "npx eslint src --ext .js,.ts,tsx" // eslint 默認不會檢查 .ts 後綴的文件,因此須要加上參數 --ext .ts } }
三、而後npm run lint
就能夠看到src下全部指定後綴文件的報錯信息
ESLint
的配置過程AlloyTeam
實現可自定義拓展的ESLint
規則一、安裝技術棧相關依賴
// Eslint npm install --save-dev eslint babel-eslint eslint-config-alloy // React npm install --save-dev eslint babel-eslint eslint-plugin-react eslint-config-alloy // Vue npm install --save-dev eslint babel-eslint vue-eslint-parser eslint-plugin-vue eslint-config-alloy // TypeScript npm install --save-dev eslint typescript @typescript-eslint/parser @typescript-eslint/eslint-plugin eslint-config-alloy // TypeScript React npm install --save-dev eslint typescript @typescript-eslint/parser @typescript-eslint/eslint-plugin eslint-plugin-react eslint-config-alloy
二、配置.eslintrc.js
文件
/* .eslintrc.js */ module.exports = { extends: [ 'alloy', // 都須要 'alloy/vue', //vue項目須要 'alloy/react', //react項目須要 'alloy/typescript', //ts項目須要 ], env: { // 你的環境變量(包含多個預約義的全局變量) // // browser: true, // node: true, // mocha: true, // jest: true, // jquery: true }, globals: { // 你的全局變量(設置爲 false 表示它不容許被從新賦值) // // myGlobal: false }, rules: { // 自定義你的規則 } };
三、接下來就能夠直接用eslint
命令檢查文件了
四、這樣就引入了alloy團隊的lint規則了,而後能夠用rules覆蓋你不爽的規則,直接採用開源規則是爲了不重複造輪子,你也能夠選擇別的團隊,或者本身定義一套
在編輯器中集成 ESLint 檢查,能夠在開發過程當中就發現錯誤,甚至能夠在保存時自動修復錯誤,極大的增長了開發效率
一、先安裝 ESLint 插件,打開 VSCode 點擊「擴展」按鈕,搜索 ESLint,而後安裝便可
二、在「文件 => 首選項 => 設置 => 工做區」中(也能夠在項目根目錄下建立一個配置文件 .vscode/settings.json
),添加如下配置:
{ // VSCode 中的 ESLint 插件默認是不會檢查 `.vue`、`.ts` 或 `.tsx` 後綴的 "eslint.validate": [ "javascript", "javascriptreact", "vue", "typescript", "typescriptreact" ], // 開啓保存時自動修復 "editor.codeActionsOnSave": { "source.fixAll.eslint": true }, // 指定VSCode用於IntelliSense(智能感知)的ts版本,將內置版本更換爲工做區版本 "typescript.tsdk": "node_modules/typescript/lib" }
Prettier 是一個代碼格式化工具,相比於 ESLint 中的代碼格式規則,它提供了更少的選項,可是卻更加專業。
AlloyTeam 推薦用 Prettier 管理格式化相關的規則,用 ESLint 來檢查它更擅長的邏輯錯誤。
一、安裝 Prettier
npm install --save-dev prettier
二、配置 .prettierrc.js
僅供參考:
// .prettierrc.js module.exports = { // 一行最多 100 字符 printWidth: 100, // 使用 4 個空格縮進 tabWidth: 4, // 不使用縮進符,而使用空格 useTabs: false, // 行尾須要有分號 semi: true, // 使用單引號 singleQuote: true, // 對象的 key 僅在必要時用引號 quoteProps: 'as-needed', // jsx 不使用單引號,而使用雙引號 jsxSingleQuote: false, // 末尾不須要逗號 trailingComma: 'none', // 大括號內的首尾須要空格 bracketSpacing: true, // jsx 標籤的反尖括號須要換行 jsxBracketSameLine: false, // 箭頭函數,只有一個參數的時候,也須要括號 arrowParens: 'always', // 每一個文件格式化的範圍是文件的所有內容 rangeStart: 0, rangeEnd: Infinity, // 不須要寫文件開頭的 @prettier requirePragma: false, // 不須要自動在文件開頭插入 @prettier insertPragma: false, // 使用默認的折行標準 proseWrap: 'preserve', // 根據顯示樣式決定 html 要不要折行 htmlWhitespaceSensitivity: 'css', // 換行符使用 lf endOfLine: 'lf' };
一、在.vscode/settings.json
中添加配置:
{ // 保存時自動格式化全部支持文件 javascript/javascriptreact/typescript/typescriptreact/json/graphql "editor.formatOnSave": true, "editor.defaultFormatter": "esbenp.prettier-vscode", }
二、這時咱們保存文件的時候,已經能夠自動格式化了
三、也能夠指定格式化文件類型:
{ // Set the default "editor.formatOnSave": false, // Enable per-language "[javascript]": { "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true } }
ESLint、Prettier
集成了VSCode插件,實現了錯誤提示和保存自動修復git hook
就是.git文件夾的hooks下的一些鉤子函數,特定時機他們將被調用cd .git/hooks ls -l // 打印以下: total 96 -rwxr-xr-x 1 zzc staff 478 10 21 2019 applypatch-msg.sample -rwxr-xr-x 1 zzc staff 896 10 21 2019 commit-msg.sample -rwxr-xr-x 1 zzc staff 3327 10 21 2019 fsmonitor-watchman.sample -rwxr-xr-x 1 zzc staff 189 10 21 2019 post-update.sample -rwxr-xr-x 1 zzc staff 424 10 21 2019 pre-applypatch.sample -rwxr-xr-x 1 zzc staff 1638 10 21 2019 pre-commit.sample -rwxr-xr-x 1 zzc staff 1348 10 21 2019 pre-push.sample -rwxr-xr-x 1 zzc staff 4898 10 21 2019 pre-rebase.sample -rwxr-xr-x 1 zzc staff 544 10 21 2019 pre-receive.sample -rwxr-xr-x 1 zzc staff 1492 10 21 2019 prepare-commit-msg.sample -rwxr-xr-x 1 zzc staff 3610 10 21 2019 update.sample
.sample
爲各個鉤子的案例腳本,能夠把sample去掉,直接編寫shell腳原本執行。Requires Node >= 10 and Git >= 2.13.0.
husky
新老版本的配置方式和使用變化較大,老版本請自行升級,詳見 husky 一、安裝 husky
npm install husky --save-dev
二、編輯 package.json
文件:
{ "husky": { "hooks": { "pre-commit": "eslint src/**/*.js" } }, }
三、嘗試 git commit
提交,就會先執行eslint src/**/*.js
,代碼沒有問題纔會被真正提交
四、這樣每次提交代碼,eslint
都會檢查全部文件,若是報錯過多,必定會崩潰
lint-staged requires Node.js version 10.13.0 or later.
一、安裝 lint-staged
npm install lint-staged --save-dev
二、新增 package.json
配置:
{ "lint-staged": { "src/**/*.js": "eslint" } }
三、如此husky
只負責註冊git hook
,後續操做交給lint-staged
,只對改動的文件執行任務,並且能夠很方便
地配置多條命令:
{ "husky": { "hooks": { "pre-commit": "lint-staged" } }, "lint-staged": { "src/**/*.js": ["eslint --fix", "prettier --write"] } }
四、如上,咱們提交代碼以前,程序會自動修復eslint
配置,格式化prettier
配置
eslint、prettier
配置,並且大部分還須要手動修復才行git commit -m -n "跳過代碼代碼預檢"
跳過檢查,慎用--save-dev
安裝在項目內部husky lint-staged
配置都放在package.json
中,如今eslint prettier husky lint-staged
都支持多種後綴配置文件,建議採用.js
統一格式,也方便拓展:// .eslintrc.js module.exports = { extends: [ 'alloy', ], }; // .prettierrc.js module.exports = { // 一行最多 100 字符 printWidth: 100, // 使用 4 個空格縮進 tabWidth: 4, // ... }; // .huskyrc.js module.exports = { 'hooks': { 'pre-commit': "lint-staged" } } // .lintstagedrc.js module.exports = { "src/**/*.{js,ts}": "eslint" }
.huskyrc.js
// 數組方式配置多條命令 const tasks = arr => arr.join(' && ') module.exports = { 'hooks': { 'pre-commit': tasks([ 'npm run lint', 'npm test' ]) } }
.lintstagedrc.js
module.exports = { // 若是超過10個暫存文件,則在整個存儲庫上運行eslint '**/*.js?(x)': (filenames) => filenames.length > 10 ? 'eslint .' : `eslint ${filenames.join(' ')}`, "*.css": "stylelint", "*.scss": "stylelint --syntax=scss", // 對ts文件運行tsc,但不傳遞任何參數 '**/*.ts?(x)': () => 'tsc -p tsconfig.json --noEmit' }