uniapp配置eslint + prettier +editorconfig + lint-staged

目标:给新建的uniapp项目增加语法规范和保存自动格式化代码,有不对的欢迎指正

2020-11-4日新增

今日看到各种黄色波浪线都来自一个eslint-plugin-vue这个插件,只用eslint + eslint-plugin-vue这两个插件就足够用了,简单明了三步走

1.第一步

npm i eslint  eslint-plugin-vue -D
npm i babel-eslint eslint-plugin-node -D // 这两个在配置中可用可不用

2.第二步: 新建.eslintrc.js 文件,极简配置即可。

新建的.eslintrc.js 文件中
module.exports = {
  extends: [
    'plugin:vue/recommended',
    'eslint:recommended'
  ],
  globals: { uni: true, wx: true },
  rules: {
    "no-mixed-spaces-and-tabs": ["error", "smart-tabs"]
// 还有很多js规则去github上找项目vue-element-admin上搞一份
  },
  env: {
    es6: true,
    browser: true,
    node: true
  },
  parserOptions: {
    parser: 'babel-eslint'
  }
}

或者可以直接放在packag.json中都行,参考脚手架生成的vue项目

packag.json 文件中
 "eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": [
       'plugin:vue/recommended',
    'eslint:recommended'
    ],
    "parserOptions": {
      "parser": "babel-eslint"
    },
    "rules": {}
  },

3.第三步:.vscode文件settings.json用下面的配置即可

{
  // "vetur.validation.template": false, // 把 vetur 扩展的 template 格式化去掉
  "editor.formatOnSave": false,
  "eslint.enable": true, // eslint 格式化的配置
  "eslint.run": "onType",
  "editor.tabSize": 2,
  "editor.autoClosingQuotes": "always",
  "javascript.preferences.quoteStyle": "single",
  "workbench.iconTheme": "vscode-icons",
  "editor.codeActionsOnSave": {
    // For ESLint
    "source.fixAll.eslint": true,
    // For TSLint
    "source.fixAll.tslint": true,
    // For Stylelint
    "source.fixAll.stylelint": true
  },
  "eslint.options": {
    "extensions": [".js", ".vue"]
  }
}

以下内容选择性浏览

2020-11-1新建

问:为什么是eslint + prettier
答: 这两者都有规范代码的作用,ESLint 主要解决的是代码质量问题,例如使用cost或者let替代var;Prettier 认为格式很重要,比如规定用单引号和或双引号。想要双剑合璧,去掉两者使用中的冲突,使用起来就完美了

问:editorconfig, lint-staged是什么
答:1. 不同的编辑器和系统在编码上一些操作会有不同,比如:缩进是tab还是space,结尾end_of_line是lf还是crlf(editorconfig的能力 —— 用于覆盖编辑器的默认配置)

  1. lint-staged 用于对 Git 暂存区中的文件执行代码检测,结合husky 用到 pre-commit这个 hook,在执行 commit 之前,可以运行一些自定义操作

1.在插件市场安装要用到的插件,注意:再加个vetur 如下图

企业微信截图_16042994154716.png

2.新建下图中需要用到的文件

[图片上传中...(企业微信截图_16042994154716.png-992558-1604299420862-0)]

editorconfig 大致配置,不建议深究,能用就行

# http://editorconfig.org
root = true

[*]
indent_style = space
indent_size = 2
end_of_line = crlf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

[*.md]
trim_trailing_whitespace = false

[Makefile]
indent_style = tab

# editorconfig-tools is unable to ignore longs strings or urls
max_line_length = null

问: 怎么生成.vscode文件
答:编辑器左下角设置按钮,随便改个设置就会在项目生成该文件夹

3. 下载要用到的包

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

eslint-config-prettier :关掉 (disable) 所有和 Prettier 冲突的 ESLint 的配置
eslint-plugin-prettier : 把 Prettier 推荐的格式问题的配置以 ESLint rules 的方式写入,这样相当于可以统一代码问题的来源

问:怎么关掉冲突呢
答:在 .eslintrc.js 里面将 prettier 设为最后一个 extends

// .eslintrc    
{      
    "extends": ["eslint:recommended", "prettier"] // prettier 一定要是最后一个,才能确保覆盖   eslint:recommended 的规则 
}

问:怎么导入eslint-plugin-prettier

// .eslintrc    
{      
    "plugins": ["prettier"],      
    "rules": {        
        "prettier/prettier": "error"      
    }    
}

以上两者可以简写为

// .eslintrc    
{      
    "extends": ["eslint:recommended", "plugin:prettier/recommended"] // 这个plugin也放在extends数组最后才能覆盖
}

4. vue文件检测并设置保存就自动格式化代码

npm i eslint-plugin-vue eslint-plugin-prettier-vue  -D
// .eslintrc    
// eslint-plugin-vue现在已经废弃,改为eslint-plugin-vue-libs,有兴趣的朋友可以尝试
{      
    "extends": ["plugin:vue/essential"] 
}
// .vscode文件夹 的setting.json文件
{
"vetur.validation.template": false ,   // 把 vetur 扩展的 template 格式化去掉
"editor.formatOnSave": false,        
// 去掉 vscode 自带的自动保存 ,vscode 默认也是 false的,如果要用 eslint 格式化,默认的格式化就不能开启
//不关闭会和plugin:vue/recommended的规则相冲突
"eslint.enable": true,              // eslint 格式化的配置
"eslint.run": "onType",
  "editor.tabSize": 2,
  "editor.autoClosingQuotes": "always",
  "javascript.preferences.quoteStyle": "single",
  "workbench.iconTheme": "vscode-icons",
  // eslint自动格式化代码详细配置说明:https://www.worldlink.com.cn/en/osdir/vscode-eslint.html
  "editor.codeActionsOnSave": {
    // For ESLint
    "source.fixAll.eslint": true,
    // For TSLint
    "source.fixAll.tslint": true,
    // For Stylelint
    "source.fixAll.stylelint": true
  },
// 以下是旧写法,不必理会
 // "eslint.validate": [
 //   "javascript", // 用eslint的规则检测js文件
//    {
//      "language": "js",
//      "autoFix": true
//    },
//    {
//      "language": "vue",
//      "autoFix": true
//    }
  ],
  "eslint.options": {
    "extensions": [".js", ".vue"]
  }
}

5.代码提交前校验

npm i husky lint-staged  -D
// package.json文件中增加
"lint-staged": {
    "**/**.{js,json,pcss,md,vue}": [
      "prettier --write",
      "eslint",
      "git add"
    ]
  },
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  }

最后:下面是eslintrc.js配置全文,另外有一些插件需要下载,可以根据自己的需要或者eslint报错提示进行安装

npm i babel-eslint eslint-plugin-import eslint-plugin-node eslint-plugin-promise  "eslint-plugin-html -D

下图可以看到项目中eslint或其他插件运行的情况,有报错根据提示解决即可


企业微信截图_16043040494958.png

至于相关配置可以参考:点我https://my.oschina.net/lsjcoder/blog/1611755
如果项目crl + s保存后还有一些波浪号,没关系。鼠标放上去看提示的什么,点击进入到具体的规则去配置即可,如下图

企业微信截图_16043850131799.png

直接看代码备注了解,选择需要下载的插件下载即可

//eslintrc.js文件内容
/** 
 * rules
 * https://eslint.org/docs/rules/
 * https://github.com/benmosher/eslint-plugin-import
 */
module.exports = {
  extends: [
    'plugin:vue/essential',
    // "plugin:vue/essential" 仅包含Base Rules和Priority A:Essential,这里用前两种,少些规则html上仅有:src 和@tap不用换行
    // "plugin:vue/recommended" 包含Base Rules、Priority A:Essential、Priority B: Strongly Recommended、Priority C: Recommended
    'eslint:recommended',
    'plugin:prettier/recommended' // 放在最后面,用prettier的代码规范
  ],
  globals: { uni: true, wx: true }, //全局变量要在这里添加,避免出现提示
  plugins: [ 'import'], // eslint-plugin-import需要下载,因为下面rules需要用到该插件所以在这里导入
  env: {
    es6: true,
    browser: true,
    node: true    // eslint-plugin-node这个插件要安装
  },
  /**
   * "off"    0
   * "warn"   1
   * "error"  2
   */
  rules: {
    curly: [2, 'all'], // 必须使用 if(){} 中的{}

    'space-before-function-paren': [0],
    eqeqeq: [0],
    'vars-on-top': [2],
    'no-var': [2],
    'object-property-newline': [
      'error',
      { allowMultiplePropertiesPerLine: true }
    ],  // Map要么多行。要么单行
    'object-shorthand': [
      'error',
      'always',
      {
        ignoreConstructors: false,
        avoidQuotes: true
      }
    ],
    'padding-line-between-statements': [
      'error',
      { blankLine: 'always', prev: ['const', 'let', 'var'], next: '*' },
      {
        blankLine: 'any',
        prev: ['const', 'let', 'var'],
        next: ['const', 'let', 'var']
      },
      {
        blankLine: 'always',
        prev: ['import', 'cjs-import'],
        next: 'expression'
      },
      { blankLine: 'always', prev: '*', next: 'block-like' },
      { blankLine: 'always', prev: 'block-like', next: '*' },
      { blankLine: 'always', prev: '*', next: 'return' }
    ],
    'prefer-destructuring': [
      'warn',
      {
        VariableDeclarator: {
          array: false,
          object: true
        },
        AssignmentExpression: {
          array: false,
          object: true
        }
      },
      {
        enforceForRenamedProperties: false
      }
    ],
    'prefer-rest-params': 'error',
    'prefer-spread': 'error',
    'prefer-template': 'error',
    'prefer-arrow-callback': [
      'error',
      {
        allowNamedFunctions: false,
        allowUnboundThis: true
      }
    ],
    'no-use-before-define': [
      'error',
      {
        classes: true,
        functions: false,
        variables: true
      }
    ],
    'no-unused-expressions': [
      'error',
      {
        allowShortCircuit: true,
        allowTernary: true
      }
    ]
  },
  parserOptions: {
    parser: 'babel-eslint',   // babel-eslint这个插件要安装
    ecmaVersion: 7,
    sourceType: 'module',
    ecmaFeatures: {
      jsx: true,
      experimentalObjectRestSpread: true
    }
  }
}

prettierrc.js文件内容

module.exports = {
  /**
   * 保留现有的结尾行
   */
  endOfLine: 'auto',

  /**
   * 代码行的长度
   */
  printWidth: 80,

  /**
   * 缩进方式
   * true  = tab缩进
   * false = 空格缩进
   */
  useTabs: false,

  /**
   * 缩进长度
   */
  tabWidth: 2,

  /**
   * 语句是否有";"
   *
   * true  - const a = 1;
   * false - const b = 2
   */
  semi: false,

  /**
   * 字符串是否使用单引号包裹
   *
   * true  - 'hello'
   * false - "a"
   */
  singleQuote: true,

  /**
   * 数组&&对象&&参数列表 多行显示时,结尾处是否有","
   *
   * "none" - NO
   * "es5"  - Array,Object YES
   * "all"  - Array,Object,Parameter List YES
   */
  trailingComma: 'none',

  /**
   * 字面对象的大括号之间是否使用空格
   *
   * true  - { a: 1 }
   * false - {a: 1}
   */
  bracketSpacing: true,

  /**
   * 控制单个参数箭头函数的括号:
   * "avoid"  - 无括号 x => x
   * "always" - 有括号 (x) => x
   */
  arrowParens: 'avoid'
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342