vue+typescript項目中eslint,tslint配置


Tslint配置主要配置文件如下:

// tsconfig.json

{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "strict": true,
    "jsx": "preserve",
    "importHelpers": true,
    "moduleResolution": "node",
    "experimentalDecorators": true,
    "esModuleInterop": true,
    "resolveJsonModule": true,
    "allowSyntheticDefaultImports": true,
    "sourceMap": true,
    "baseUrl": ".",
    "types": [
      "webpack-env",
      "jest"
    ],
    "paths": {
      "@/*": [
        "src/*"
      ]
    },
    "lib": [
      "esnext",
      "dom",
      "dom.iterable",
      "scripthost"
    ]
  },
  "include": [
    "src/**/*.ts",
    "src/**/*.js",
    "src/**/*.tsx",
    "src/**/*.vue",
    "tests/**/*.ts",
    "tests/**/*.tsx"
  ],
  "exclude": [
    "node_modules",
    "src/assets/json/*.json"
  ]
}
// tslint.json

{
  "defaultSeverity": "warning",
  "extends": [
    "tslint:recommended"
  ],
  "linterOptions": {
    "exclude": [
      "node_modules/**",
      "src/assets/json/*.json"
    ]
  },
  "rules": {
    "quotemark": [true, "single"],
    "indent": [true, "spaces", 2],
    "interface-name": false,
    "ordered-imports": false,
    "object-literal-sort-keys": false,
    "no-consecutive-blank-lines": false,
    "semicolon": [true, "never"],
    "member-access": false,
    "no-console": false,
    "max-line-length": [ false ]
  }
}

Eslint配置文件如下:

// .eslintrc.js

// https://repo.advai.net/advgit/atome-fe/docs/-/blob/1667c9156ed5fa16584e510c550b5ec0f95ad627/standard/.eslintrc.js

module.exports = {
  root: true,
  env: {
    browser: true,
    node: true,
    es6: true,
  },
  parser: 'vue-eslint-parser',
  extends: [
    'plugin:vue/recommended',
    'plugin:prettier/recommended',
    'prettier/@typescript-eslint',
    'plugin:@typescript-eslint/recommended',
  ],
  plugins: ['@typescript-eslint'],
  parserOptions: {
    parser: '@typescript-eslint/parser',
  },
  rules: {
    'prettier/prettier': 'error',
    'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
    'array-bracket-spacing': 2,
    'no-var': 2,
    'no-eval': 2,
    'arrow-spacing': 2,
    'block-spacing': 2,
    'key-spacing': 2,
    'brace-style': 2,
    'vue/camelcase': 2,
    'vue/require-component-is': 0,
    'vue/require-default-prop': 0,
    'comma-dangle': [2, 'always-multiline'],
    'vue/eqeqeq': [2, 'always', { null: 'ignore' }],
    'object-curly-spacing': [2, 'always'],
    'vue/singleline-html-element-content-newline': 0,
    'vue/html-closing-bracket-newline': [
      2,
      {
        singleline: 'never',
        multiline: 'always',
      },
    ],
    'vue/max-attributes-per-line': 0,
    'vue/html-self-closing': [
      2,
      {
        html: {
          void: 'always',
          normal: 'never',
          component: 'always',
        },
        svg: 'always',
        math: 'always',
      },
    ],

    // 設置 typescript-eslint 規則
    // https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin/docs/rules
    '@typescript-eslint/camelcase': 0, // 目前埋點有部分字段無法更換
    '@typescript-eslint/no-non-null-assertion': 0, // 允許非空斷言運算符
    '@typescript-eslint/member-delimiter-style': [
      2,
      {
        multiline: {
          delimiter: 'none',
          requireLast: true,
        },
        singleline: {
          delimiter: 'semi',
          requireLast: false,
        },
      },
    ],
    '@typescript-eslint/no-unused-vars': [0, { args: 'none' }], // TODO 后期逐步替換
    '@typescript-eslint/interface-name-prefix': 0,
    '@typescript-eslint/explicit-function-return-type': 0,
    '@typescript-eslint/no-empty-function': 0,
    '@typescript-eslint/no-var-requires': 0,
    '@typescript-eslint/no-use-before-define': 0,
    '@typescript-eslint/no-explicit-any': 0, // TODO
  },
}

 

 

 

 

 

 

 

 

另附參考內容(若侵權請聯系本人刪除)供大家學習參考:

由於我們的項目配置可能不大一樣,有的是 vue-cli 自帶安裝的 ESLint 或者 TSLint,有的項目沒有 Lint 工具。給大家參考下 package.json , 這個是 shopintar app 項目配置后的相關內容。

PS:這里有一個小坑,eslint 版本問題導致的 bug,所以 eslint 限制了版本號在 6.5.1

<!-- package.json 相關配置 --> {  "scripts": {  "format": "prettier --write \"src/**/*.ts\" \"src/**/*.vue\"",  "lint": "eslint --fix --ext .ts,.vue src"  },  "husky": {  "hooks": {  "pre-commit": "lint-staged"  }  },  "lint-staged": {  "src/**/*.{ts,vue}": [  "prettier --write",  "eslint --fix"  ]  },  "devDependencies": {  "@typescript-eslint/eslint-plugin": "^2.21.0",  "@typescript-eslint/parser": "^2.20.0",  "eslint": "^6.5.1",  "eslint-config-prettier": "^6.10.0",  "eslint-plugin-prettier": "^3.1.2",  "eslint-plugin-vue": "^5.2.3",  "husky": "^4.2.3",  "lint-staged": "^10.0.7",  "prettier": "^1.19.1",  "vue-eslint-parser": "^7.0.0",  } }
  • 1、首先刪除 tslint.json 配置文件

  • 2、安裝 eslint 相關依賴

    npm i -D eslint@6.5.1 @typescript-eslint/parser @typescript-eslint/eslint-plugin

    @typescript-eslint/parser: ESLint 專門解析 TypeScript 的解析器
    @typescript-eslint/eslint-plugin: 內置各種解析 TypeScript rules 插件

  • 3、新建 .eslintrc.js 文件

parser: 'vue-eslint-parser', // 解析 .vue 文件 extends: [  'plugin:@typescript-eslint/recommended', ], plugins: ['@typescript-eslint'], parserOptions: {  parser: '@typescript-eslint/parser' // 解析 .ts 文件 },

注意: parser: 'vue-eslint-parser',這里要區分和 parserOptions.parser 的區別,vue-eslint-parser 是解析 .vue 文件,而 parserOptions.parser:@typescript-eslint/parser 是我們自定義來解析 TypeScript 文件的,否則就無法正確的檢驗 TypeScript 相關內容

二、安裝 eslint-plugin-vue

eslint-plugin-vue 插件是用來檢測和規范 Vue 代碼的風格

npm i -D eslint-plugin-vue

然后在 .eslintrc.js 新增配置和相關規則

extends: [  'plugin:vue/recommended', // 這里也可以啟用其他規則,如默認的 vue/essential  'plugin:@typescript-eslint/recommended', ], rules: {  ... }

三、安裝 prettier

prettier 用來做格式化工具配合我們的 ESLint 可以更大的發揮作用,首先安裝相關依賴:

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

eslint-config-prettier: 這個插件的作用是當 ESLint 和 prettier 配置沖突時優先 prettier
eslint-plugin-prettier: 將 prettier 作為 ESLint 規范來使用

extends: [  'plugin:vue/recommended',  'plugin:prettier/recommended',  'prettier/@typescript-eslint', // 優先 prettier 中的樣式規范  'plugin:@typescript-eslint/recommended', ],

接着按需配置 prettier,新建 .prettierrc 文件

{  "singleQuote": true,  "tabWidth": 2,  "useTabs": false,  "semi": false,  "trailingComma": "all",  "printWidth": 120 }

到這里 ESLint 和 prettier 相關配置已經完成,接下來我們利用一些工具幫我們在 git commit 階段完成代碼格式化和校驗工作。

四、使用 husky 和 lint-staged 鈎子完成校驗與格式化

五、Vscode 相關配置

  • 安裝 ESLint, Vertur, Prettier 插件,如果你用 stylus 建議裝一個 Manta's Stylus Supremacy
  • 配置 setting.json
{  "editor.formatOnSave": true,  "editor.codeActionsOnSave": {  "source.fixAll.eslint": true  },  "vetur.format.defaultFormatter.ts": "prettier",  "vetur.format.defaultFormatter.js": "prettier",  "vetur.format.defaultFormatter.less": "prettier",  "vetur.format.defaultFormatter.stylus": "stylus-supremacy",  "vetur.format.defaultFormatter.html": "prettyhtml",  "vetur.format.defaultFormatterOptions": {  "prettyhtml": {  "printWidth": 120  }  },  "eslint.options": {  "extensions": [  ".js",  ".vue",  ".ts",  ".tsx"  ]  },  // 以下為 stylus 配置  "stylusSupremacy.insertColons": false, // 是否插入冒號  "stylusSupremacy.insertSemicolons": false, // 是否插入分好  "stylusSupremacy.insertBraces": false, // 是否插入大括號  "stylusSupremacy.insertNewLineAroundImports": false, // import之后是否換行  "stylusSupremacy.insertNewLineAroundBlocks": false }

setting.json 可以直接復制在本地,也可以在項目中新建一個 .vscode 文件夾,然后在 .gitignore 中把 .vscode 去掉,這樣團隊都可以共享這部分 vscode 配置。

總結

通過以上幾步我們可以在 git commit 之前自動幫我們完成格式化和校驗的工作,但是值得注意的是,這里的格式化和校驗並不是全局的,而是我們當前提交的內容,如果我們想要格式化全局代碼或者校驗全局代碼,這里我們可以在 package.json 中的 script 寫個鈎子需要的時候手動執行一下,而不是把它放在 pre-commit 鈎子上每次 git commit 都執行,耗費時間。

"scripts": {  "format": "prettier --write \"src/**/*.ts\" \"src/**/*.vue\"",  "lint": "eslint --fix --ext .ts,.vue src" }

另外各種插件因為版本問題導致的沖突一般都可以在對應插件的 github issues 中找到答案。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM