安装与初始化

  1. // 安装
  2. npm i eslint -D
  3. // 初始化
  4. eslint --list

参考链接 https://segmentfault.com/a/1190000016311421

eslint忽略全局变量

  1. // 找到.eslintrc.js,添加
  2. "globals": {
  3. "你的全局变量": true
  4. },
  1. const INLINE_ELEMENTS = [
  2. 'a',
  3. 'abbr',
  4. 'audio',
  5. 'b',
  6. 'bdi',
  7. 'bdo',
  8. 'canvas',
  9. 'cite',
  10. 'code',
  11. 'data',
  12. 'del',
  13. 'dfn',
  14. 'em',
  15. 'i',
  16. 'iframe',
  17. 'ins',
  18. 'kbd',
  19. 'label',
  20. 'map',
  21. 'mark',
  22. 'noscript',
  23. 'object',
  24. 'output',
  25. 'picture',
  26. 'q',
  27. 'ruby',
  28. 's',
  29. 'samp',
  30. 'small',
  31. 'span',
  32. 'strong',
  33. 'sub',
  34. 'sup',
  35. 'svg',
  36. 'time',
  37. 'u',
  38. 'var',
  39. 'video',
  40. 'cus'
  41. ]
  42. module.exports = {
  43. root: true,
  44. extends: ['plugin:vue/essential', '@vue/standard'],
  45. parserOptions: {
  46. parser: 'babel-eslint',
  47. ecmaFeatures: {
  48. legacyDecorators: true
  49. }
  50. },
  51. env: {
  52. browser: true,
  53. node: true
  54. },
  55. rules: {
  56. indent: [
  57. 'error',
  58. 2,
  59. {
  60. SwitchCase: 1,
  61. ignoredNodes: ['TemplateLiteral']
  62. }
  63. ],
  64. eqeqeq: 0, // 允许双等号
  65. quotes: [2, 'single'],
  66. semi: [2, 'never'],
  67. camelcase: [0, { properties: 'always' }],
  68. 'no-extra-semi': 2, // 禁止不必要的分号
  69. 'no-console': 'off',
  70. 'arrow-parens': 0, // 当它们只有一个参数时,箭头函数可以省略括号
  71. 'no-new': 0,
  72. 'no-tabs': 'off',
  73. 'space-before-function-paren': 0,
  74. 'no-extend-native': 0,
  75. 'no-trailing-spaces': 0,
  76. 'generator-star-spacing': 'off',
  77. 'no-debugger': process.env.NODE_ENV === 'production' ? 1 : 'off',
  78. 'no-mixed-spaces-and-tabs': 'off', //['error', 'smart-tabs'] // 不允许使用混合空格和制表符进行缩进
  79. 'template-curly-spacing': 'off',
  80. 'comma-spacing': [
  81. 2,
  82. {
  83. before: false,
  84. after: true
  85. }
  86. ],
  87. 'key-spacing': [
  88. 2,
  89. {
  90. beforeColon: false,
  91. afterColon: true
  92. }
  93. ],
  94. 'vue/array-bracket-spacing': ['error', 'never'],
  95. 'vue/object-curly-spacing': ['error', 'always'],
  96. // "vue/html-comment-content-spacing": ["error", "always"],
  97. // "vue/no-useless-mustaches": [
  98. // "error",
  99. // {
  100. // ignoreIncludesComment: false,
  101. // ignoreStringEscape: false,
  102. // },
  103. // ],
  104. 'vue/no-spaces-around-equal-signs-in-attribute': 'error',
  105. 'vue/mustache-interpolation-spacing': ['error', 'always'],
  106. 'vue/no-multi-spaces': [
  107. 'error',
  108. {
  109. ignoreProperties: false
  110. }
  111. ],
  112. 'vue/order-in-components': [
  113. 'error',
  114. {
  115. order: [
  116. 'el',
  117. 'name',
  118. 'parent',
  119. 'functional',
  120. 'extends',
  121. 'mixins',
  122. 'inheritAttrs',
  123. 'model',
  124. ['provide', 'inject'],
  125. ['directives', 'components'],
  126. ['delimiters', 'comments'],
  127. ['props', 'propsData'],
  128. 'data',
  129. 'computed',
  130. 'filters',
  131. 'watch',
  132. 'LIFECYCLE_HOOKS',
  133. 'methods',
  134. ['template', 'render', 'renderPage'],
  135. 'renderError'
  136. // 'el',
  137. // 'name',
  138. // 'key',
  139. // 'parent',
  140. // 'functional',
  141. // 'extends',
  142. // 'mixins',
  143. // ['delimiters', 'comments'],
  144. // ['components', 'directives'],
  145. // ['provide', 'inject'],
  146. // 'ROUTER_GUARDS',
  147. // 'layout',
  148. // 'middleware',
  149. // 'validate',
  150. // 'scrollToTop',
  151. // 'transition',
  152. // 'loading',
  153. // 'inheritAttrs',
  154. // 'model',
  155. // ['props', 'propsData'],
  156. // 'emits',
  157. // 'setup',
  158. // 'asyncData',
  159. // 'data',
  160. // 'filters',
  161. // 'fetch',
  162. // 'head',
  163. // 'computed',
  164. // 'watchQuery',
  165. // 'LIFECYCLE_HOOKS',
  166. // 'watch',
  167. // 'methods',
  168. // ['template', 'render'],
  169. // 'renderError'
  170. ]
  171. }
  172. ],
  173. 'vue/attributes-order': [
  174. 'error',
  175. {
  176. order: [
  177. 'DEFINITION',
  178. 'LIST_RENDERING',
  179. 'CONDITIONALS',
  180. 'RENDER_MODIFIERS',
  181. 'GLOBAL',
  182. 'UNIQUE',
  183. 'TWO_WAY_BINDING',
  184. 'OTHER_DIRECTIVES',
  185. 'OTHER_ATTR',
  186. 'EVENTS',
  187. 'CONTENT'
  188. ]
  189. }
  190. ],
  191. // 'vue/max-attributes-per-line': [
  192. // 'error',
  193. // {
  194. // singleline: 5,
  195. // multiline: {
  196. // max: 1,
  197. // allowFirstLine: false
  198. // }
  199. // }
  200. // ],
  201. 'vue/html-indent': ['error', 2],
  202. 'vue/html-closing-bracket-newline': [
  203. 'error',
  204. {
  205. singleline: 'never',
  206. multiline: 'always'
  207. }
  208. ],
  209. 'vue/multiline-html-element-content-newline': [
  210. 'error',
  211. {
  212. ignoreWhenEmpty: true,
  213. ignores: ['pre', 'textarea', ...INLINE_ELEMENTS],
  214. allowEmptyLines: false
  215. }
  216. ],
  217. 'vue/script-indent': [
  218. 'error',
  219. 2,
  220. {
  221. baseIndent: 1,
  222. switchCase: 1
  223. }
  224. ]
  225. },
  226. overrides: [
  227. {
  228. files: ['**/__tests__/*.{j,t}s?(x)', '**/tests/unit/**/*.spec.{j,t}s?(x)'],
  229. env: {
  230. jest: true
  231. }
  232. },
  233. {
  234. files: ['*.vue'],
  235. rules: {
  236. indent: 'off'
  237. }
  238. }
  239. ]
  240. }

stylelint

  1. 安装依赖到全局/ 也可以在项目node_modules

yarn add stylelint stylelint-config-recommended-scss stylelint-order stylelint-scss -g

  1. 配置stylelint

image.png

  1. 配置外部工具(External Tools)

    D:\node\global\stylelint.cmd
    $FileName$ —fix
    $FileDir$
    image.png

  2. 配置快捷键

image.png