关于eslint:Web项目如何配置Eslint

介绍ESLint 是一个依据计划辨认并报告 ECMAScript/JavaScript 代码问题的工具,其目标是使代码格调更加统一并防止谬误。在很多中央它都与 JSLint 和 JSHint 相似,除了: ESLint 应用 Espree 对 JavaScript 进行解析。ESLint 在代码中应用 AST 评估计划。ESLint 齐全是插件式的,每个规定都是一个插件,你能够在运行时中增加更多插件。装置@REM npm 装置eslintnpm i -D eslint@REM yarn 装置eslintyarn add -D eslint配置配置过程npm init @eslint/configYou can also run this command directly using 'npm init @eslint/config'.Need to install the following packages: @eslint/create-config@0.4.6Ok to proceed? (y) y@REM 您还能够应用“npm init @eslint/config”间接运行此命令。@REM 须要装置以下软件包:@REM @eslint/create-config@0.4.6@REM 确定持续: 是How would you like to use ESLint? ... To check syntax only To check syntax and find problems> To check syntax, find problems, and enforce code style@REM 您想如何应用 ESLint? ...@REM 仅查看语法@REM 查看语法并发现问题@REM > 查看语法、发现问题并强制执行代码格调What type of modules does your project use? ...> JavaScript modules (import/export) CommonJS (require/exports) None of these@REM 您的我的项目应用什么类型的模块? ...@REM > JavaScript 模块(导入/导出)@REM CommonJS(要求/导出)@REM 都不是Which framework does your project use? ... React> Vue.js None of these@REM 您的我的项目应用哪个框架? ...@REM React@REM > Vue.js@REM 都不是Does your project use TypeScript? » No / Yes@REM 您的我的项目应用 TypeScript 吗? » 否/是Where does your code run? ... (Press <space> to select, <a> to toggle all, <i> to invert selection)√ Browser√ Node你的代码在哪里运行? ...(按 <space> 进行抉择,<a> 切换全副,<i> 反转抉择)√ 浏览器√ 节点How would you like to define a style for your project? ...> Use a popular style guide Answer questions about your style@REM 您心愿如何为您的我的项目定义格调? ...@REM > 应用风行的格调指南@REM 答复无关您格调的问题Which style guide do you want to follow? ... Airbnb: https://github.com/airbnb/javascript> Standard: https://github.com/standard/standard Google: https://github.com/google/eslint-config-google XO: https://github.com/xojs/eslint-config-xo@REM 您想遵循哪种格调指南? ...@REM Airbnb: https://github.com/airbnb/javascript@REM > Standard: https://github.com/standard/standard@REM Google: https://github.com/google/eslint-config-google@REM XO: https://github.com/xojs/eslint-config-xoWhat format do you want your config file to be in? ...> JavaScript YAML JSON@REM 您心愿配置文件采纳什么格局? ...@REM > JavaScript@REM YAML@REM JSON@REM 您抉择的配置须要以下依赖项:@REM eslint-plugin-vue@latest eslint-config-standard@latest eslint@^8.0.1 eslint-plugin-import@^2.25.2 eslint-plugin-n@^15.0.0 || ^16.0.0 eslint-plugin-promise@^6.0.0@REM ?您想当初装置它们吗? » 否/是The config that you've selected requires the following dependencies:eslint-plugin-vue@latest eslint-config-standard@latest eslint@^8.0.1 eslint-plugin-import@^2.25.2 eslint-plugin-n@^15.0.0 || ^16.0.0 eslint-plugin-promise@^6.0.0? Would you like to install them now? » No / YesWhich package manager do you want to use? ...> npm yarn pnpm@REM 您想应用哪个包管理器? ...@REM > npm@REM yarn@REM pnpm配置后果√ How would you like to use ESLint? · style√ What type of modules does your project use? · esm√ Which framework does your project use? · vue√ Does your project use TypeScript? · No / Yes√ Where does your code run? · browser, node√ How would you like to define a style for your project? · guide√ Which style guide do you want to follow? · standard√ What format do you want your config file to be in? · JavaScriptChecking peerDependencies of eslint-config-standard@latestThe config that you've selected requires the following dependencies:eslint-plugin-vue@latest eslint-config-standard@latest eslint@^8.0.1 eslint-plugin-import@^2.25.2 eslint-plugin-n@^15.0.0 || ^16.0.0 eslint-plugin-promise@^6.0.0√ Would you like to install them now? · No / Yes√ Which package manager do you want to use? · npmInstalling eslint-plugin-vue@latest, eslint-config-standard@latest, eslint@^8.0.1, eslint-plugin-import@^2.25.2, eslint-plugin-n@^15.0.0 || ^16.0.0 , eslint-plugin-promise@^6.0.0装置我的项目 Eslint 反对Webpack 形式装置 eslint-webpack-plugin@REM npmnpm install eslint-webpack-plugin -D@REM yarnyarn add eslint-webpack-plugin --save-dev在 Webpack.config.js 中应用具体配置可查看官网:eslint-webpack-plugin ...

September 11, 2023 · 4 min · jiezi

关于eslint:通过引入eslintconfig包的方式一站式解决项目代码风格和规范

背景大家好,我是前端老六。明天想提及一下我的项目代码标准这一块,平时咱们在搭建一个前端我的项目的时候,我的项目代码标准是咱们要思考的,在现在多人开发一个我的项目的时候那更是不能忽略。对于前端来说呢,咱们罕用的就是eslint+prettier,两者集成的形式,eslint负责监测咱们的语法错误,而prettier对咱们的代码格调进行标准。 ESlintESLint 是一个开源的 JavaScript 代码查看工具,由 Nicholas C. Zakas 于2013年6月创立。代码查看是一种动态的剖析,罕用于寻找有问题的模式或者代码,并且不依赖于具体的编码格调。对大多数编程语言来说都会有代码查看,一般来说编译程序会内置查看工具。 JavaScript 是一个动静的弱类型语言,在开发中比拟容易出错。因为没有编译程序,为了寻找 JavaScript 代码谬误通常须要在执行过程中一直调试。像 ESLint 这样的能够让程序员在编码的过程中发现问题而不是在执行的过程中。 Lint工具经验了JSLint、JSHint,最初是ESLint,ESLint 号称下一代的 JS Linter 工具,它的灵感来源于 PHP Linter,将源代码解析成 AST,而后检测 AST 来判断代码是否合乎规定。ESLint 应用 esprima 将源代码解析吃成 AST,而后你就能够应用任意规定来检测 AST 是否合乎预期,这也是 ESLint 高可扩展性的起因。 ES6 公布后,因为新增了很多语法,JSHint 短期内无奈提供反对,而 ESLint 只须要有适合的解析器就可能进行 lint 查看。这时 babel 为 ESLint 提供了反对,开发了 babel-eslint,让ESLint 成为最快反对 ES6 语法的 lint 工具。 ESlint能够做些什么1. 防止低级bug,找出可能产生的语法错误应用未声明变量、批改 const 变量……2. 提醒删除多余的代码申明而未应用的变量、反复的 case ……3. 确保代码遵循最佳实际可参考 airbnb style、javascript standard4. 对立团队的代码格调加不加分号?应用 tab 还是空格?Prettierprettier是一款强势果断的代码格式化工具,它简直移除了编辑器自身所有的对代码的操作格局,而后从新显示。就是为了让所有用这套规定的人有完全相同的代码。在团队合作开发的时候更是体现出它的劣势。与eslint,tslint等各种格式化工具不同的是,prettier只关怀代码格式化,而不关怀语法问题。prettier 的劣势也很显著,它反对 JavaScript (包含试验性功能)JSXAngularVueFlowTypeScriptCSS、Less 和 SCSSHTMLJSONGraphQLMarkdown,包含 GFM 和 MDXYAML不少编辑器内置了prettier插件反对,能够启用在保留时主动格式化代码格调,例如,如果你用的是Webstorm,在我的项目下载了prettier的状况下能够这样这样设置一下 应用Prettier在code review时不须要再探讨代码款式,节俭了工夫与精力。 ...

February 17, 2023 · 2 min · jiezi

关于eslint:eslint-prettier-配置冲突解决

1.eslint、preitter 1.先建一个.prettierrc文件echo {}> .prettierrc2.创立.prettierignore 相似于.gitignore, 示意不须要格式化的文件3.手动格式化:yarn prettier --write.4.主动格式化:pre-commit Hook npx mrm lint-staged2.pre-commit hook: 提交前主动格式化 npx mrm lint-staged## package.json 针对某系文件进行格式化, 主动保留的一个配置..........."devDependencies": { ...... "husky": ">=6", "lint-staged": ">=10", "prettier": "^2.2.1" }, "lint-staged": { "*.{js,css,md,ts,tsx}": "prettier --write" }3.解决抵触 npm install eslint-config-prettier -D## package.json中......"eslintConfig": { "rules": { "@typescript-eslint/no-unused-vars": "off" }, "extends": [ "react-app", "react-app/jest", "prettier" // 用prettier的规定笼罩一部分eslint的规定 ] },}.husky 文件增加到git: git add .4.commitlint 检测commit message提交是否标准npm install @commitlint/config-conventional @commitlint/cli -D## 创立文件: commitlint.config.jsecho "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.jsnpx husky add .husky/commit-msg "yarn commitlint --edit $1"

September 1, 2022 · 1 min · jiezi

关于eslint:Eslint-Prettier-Husky-Commitlint-Lintstaged-规范前端工程代码规范

1.代码查看工具1.装置工具npm i eslint -Dnpx eslint --init2.配置主动格式化在package.json中增加"lint": "eslint --ext .js,.jsx src --fix"。执行npm run lint会进行主动修复执行init实现会生成一个.eslintrc.js的文件 2.代码格调工具1.我的项目集成npm i prettier eslint-config-prettier eslint-plugin-prettier -D在.eslintrc 中,extend中增加 "prettier" 解决 eslint 和 prettier 的抵触 2.配置 .prettierrc1.编配置在根目录创立.prettierrc依据本人爱好的编码格局设置规定 // 本人配置{"semi": false,"tabWidth": 2,"trailingComma": "none","singleQuote": true,"arrowParens": "avoid"}2.装置prettier 3.解决配置了.prettierrc不失效问题把一下勾选框勾销这样就不会优先应用editorconfig配置文件了 3.git钩子Git 有很多的 hooks, 让咱们在不同的阶段,对代码进行不同的操作,管制提交到仓库的代码的规范性,和准确性, 以下只是几个罕用的钩子 pre-commit形容: 通过钩子函数,判断提交的代码是否符合规范commit-msg形容: 通过钩子函数,判断 commit 信息是否符合规范pre-push形容: 通过钩子,执行测试,防止对以前的内容造成影响4.工具huskyhusky 是一个 Git Hook 工具。husky 其实就是一个为 git 客户端减少 hook 的工具。将其装置到所在仓库的过程中它会主动在.git/目录下减少相应的钩子。绝对于git hooks的劣势:1.因为.git文件夹是不会被git跟踪的,所以.git/hooks目录下的hooks钩子无奈提交,就不能和别人共享钩子脚本。2.husky能够将git内置的钩子裸露进去,很不便地进行钩子命令注入,而不须要在.git/hooks目录下本人写shell脚本了。能够应用它来lint提交音讯、运行测试、lint代码等。当你commit或push的时候。husky触发所有git钩子脚本。lint-staged应用lint-staged对将要提交的内容进行lint校验,而不是给所有文件进行一次lintcommitlintcommit 信息校验工具,多人合作中能够标准commit信息,能够更清晰的查看每一次代码提交记录commitizen辅助 commit 信息 ,通过事后设置一些固定的选项来标准开发人员提交信息,如下图5.装置流程1.装置代码测验依赖npm i lint-staged husky -Dnpm set-script prepare "husky install" 执行此命令在package.json中增加脚本npm run prepare 初始化husky,将 git hooks 钩子交由,husky执行,会主动生成一个.husky文件夹pre-commit 执行 npx lint-staged 指令npx husky add .husky/pre-commit "npx lint-staged"执行此命令会在.husky下生成pre-commit文件,文件内容如下根目录创立 .lintstagedrc.json 文件管制检查和操作形式 ...

September 1, 2022 · 2 min · jiezi

关于eslint:常用eslint模板

module.exports = { root: true, //以后配置不容许往父级或向上查找 parserOptions: { parser: 'babel-eslint', //babel-eslint解析器是对babel解析器的包装使其与ESLint解析 sourceType: 'module' }, env: { browser: true, //浏览器全局变量 node: true, //nodejs变量与语法 es6: true,// 启用ES6语法 },//指定浏览器环境 extends: ['plugin:vue/recommended', 'eslint:recommended'], // add your custom rules here //it is base on https://github.com/vuejs/eslint-config-vue rules: { "vue/max-attributes-per-line": [2, { "singleline": 10, "multiline": { "max": 1, "allowFirstLine": false } }], // 模板每行属性的数量是否不超过定义的最大值,超过就换行 "vue/singleline-html-element-content-newline": "off", //强制在单行元素的内容前后加换行符 "vue/multiline-html-element-content-newline":"off", //多行元素的内容之前和之后须要换行符 "vue/name-property-casing": ["error", "PascalCase" | "kebab-case"], //强制vue的name属性命名格局 "vue/no-v-html": "off", // 是否不容许应用v-html 'accessor-pairs': 2, //强制 getter 和 setter 在对象中成对呈现 'arrow-spacing': [2, { 'before': true, 'after': true }], //强制箭头函数的箭头前后应用统一的空格 'block-spacing': [2, 'always'], //禁止或强制在代码块中开括号前和闭括号后有空格 'brace-style': [2, '1tbs', { 'allowSingleLine': true }], //强制在代码块中应用统一的大括号格调 'camelcase': [0, { 'properties': 'always' }], //强制应用骆驼拼写法命名约定 'comma-dangle': [2, 'never'], //要求或禁止开端逗号 'comma-spacing': [2, { 'before': false, 'after': true }], //强制在逗号前后应用统一的空格 'comma-style': [2, 'last'], //强制应用统一的逗号格调 'constructor-super': 2, //要求在构造函数中有 super() 的调用 'curly': [2, 'multi-line'], //强制所有管制语句应用统一的括号格调 'dot-location': [2, 'property'], //强制在点号之前和之后统一的换行 'eol-last': 2, //要求或禁止文件开端存在空行 'eqeqeq': ["error", "always", {"null": "ignore"}], //要求应用 === 和 !== 'generator-star-spacing': [2, { 'before': true, 'after': true }], //强制 generator 函数中 * 号四周应用统一的空格 'handle-callback-err': [2, '^(err|error)$'], //要求回调函数中有容错解决 'indent': [2, 2, { 'SwitchCase': 1 }], //强制应用统一的缩进 'jsx-quotes': [2, 'prefer-single'], //强制在 JSX 属性中统一地应用双引号或单引号 'key-spacing': [2, { 'beforeColon': false, 'afterColon': true }],//强制在对象字面量的属性中键和值之间应用统一的间距 'keyword-spacing': [2, { 'before': true, 'after': true }],//强制在关键字前后应用统一的空格 'new-cap': [2, { 'newIsCap': true, 'capIsNew': false }],//要求构造函数首字母大写 'new-parens': 2, //强制或禁止调用无参构造函数时有圆括号 'no-array-constructor': 2, //禁用 Array 构造函数 'no-caller': 2, //禁用 arguments.caller 或 arguments.callee 'no-console': 'off', //禁用 console 'no-class-assign': 2, //禁止批改类申明的变量 'no-cond-assign': 2, //禁止条件表达式中呈现赋值操作符 'no-const-assign': 2, //禁止批改 const 申明的变量 'no-control-regex': 0, //禁止在正则表达式中应用控制字符 'no-delete-var': 2, //禁止删除变量 'no-dupe-args': 2, //禁止 function 定义中呈现重名参数 'no-dupe-class-members': 2, //禁止类成员中呈现反复的名称 'no-dupe-keys': 2, //禁止对象字面量中呈现反复的 key 'no-duplicate-case': 2, //禁止呈现反复的 case 标签 'no-empty-character-class': 2, //禁止在正则表达式中应用空字符集 'no-empty-pattern': 2, //禁止应用空解构模式 'no-eval': 2, //禁用 eval() 'no-ex-assign': 2, //禁止对 catch 子句的参数从新赋值 'no-extend-native': 2, //禁止扩大原生类型 'no-extra-bind': 2, //禁止不必要的 .bind() 调用 'no-extra-boolean-cast': 2, //禁止不必要的布尔转换 'no-extra-parens': [2, 'functions'], //禁止不必要的括号 'no-fallthrough': 2, //禁止 case 语句落空 'no-floating-decimal': 2, //禁止数字字面量中应用前导和开端小数点 'no-func-assign': 2, //禁止对 function 申明从新赋值 'no-implied-eval': 2, //禁止应用相似 eval() 的办法 'no-inner-declarations': [2, 'functions'], //禁止在嵌套的块中呈现变量申明或 function 申明 'no-invalid-regexp': 2, //禁止 RegExp 构造函数中存在有效的正则表达式字符串 'no-irregular-whitespace': 2, //禁止不规则的空白 'no-iterator': 2, //禁用 __iterator__ 属性 'no-label-var': 2, //不容许标签与变量同名 'no-labels': [2, { 'allowLoop': false, 'allowSwitch': false }], //禁用标签语句 'no-lone-blocks': 2, //禁用不必要的嵌套块 'no-mixed-spaces-and-tabs': 2, //禁止空格和 tab 的混合缩进 'no-multi-spaces': 2, //禁止应用多个空格 'no-multi-str': 2, //禁止应用多行字符串 'no-multiple-empty-lines': [2, { 'max': 1 }], // 禁止呈现多行空行 'no-new-object': 2, //禁用 Object 的构造函数 'no-new-require': 2, //禁止调用 require 时应用 new 操作符 'no-new-symbol': 2, //禁止 Symbolnew 操作符和 new 一起应用 'no-new-wrappers': 2, //禁止对 String,Number 和 Boolean 应用 new 操作符 'no-obj-calls': 2, //禁止把全局对象作为函数调用 'no-octal': 2, //禁用八进制字面量 'no-octal-escape': 2, //禁止在字符串中应用八进制转义序列 'no-path-concat': 2, //禁止对 __dirname 和 __filename 进行字符串连贯 'no-proto': 2, //禁用 __proto__ 属性 'no-redeclare': 2, //禁止屡次申明同一变量 'no-regex-spaces': 2, //禁止正则表达式字面量中呈现多个空格 'no-return-assign': [2, 'except-parens'], //禁止在 return 语句中应用赋值语句 'no-self-assign': 2, //禁止自我赋值 'no-self-compare': 2, //禁止本身比拟 'no-sequences': 2, //禁用逗号操作符 'no-shadow-restricted-names': 2, //禁止将标识符定义为受限的名字 'no-sparse-arrays': 2, //禁用稠密数组 'no-this-before-super': 2, //禁止在构造函数中,在调用 super() 之前应用 this 或 super 'no-throw-literal': 2, //禁止抛出异样字面量 'no-trailing-spaces': 2, //禁用行尾空格 'no-undef': 2, //禁用未声明的变量,除非它们在 /*global */ 正文中被提到 'no-undef-init': 2, //禁止将变量初始化为 undefined 'no-unexpected-multiline': 2, //禁止呈现令人困惑的多行表达式 'no-unmodified-loop-condition': 2, //禁用变化无穷的循环条件 'no-unneeded-ternary': [2, { 'defaultAssignment': false }], //禁止能够在有更简略的可代替的表达式时应用三元操作符 'no-unreachable': 2, //禁止在 return、throw、continue 和 break 语句之后呈现不可达代码 'no-unsafe-finally': 2, //禁止在 finally 语句块中呈现控制流语句 'no-unused-vars': [2, { 'vars': 'all', 'args': 'none' }], //禁止呈现未应用过的变量 'no-useless-call': 2, //禁止不必要的 .call() 和 .apply() 'no-useless-computed-key': 2, //禁止在对象中应用不必要的计算属性 'no-useless-constructor': 2, //禁用不必要的构造函数 'no-useless-escape': 0, //禁用不必要的转义字符 'no-whitespace-before-property': 2, //禁止属性前有空白 ------ 'no-with': 2, //禁用 with 语句 'one-var': [2, { 'initialized': 'never' }], //强制函数中的变量要么一起申明要么离开申明 'operator-linebreak': [2, 'after', { 'overrides': { '?': 'before', ':': 'before' } }], //强制操作符应用统一的换行符 'padded-blocks': [2, 'never'], //要求或禁止块内填充 'quotes': [2, 'single', { 'avoidEscape': true, 'allowTemplateLiterals': true }], //强制应用统一的反勾号、双引号或单引号 'semi': [2, 'never'], //要求或禁止应用分号代替 ASI 'semi-spacing': [2, { 'before': false, 'after': true }], //强制分号之前和之后应用统一的空格 'space-before-blocks': [2, 'always'], //强制在块之前应用统一的空格 'space-before-function-paren': [2, 'never'], //强制在 function的左括号之前应用统一的空格 'space-in-parens': [2, 'never'], //强制在圆括号内应用统一的空格 'space-infix-ops': 2, //要求操作符四周有空格 'space-unary-ops': [2, { 'words': true, 'nonwords': false }], //强制在一元操作符前后应用统一的空格 'spaced-comment': [2, 'always', { 'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ','] }], //强制在正文中 // 或 /* 应用统一的空格 'template-curly-spacing': [2, 'never'], //要求或禁止模板字符串中的嵌入表达式四周空格的应用 'use-isnan': 2, //要求应用 isNaN() 查看 NaN 'valid-typeof': 2, //强制 typeof 表达式与无效的字符串进行比拟 'wrap-iife': [2, 'any'], //要求 IIFE 应用括号括起来 'yield-star-spacing': [2, 'both'], //强制在 yield* 表达式中 * 四周应用空格 'yoda': [2, 'never'], //要求或禁止 “Yoda” 条件 'prefer-const': 2, //要求应用 const 申明那些申明后不再被批改的变量 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, //禁用 debugger 'object-curly-spacing': [2, 'always', { objectsInObjects: false }], //强制在大括号中应用统一的空格 'array-bracket-spacing': [2, 'never'] //强制数组方括号中应用统一的空格 }}

August 26, 2022 · 4 min · jiezi

关于eslint:在WebStorm使用EsLint来进行格式化代码format

间接输入干货 点击【All actions on save】 保留之后,试试 Command+Option+L 是不是依据ESLint文件配置格式化代码了。

August 11, 2022 · 1 min · jiezi

关于eslint:手把手教你使用-ESLint-Prettier-规范项目代码

置信小伙伴们在小学时都经验过小平头时代,那时的教务处主任天天学校门口巡视,同学们更是一个个大惊失色。那时的咱们就好比一行行代码,如果发型不一,上来就是两…55555 不说了…所以说对立款式更有助于咱们更对立的治理,也会使咱们少犯错误,这时 ESlint 站进去了,它就是教务处主任的化身,会将咱们的不拘一格的发型 (代码) 对立起来,尽管验证过得代码不肯定完满,然而肯定绝对标准。 什么是 ESLint?ESLint 是一个用来辨认 ECMAScript 并且依照规定给出报告的代码检测工具,应用它能够防止低级谬误和对立代码的格调。如果每次在代码提交之前都进行一次 eslint 代码查看,就不会因为某个字段未定义为 undefined 或 null 这样的谬误而导致服务解体,能够无效的管制我的项目代码的品质。 ESlint 的次要作用 代码品质问题:应用 / 编写的形式有可能有问题 (problematic patterns)代码格调问题:格调不合乎肯定规定 (doesn’t adhere to certain style guidelines)就好比有些同学喜爱应用 tab 缩进,有些喜爱空格,有些喜爱 2 个空格,有些喜爱 4 个。这就难办了,到底听谁的? 最初通过一番笔战,选定 2 个空格作为规范。于是乎咱们在根目录创立了配置文件.eslintrc 并写入了咱们的伦果 // .eslintrc { "indent": ["error", 2] }为了大家的进步大家的开发体检及提交的一致性,你还‘威逼利诱’的让大家下载了 vscode 插件,没有通过 ESLint 校验的代码 VSCode 会给予下滑波浪线提醒,揭示他好好查看。 为了保障提交代码的十拿九稳,你还增加一个 pre-commit 钩子 eslint --ext .js src,确保没有通过 lint 的代码不会被提交。 最初还要求了大家应用 eslint --fix 将之前的所有代码,一键批改成了新标准下的代码格局。 什么是 Prettier?一个风行的代码格式化工具的名称,它可能解析代码,应用你本人设定的规定来从新打印出格局标准的代码。 Tony 老师认为发型很重要,Prettier 也这么认为。 Prettier 认为格局很重要,然而格局好麻烦,我来帮你们定好吧。简略来说,不须要咱们再思考到底是用 single quote,还是 double quote 这些乱起八糟的格局问题,Prettier 帮你解决。最初的后果,可能不是你齐全称心,然而,相对不会丑。 ...

May 16, 2022 · 2 min · jiezi

关于eslint:开发一个eslint插件

本文记录如何开发一个elsint插件,浏览之前请先浏览官网的文档自定义插件,自定义规定。废话不多说,开搞。 创立一个eslint插件库须要创立一个npm我的项目,倡议命名为eslint-plugin-*或者@yourScope/eslint-plugin[-*]。在库的导出文件中,导出一个规范的插件对象: // lib/index.jsmodule.exports = { rules: { // key为规定id, 值为规定对象,个别放在独自的文件中导出,这里下文的两个规定为例 'no-use-foo-in-var-name': require('./rules/no-use-foo-in-var-name'), }, configs: { // 提供给使用者应用该插件时,对插件内的规定的默认应用 recommended: { rules: { 'no-use-foo-in-var-name': 'error', 'no-use-string-substr': 'error', }, }, },};接下来就是实现no-use-foo-in-var-name规定。 创立规定这里以创立一个简略的规定(no-use-foo-in-var-name)为例,假设一个需要,禁止代码中命名为foo这个单词。 首先对需要进行剖析,禁止命名为foo,那么应该须要禁止上面的状况中应用foo标识符(也就是规定文档中不举荐局部): 参数定义时;导入模块时通过as从新定义;解构时从新赋值定义;参数名定义;对象字面量中有foo成员变量。对于上面这些状况,因为存在正当场景,且将不合理场景剖析进去老本很高,所以须要疏忽(也就是规定文档中保护的上面的代码不会正告局部): 导入第三方库间接有的foo成员;已有对象中的foo成员操作,如obj.foo = 'xxxx';对已有的对象中解构中蕴含foo,如const { foo } = object;因为本章节只是用于示例,所以只对上文中禁止的状况中,挑出两个进行实现: 参数定义时禁止应用foo变量名和对象字面量中有foo成员变量。 首先创立一个规定对象: // lib/rules/no-use-foo-in-var-name.jsmodule.exports = { // 规定元数据,具体浏览官网 meta: { type: 'problem', // 规定配置参数的验证器 schema: [], // 文档信息 docs: { description: '规定的形容', url: '规定文档地址', }, }, create(context) { // 规定理论逻辑 },};而后在create函数中实现拜访器, 首先实现对参数定义的ast节点的拜访器: ...

April 28, 2022 · 3 min · jiezi

关于eslint:eslint简介

本文次要记录作者对eslint了解的关键点,倡议在浏览本文之前,先浏览eslint官网用户手册文档eslint是一个代码查看工具。 配置增加eslint后,进行代码测验并没有成果,还须要进行配置。 在我的项目下创立.eslintrc.js配置文件(更多配置形式请浏览官网),用于领导eslint的行为。 规定规定能够了解为对某种编码场景的查看纬度,如命名,缩进等。官网提供了十分多的规定,但默认是不开启状态,须要通过配置文件开启。 如开启一个规定,规定我的项目中字符串的字面量都是用双引号: module.exports = { rules: { quotes: ["error", "double"] },};更多的规定请见官网规定列表。 如果感觉配置规定太过于繁琐,或者不晓得如何配置时,能够应用一些他人曾经配置好的规定配置。这种规定配置个别称为格调,次要有: eslint-config-standard: js规范格调,特地宽松,举荐应用高级用法,比拟灵便,适宜精英小团队;eslint:recommended: eslint官网举荐,较严格,应用最广的格调;eslint-config-airbnb: 爱彼迎团队推出来的代码格调,比拟严苛,团队入门老手较多时举荐;更多格调,能够在github ,npm中应用关键字eslint-config进行搜寻,抉择适宜本人或者团队的。 对于他人配置好的规定配置,只须要在配置文件中,应用extends即能够继承,如: module.exports = { extends: ['eslint-config-airbnb'],};此时能够不须要额定去配置其配置项和规定,即可应用。如果这种社区的格调存在不适宜团队或者集体的中央,能够在以后配置中配置其余内容项进行调整,如规定,本人配置的内容具备最高优先级。 能够继承多个格调,多个格调中对于同个规定的配置,都是前面的笼罩后面的,其余配置的优先级也是一样。 有一个比拟非凡的格调就是eslint-config-prettier,该格调中只对一些能够通过prettier进行代码主动格式化操作的场景对应的规定给敞开,利用prettier去保障代码符合规范。所以当你的团队启用prettier的时候,须要保障eslint-config-prettier放在最初。 也能够把本人搭配进去的规定配置抽取公共的库,倡议命名标准为eslint-config-xxxx,在多个我的项目中应用。如果不想抽取为配置库,抽取为一个配置文件随便放在哪里也是能够的。 规定共享配置setting配置多个规定的独特配置配置(如果有),这在一些eslint插件(下文会说)中用的比拟多,如eslint-plugin-import; 解析器和解析器选项能够在配置文件中通过parser配置对js进行语法信息的解析器。如果应用一些非凡的es6语法,可能应用eslint自带的语法解析器无奈反对到这些个性,能够配置为@babel/eslint-parser,利用babel插件机制,反对更广的语法。另外如果要反对typescipt语法,倡议配置为@typescript-eslint/parser。 通过parserOptions配置项能够配置对应解析器的解析器选项,具体配置,参照对应解析器的文档,都有举荐配置,或者依据理论需要场景配置。 其余配置倡议浏览官网。 插件当官网的规定不能笼罩全副理论场景时,eslint反对插件体系对其规定进行裁减。 这里举荐一些社区插件: @typescript-eslint/eslint-plugin: typescipt语法标准eslint-plugin-import:导入模块标准eslint-plugin-jsx-a11y: 推动无障碍反对标准eslint-plugin-react: react编写标准eslint-plugin-react-hooks: react hooks编写标准eslint-plugin-promise:promise应用标准eslint-plugin-lodash:lodash应用标准更多的能够应用关键字eslint-plugin在github和npm中搜寻,抉择适宜本人或者团队的插件。 每个插件都会扩大一些规定,但须要留神,当规定启用较多时,测验工夫就会减少。 每个插件根本的都有对插件内的规定的举荐配置,应用其举荐配置,能够疾速应用。 另外能够参考官网的文档自定义插件,自定义规定,依据集体需要和团队需要,实现更加贴合的测验规定。 应用在我的项目中集成eslint后,有多种应用形式。 vscodevscode中增加插件eslint,即可失效。能够在编码时及时反馈,养成良好编码习惯。 命令行eslint提供elsint指令,能够配置在package.json中的scripts中,也能够间接npx执行,相干命令行参数参照官网对应文章:eslint命令行。 webpack插件参考eslint-webpack-plugin即可。 node Apieslint提供node api模式,不便二次封装和集成在其余工具外面。如对其校验后果自定义格式化,该需要命令行指定format也能够,但更加倡议应用api的模式。 git hooks利用husky + lint-staged,对每次提交的每个文件进行测验,如果没通过,禁止提交。 提供一个参考的配置(配置在package.json的形式,其余形式参考相干技术,按需调整): { "husky": { "hooks": { "pre-commit": "npx lint-staged" } }, "lint-staged": { "src/**/*.{js,jsx,tsx,ts}": [ "eslint --quiet", "git add" ] }}

April 28, 2022 · 1 min · jiezi

关于eslint:eslint的认识

关系npm装置的依赖,编辑器的插件,规定,到底这些是个什么关系 webpack的eslint,编辑器的插件,standard待更新

April 24, 2022 · 1 min · jiezi

关于eslint:Taro-VUE-style-项目增加lint以及git-hooks

Lint 是什么?探讨怎么做之前,咱们很有必要给 Lint 来个清晰、精确的定义,wikipedia 的定义如下: In computer programming, lint is a Unix utility that flags some suspicious and non-portable constructs (likely to be bugs) in C language source code; generically, lint or a linter is any tool that flags suspicious usage in software written in any computer language. The term lint-like behavior is sometimes applied to the process of flagging suspicious language usage. Lint-like tools generally perform static analysis of source code.简略来说,Lint 就是对代码做动态剖析,并试图找出潜在问题的工具,实战中咱们也用 Lint 来指应用工具的过程。 ...

March 6, 2022 · 3 min · jiezi

关于eslint:eslintpluginimport-规则之-Import-Order

顾名思义,是对导入的模块进行排序,成果如下: 比照排序前后代码,排序后的代码看起来更整洁,react**全家桶、内部库、公共组件、子组件、api、工具类顺次排列。 罕用规定配置{ "import/order": ["error", { "groups": [ "builtin", "external", ["internal", "parent", "sibling", "index"], "unknown", ], "pathGroups": [ { "pattern": "@app/**", "group": "external", "position": "after" } ], "pathGroupsExcludedImportTypes": ["builtin"], "newlines-between": "always", "alphabetize": { "order": "asc", "acseInsensitive": true } }]}其中,group 是对导入模块进行分组,pathGroups 是通过门路自定义分组,newlines-between 不同组之间是否进行换行,alphabetize 依据字母程序对每个组内的程序进行排序 重点介绍下 pathGroups 属性,该属性有 4 个子属性: pattern:以后组中模块的最短门路匹配patternOptions:如果须要更准确的匹配,看这里group:在规定的组当选其一,index、sibling、parent、internal、external、builtin、object、type、unknownposition:定义组的地位,after、before对于 pathGroupsExcludedImportTypes 的作用愣是没看懂,欢送大家补充。

February 8, 2022 · 1 min · jiezi

关于eslint:编程规范ESLint-Prettier

代码检测工具: Eslint 代码格式化工具: Prettier prettier能够在保留代码时,让代码合乎ESLint规范 在VSCode中装置prettier插件在我的项目根目录创立.prettierrc.js文件配置prettier module.exports = {semi: true,singleQuote: true,trailingComma: 'none'}在VSCode设置中勾选Format On Save,formatter中Default Formatter抉择Prettier-Code formatter在VSCode设置中批改Tab Size为2,将一个tab改为两个空格在.eslintrc.js中解决ESLint和Prettier之间的抵触 module.exports = { root: true, env: { node: true }, extends: [ 'plugin:vue/vue3-essential', '@vue/standard' ], parserOptions: { parser: 'babel-eslint' }, rules: { 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 'space-before-function-paren': 0 }}

November 25, 2021 · 1 min · jiezi

关于eslint:ESLint配置文件pluginsextendsrules的区别

一、rules定议各种限定规定,lint 工具的根本目标,就是对代码进行各种限定,对立格调。因为每个人、每个团队谋求的格调不同,所以工具也会提供各种配置,帮忙限定代码 module.exports = { extends: [], plugins: [], rules: { 'quotes': 'single', 'space-before-blocks': 'always', },}二、extends不同我的项目,如果心愿应用雷同的 rules,间接复制粘贴显然不是一个好办法,一是 rules 太多,配置文件会显得很乱,二是无奈同步更新,举荐应用的办法是把所需的 rules 抽离成一个 npm 包,须要的时候再通过 extends 援用。而且对于这些抽离进去的包,有着对立的命名标准extends 的模块名称以 eslint-config- 结尾,例如 eslint-config-myconfig 也反对 npm 作用域模块。例如 @scope/eslint-config 或 @scope/eslint-config-myconfig)应用的时候能够用全称,也能够用缩写 module.exports = { extends: [ 'eslint-config-myconfig', // 全称 //'myconfig' 缩写 ], plugins: [], rules: {},}extends 多个模块,如果规定抵触,地位靠后的包将笼罩后面的。rules 中的规定雷同,并且优先级恒定高于 extends module.exports = { extends: [ 'eslint:recommend', 'plugin:vue/vue3-recommended', 'prettier', 'prettier/@typescript-eslint' ], plugins: [], rules: {},}三、plugin能够应用 plugin 定义本人的规定 eslint-plugin-react, eslint-plugin-vue引入 plugin 能够了解为引入了额定的 rules,须要在 rules、extends 中定义后才会失效 ...

June 11, 2021 · 1 min · jiezi

关于eslint:eslint常用配置

.eslintrc.js module.exports = { root: true, env: { node: true, }, extends: [ "plugin:vue/essential", "eslint:recommended", "@vue/typescript/recommended", "@vue/prettier", "@vue/prettier/@typescript-eslint", ], parserOptions: { ecmaVersion: 2020, }, rules: { /** * 官网规定: https://eslint.bootcss.com/docs/rules/ */ "no-console": process.env.NODE_ENV === "production" ? "warn" : "off", "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off", "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/camelcase": "off", "quotes": [1, "double"], // 引号类型 `` "" '' "semi": ["off", "always"], // 语句强制分号结尾 "semi-spacing": [0, { before: false, after: true }], // 分号前后空格 "newline-after-var": 2, // 变量申明后是否须要空一行 "getter-return": ["error", { allowImplicit: true }], // 强制 getter 函数中呈现 return 语句 "no-control-regex": "error", // 禁止在正则表达式中呈现控制字符 "no-dupe-args": "error", // 禁止在函数定义或表白中呈现重名参数 "no-dupe-keys": "error", // 禁止对象字面量中呈现反复的 key "no-duplicate-case": "error", // 禁止呈现反复的 case 标签 "no-empty": "error", // 禁止呈现空语句块 "no-empty-character-class": "error", // 禁止在正则表达式中应用空字符集 "no-ex-assign": "error", // 禁止对 catch 子句中的异样从新赋值 "no-extra-semi": "error", // 禁用不必要的分号 "no-func-assign": "error", // 禁止对 function 申明从新赋值 "no-inner-declarations": "error", // 要求函数申明和变量申明(可选的)在程序或函数体的顶部 "no-irregular-whitespace": "error", // 禁止不规则的空白 "no-obj-calls": "error", // 禁止将 Math、JSON 和 Reflect 对象当作函数进行调用 "no-unsafe-negation": "error", // 禁止对关系运算符的左操作数应用否定操作符 "require-atomic-updates": "error", // 禁止因为 await 或 yield的应用而可能导致呈现竞态条件的赋值 "use-isnan": "error", // 禁止与 ‘NaN’ 的比拟 "valid-typeof": ["error", { requireStringLiterals: true }], // 强制 typeof 表达式与无效的字符串进行比拟 "array-callback-return": "error", // 强制数组办法的回调函数中有 return 语句 "block-scoped-var": "error", // 强制把变量的应用限度在其定义的作用域范畴内 "curly": "error", // 强制所有管制语句应用统一的括号格调 "default-case": "error", // 要求 switch 语句中有 default 分支 "dot-location": ["error", "property"], // 强制要求点操作符和属性放在同一行 "dot-notation": ["error"], // 强制尽可能地应用点号 "eqeqeq": ["error", "always"], // 要求应用 === 和 !== "max-classes-per-file": "error", // 制每个文件只能蕴含一个特定数量的类,没有更多 "no-case-declarations": "error", // 不容许在 case 子句中应用词法申明, 能够用大括号 "no-else-return": "error", // 禁止 if 语句中 return 语句之后有 else 块 "no-empty-function": "error", // 禁止呈现空函数 "no-empty-pattern": "error", // 禁止应用空解构模式 "no-fallthrough": ["error", { commentPattern: "break[\\s\\w]*omitted" }], // 禁止 case 语句落空, 如果结尾有正文满足break[\\s\\w]*omitted,则疏忽 "no-floating-decimal": "error", // 禁止数字字面量中应用前导和开端小数点 "no-global-assign": "error", // 禁止对原生对象或只读的全局对象进行赋值 "no-multi-spaces": ["error", { ignoreEOLComments: true }], // 禁止在逻辑表达式、条件表达式、申明、数组元素、对象属性、序列和函数参数四周应用多个空格 "no-octal": "error", // 禁用八进制字面量 "no-redeclare": "error", // 禁止屡次申明同一变量 "no-self-assign": "error", // 禁止自我赋值 "no-with": "error", // 禁用 with 语句 "require-await": "error", // 禁止应用不带 await 表达式的 async 函数 "no-shadow-restricted-names": "error", // 禁止将标识符定义为受限的名字 "array-bracket-newline": ["error", { multiline: true }], "array-bracket-spacing": ["error", "never"], // 禁止在数组括号头和尾呈现空格 "block-spacing": "error", // 禁止或强制在代码块中开括号前和闭括号后有空格 "brace-style": "error", // 强制在代码块中应用统一的大括号格调 "camelcase": "error", // 强制应用骆驼拼写法命名约定 "comma-dangle": ["error", "always-multiline"], // 要求应用拖尾逗号 "comma-spacing": ["error", { before: false, after: true }], // 强制在逗号前后应用统一的空格(禁止在逗号前应用空格, 要求在逗号后应用一个或多个空格) "indent": ["error", 2], // 缩进格调, 2空格 "jsx-quotes": ["error", "prefer-double"], // 强制所有不蕴含双引号的 JSX 属性值应用双引号 "key-spacing": ["error", { beforeColon: false }], // 禁止在对象字面量的键和冒号之间存在空格 "keyword-spacing": ["error", { before: true }], // 要求在关键字之前至多有一个空格 "line-comment-position": ["error", { position: "above" }], // 强制行正文只在代码上方 // "lines-between-class-members": ["error", "always"], // 要求类成员之间呈现空行 "newline-per-chained-call": ["error", { ignoreChainWithDepth: 2 }], // 要求在办法链中, 容许在同一行成链的最大深度 "no-lonely-if": "error", // 禁止 if 语句作为惟一语句呈现在 else 语句块中 "no-multiple-empty-lines": ["error", { max: 1, maxEOF: 0 }], // 强制最大间断空行数(1), 强制文件开端的没有间断空行数 "no-whitespace-before-property": "error", // 禁止属性前有空白 // "object-curly-newline": ["error", { multiline: true }], // 强制花括号内应用换行符的一致性, 如果在属性外部或属性之间有换行符,就要求有换行符 "padding-line-between-statements": [ "error", { blankLine: "always", prev: ["const", "let", "var"], next: "*" }, { blankLine: "any", prev: ["const", "let", "var"], next: ["const", "let", "var"] }, ], // 要求或禁止在语句间填充空行, 该配置要求变量申明之后都有空行 "space-infix-ops": "error", // 要求操作符四周有空格 "spaced-comment": ["error", "always"], // 强制在正文中前后增加空格 "arrow-spacing": "error", // 强制箭头函数的箭头前后应用统一的空格 "no-class-assign": "error", // 禁止批改类申明的变量 "no-const-assign": "error", // 禁止批改用const申明的变量 "no-dupe-class-members": "error", // 禁止类成员中呈现反复的名称 "no-duplicate-imports": "error", // 禁止反复模块导入 "no-new-symbol": "error", // 禁止 Symbolnew 操作符和 new 一起应用 // "no-var": "error", // 要求应用 let 或 const 而不是 var "require-yield": "error", // 要求 generator 函数内有 yield "rest-spread-spacing": ["error", "never"], // 扩大运算符及其表达式之间不容许有空格 },};

May 28, 2021 · 3 min · jiezi

关于eslint:NodeJSJQuery-is-not-defined-noundef

当拜访以后源文件内未定义的变量时,no-undef 规定将收回正告。如果你想在一个源文件里应用全局变量,举荐你在 ESLint 中定义这些全局变量,这样 ESLint 就不会收回正告了。你能够应用正文或在配置文件中定义全局变量。 要在你的 JavaScript 文件中,用正文指定全局变量,格局如下: /* global var1, var2 */这定义了两个全局变量,var1 和 var2。如果你想选择性地指定这些全局变量能够被写入(而不是只被读取),那么你能够用一个 "writable" 的标记来设置它们: /* global var1:writable, var2:writable */要在配置文件中配置全局变量,请将 globals 配置属性设置为一个对象,该对象蕴含以你心愿应用的每个全局变量。对于每个全局变量键,将对应的值设置为 "writable" 以容许重写变量,或 "readonly" 不容许重写变量。例如: { "globals": { "var1": "writable", "var2": "readonly" }}在 YAML 中: --- globals: var1: writable var2: readonly在这些例子中 var1 容许被重写,var2 不容许被重写。 能够应用字符串 "off" 禁用全局变量。例如,在大多数 ES2015 全局变量可用但 Promise 不可用的环境中,你能够应用以下配置: { "env": { "es6": true }, "globals": { "Promise": "off" }}因为历史起因,布尔值 false 和字符串值 "readable" 等价于 "readonly"。相似地,布尔值 true 和字符串值 "writeable" 等价于 "writable"。然而,不倡议应用旧值。 ...

May 24, 2021 · 1 min · jiezi

关于eslint:一键解决eslint错误

如果某个我的项目引入eslint校验语法格局,启动我的项目后控制台报了很多相干的格局问题,一个一个文件去纠正就很解体,能够在package.json中配置脚本命令帮忙咱们一键修复所有的问题

May 24, 2021 · 1 min · jiezi

关于eslint:项目集成eslintstylelintcommitlint

在理论开发中难免会有协同开发的时候,每个开发编写代码的格调、提交代码备注信息等方面的格调不尽一致,因而当时对立格调变得尤为重要。本文将在我的项目中集成eslint、stylelint、commitlint帮忙校验JS脚本代码标准、CSS脚本标准以及commit msg标准。 筹备示例工程应用create-react-app脚手架搭建示例工程,工程反对typescript create-react-app react-lint --template typescripteslint在终端执行上面命令 npx eslint --init执行后,终端会呈现人机交互,依照本人需要勾选选项即可最初会提醒须要装置以下这些插件 eslint-plugin-react@latest @typescript-eslint/eslint-plugin@latest eslint-config-standard@latest eslint@^7.12.1 eslint-plugin-import@^2.22.1 eslint-plugin-node@^11.1.0 eslint-plugin-promise@^4.2.1 @typescript-eslint/parser@latest解释以下这些插件的作用: eslint-plugin-react:请留神,反对 JSX 语法并不等同于反对 React。React 对 ESLint 无奈辨认的JSX语法利用特定的语义。如果你正在应用 React 并且想要 React 语义反对,咱们倡议你应用 eslint-plugin-react@typescript-eslint/parser:ESLint 默认应用Espree作为其解析器,@typescript-eslint/parser解析器将 TypeScript 转换成与 estree 兼容的模式,以便在ESLint中应用。eslint-config-standard:是一个比拟风行的脚本格调插件,外面提供了很多代码格调规定。@typescript-eslint/eslint-plugin:为TypeScript代码库提供lint规定。eslint-plugin-import:该插件旨在反对ES2015 +(ES6 +)导入/导出语法的查看,并避免文件门路和导入名称拼写错误的问题。eslint-plugin-node:针对node语法的查看。eslint-plugin-promise:针对Promise语法的测验。执行完npx eslint --init后会在根目录生成.eslintrc配置文件 module.exports = {env: { browser: true, es2021: true},extends: [ 'plugin:react/recommended', 'standard'],parser: '@typescript-eslint/parser', // 将 TypeScript 转换成与 estree 兼容的模式,以便在ESLint中应用parserOptions: { ecmaFeatures: { jsx: true // 启用 JSX }, ecmaVersion: 12, // 指定你想要应用的 ECMAScript 版本 sourceType: 'module'},plugins: [ 'react', // eslint-plugin-react的缩写,使ESLint反对 React 语义 '@typescript-eslint' // @typescript-eslint/eslint-plugin的缩写,为TypeScript代码库提供lint规定],rules: { semi: [2, 'always'], 'no-use-before-define': 'off' // 'React' was used before it was defined}};stylelintcommitlint

April 27, 2021 · 1 min · jiezi

关于vue.js:Vue项目去除ESLint浏览器报错

问题如下: 解决方案:我的项目下新建vue.config.js并增加以下代码: module.exports = { lintOnSave: false,}

March 26, 2021 · 1 min · jiezi

关于vue.js:vue关闭eslint亲测有效

在根目录新增 vue.config.js 文件 vue.config.js文件代码module.exports = {    lintOnSave: false}

March 23, 2021 · 1 min · jiezi

关于eslint:vue中eslintrcjs配置最详细介绍

/** * 参考文档 * 【eslint英文文档】https://eslint.org/docs/user-guide/configuring * 【eslint中文文档】http://eslint.cn/docs/rules/ *//** * eslint有三种应用形式 * 【1】js代码中通过正文的形式应用 * 【2】通过webpack的eslintConfig字段设置,eslint会主动搜寻我的项目的package.json文件中的配置 * 【3】通过配置文件的形式应用,配置文件有多种文件形式,如JavaScript、JSON 或者 YAML等 *//** * 文件疏忽 * 【】让eslint跳过特定文件的检测 * 【】通过当前工作目录下 「.eslintignore」 文件进行设置 * 其应用的是Glob门路书写形式,与「.gitignore」的应用办法雷同 * 【】也能够在 package.json 文件中,通过 eslintIgnore 参数进行设置 *//** * 文件内部分设置 * 【】eslint能够具体文件中设置特定代码的规定,罕用于跳过某条语句的检测。 * 【】登记全副规定,在代码前新建一行,增加登记 /* eslint-disable *\/ 。如果没有复原设置的语句,则下列全副代码都会跳过检测。 * 【】复原eslint,在代码前新建一行,增加登记 /* eslint-enable *\/ * 【】指定疏忽的规定,/* eslint-disable no-alert, no-console *\/ * 【】在特定行禁用,// eslint-disable-line * 【】在下一行禁用,// eslint-disable-next-line */module.exports = { /** * 根目录标识 * http://eslint.cn/docs/user-guide/configuring#using-configuration-files * http://eslint.cn/docs/user-guide/configuring#configuration-cascading-and-hierarchy * 【】标识以后配置文件为最底层的文件,无需往更上一级的文件目录中进行搜寻 * 【】默认eslint的配置文件搜寻形式是,从指标文件夹进行搜寻,遍历外部每一个文件夹,找到配置文件并层叠应用。再跳出本我的项目,往先人文件夹进行遍历 * 【】留神「~/.eslintrc」的意义,「~」是指linux上的家目录,「~/.eslintrc」是指家目录下的eslint配置文件,用于私人开发者,用于整个电脑全局束缚的。这个配置通过本配置项root去设置,设置了root,eslint检测时将不会再往上搜寻 * 【】eslint的失效规定是就近应用,越近的配置项优先级越高,笼罩其余配置项。如一个我的项目中,能够在不同文件夹中都增加配置文件,这些规定将重叠组合失效 */ root: true, // 标识以后配置文件为eslint的根配置文件,让其进行在父级目录中持续寻找。 /** * 解析器 * http://eslint.cn/docs/user-guide/configuring#specifying-parser * 【】ESLint 默认应用Espree作为其解析器 * 【】解析器必须是本地装置的一个 npm 模块。即必须依照在本地的node_module中 * 【】解析器是用于解析js代码的,怎么去了解每一个表达式,有点C++中编译器的概念,会对js进行一些语法分析,语义剖析什么的,能力判断语句符不符合规范。而不是通过简略的字符串比照。 * 【】解析器有很多,但兼容eslint的解析器有以下几个 * Espree:默认解析器,一个从Esprima中分离出来的解析器,做了一些优化 * Esprima:js规范解析器 * Babel-ESLint: 一个对Babel解析器的包装,babel自身也是js解析器的一种(不然怎么能转化为兼容性代码呢?首先须要进行js解析,能力转化)。如果咱们的代码须要通过babel转化,则对应应用这个解析器 * typescript-eslint-parser(试验) - 一个把 TypeScript 转换为 ESTree 兼容格局的解析器 */ parser: 'babel-eslint', /** * 解析器配置项 * http://eslint.cn/docs/user-guide/configuring#specifying-parser-options * 【】这里设置的配置项将会传递到解析器中,被解析器获取到,进行肯定的解决。具体被利用到,要看解析器的源码有没有对其进行利用。这里仅仅做了参数定义,做了规定,通知解析器的开发者可能有这些参数 * 【】配置我的项目有: * "sourceType": "module", // 指定JS代码起源的类型,script(script标签引入?) | module(es6的module模块),默认为script。为什么vue的会应用script呢?因为vue是通过babel-loader编译的,而babel编译后的代码就是script形式 * "ecmaVersion": 6, // 反对的ES语法版本,默认为5。留神只是语法,不包含ES的全局变量。全局变量须要在env选项中进行定义 * "ecmaFeatures": { // Features是特色的意思,这里用于指定要应用其余那些语言对象 "experimentalObjectRestSpread": true, //启用对对象的扩大 "jsx": true, //启用jsx语法 "globalReturn":true, //容许return在全局应用 "impliedStrict":true //启用严格校验模式 } */ parserOptions: {}, /** * 运行环境 * http://eslint.cn/docs/user-guide/configuring#specifying-environments * 【】一个环境定义了一组预约义的全局变量 * 【】取得了特定环境的全局定义,就不会认为是开发定义的,跳过对其的定义检测。否则会被认为扭转量未定义 * 【】常见的运行环境有以下这些,更多的可查看官网 * browser - 浏览器环境中的全局变量。 * node - Node.js 全局变量和 Node.js 作用域。 * es6 - 启用除了 modules 以外的所有 ECMAScript 6 个性(该选项会主动设置 ecmaVersion 解析器选项为 6)。 * amd - 将 require() 和 define() 定义为像 amd 一样的全局变量。 * commonjs - CommonJS 全局变量和 CommonJS 作用域 (用于 Browserify/WebPack 打包的只在浏览器中运行的代码)。 * jquery - jQuery 全局变量。 * mongo - MongoDB 全局变量。 * worker - Web Workers 全局变量。 * serviceworker - Service Worker 全局变量。 */ env: { browser: true, // 浏览器环境 }, /** * 全局变量 * http://eslint.cn/docs/user-guide/configuring#specifying-globals * 【】定义额定的全局,开发者自定义的全局变量,让其跳过no-undef 规定 * 【】key值就是额定增加的全局变量 * 【】value值用于标识该变量是否被重写,相似于const的作用。true为容许变量被重写 * 【】留神:要启用no-global-assign规定来禁止对只读的全局变量进行批改。 */ globals: { // gTool: true, // 例如定义gTool这个全局变量,且这个变量能够被重写 }, /** * 插件 * http://eslint.cn/docs/user-guide/configuring#configuring-plugins * 【】插件同样须要在node_module中下载 * 【】留神插件名疏忽了「eslint-plugin-」前缀,所以在package.json中,对应的我的项目名是「eslint-plugin-vue」 * 【】插件的作用相似于解析器,用以扩大解析器的性能,用于检测非常规的js代码。也可能会新增一些特定的规定。 * 【】如 eslint-plugin-vue,是为了帮忙咱们检测.vue文件中 <template> 和 <script> 中的js代码 */ plugins: [ 'vue' ], /** * 规定继承 * http://eslint.cn/docs/user-guide/configuring#extending-configuration-files *【】可继承的形式有以下几种 *【】eslint内置举荐规定,就只有一个,即「eslint:recommended」 *【】可共享的配置, 是一个 npm 包,它输入一个配置对象。即通过npm装置到node_module中 * 可共享的配置能够省略包名的前缀 eslint-config-,即理论设置装置的包名是 eslint-config-airbnb-base *【】从插件中获取的规定,书写规定为 「plugin:插件包名/配置名」,其中插件报名也是能够疏忽「eslint-plugin-」前缀。如'plugin:vue/essential' *【】从配置文件中继承,即继承另外的一个配置文件,如'./node_modules/coding-standard/eslintDefaults.js' */ extends: [ 'plugin:vue/essential', // 额定增加的规定可查看 https://vuejs.github.io/eslint-plugin-vue/rules/ /** * 「airbnb,爱彼迎」 * 【】有两种eslint标准,一种是自带了react插件的「eslint-config-airbnb」,一种是根底款「eslint-config-airbnb-base」, * 【】airbnb-base 包含了ES6的语法检测,须要依赖 「eslint-plugin-import」 * 【】所以在应用airbnb-base时,须要用npm额定下载 eslint-plugin-import * 【】所以eslint实际上曾经因为 airbnb-base 根底配置我的项目,增加上了 eslint-plugin-import 插件配置 * 【】所以在setting和rules里,都有 'import/xxx' 我的项目,这里批改的就是 eslint-plugin-import 配置 */ 'airbnb-base', ], /** * 规定共享参数 * http://eslint.cn/docs/user-guide/configuring#adding-shared-settings * 【】提供给具体规定项,每个参数值,每个规定项都会被注入该变量,但对应规定而言,有没有用,就看各个规定的设置了,就好比 parserOptions,解析器用不必它就不晓得了。这里只是提供这个办法 * 【】不必狐疑,经源码验证,这就是传递给每个规定项的,会当做参数传递过来,但用不必,就是具体规定的事件 */ settings: { /** * * 留神,「import/resolver」并不是eslint规定项,与rules中的「import/extensions」不同。它不是规定项 * 这里只是一个参数名,叫「import/resolver」,会传递给每个规定项。 * settings并没有具体的书写规定,「import/」只是import模块本人起的名字,原则上,它间接命名为「resolver」也能够,加上「import」只是为了更好地区分。不是强制设置的。 * 因为「import」插件很多规定项都用的这个配置项,所以并没有通过rules设置,而是通过settings共享 * 具体应用办法可参考https://github.com/benmosher/eslint-plugin-import */ 'import/resolver': { /** * 这里传入webpack并不是import插件能辨认webpack,而且通过npm装置了「eslint-import-resolver-webpack」, * 「import」插件通过「eslint-import-resolver-」+「webpack」找到该插件并应用,就能解析webpack配置项。应用外面的参数。 * 次要是应用以下这些参数,共享给import规定,让其正确辨认import门路 * extensions: ['.js', '.vue', '.json'], * alias: { * 'vue$': 'vue/dist/vue.esm.js', * '@': resolve('src'), * 'static': resolve('static') * } */ webpack: { config: 'build/webpack.base.conf.js' } } }, /** * 针对特定文件的配置 * 【】能够通过overrides对特定文件进行特定的eslint检测 * 【】特定文件的门路书写应用Glob格局,一个相似正则的门路规定,能够匹配不同的文件 * 【】配置简直与 ESLint 的其余配置雷同。笼罩块能够蕴含惯例配置中的除了 extends、overrides 和 root 之外的其余任何无效配置选项, */ overrides: [ { 'files': ['bin/*.js', 'lib/*.js'], 'excludedFiles': '*.test.js', 'rules': { 'quotes': [2, 'single'] } } ], /** * 自定义规定 * http://eslint.cn/docs/user-guide/configuring#configuring-rules * 【】根本应用形式 * "off" 或者0 敞开规定 * "warn" 或者1 将规定关上为正告(不影响退出代码) * "error" 或者2 将规定关上为谬误(触发时退出代码为1) * 如:'no-restricted-syntax': 0, // 示意敞开该规定 * 【】如果某项规定,有额定的选项,能够通过数组进行传递,而数组的第一位必须是谬误级别。如0,1,2 * 如 'semi': ['error', 'never'], never就是额定的配置项 */ rules: { /** * 具体规定 * 【】具体的规定太多,就不做介绍了,有趣味的同学能够上eslint官网查 * 【】留神 xxx/aaa 这些规定是 xxx 插件自定的规定,在eslint官网是查不到的。须要到相应的插件官网中查阅 * 【】如 import/extensions,这是「eslint-plugin-import」自定义的规定,须要到其官网查看 https://github.com/benmosher/eslint-plugin-import */ 'import/extensions': ['error', 'always', { js: 'never', vue: 'never' }], 'import/no-extraneous-dependencies': ['error', { optionalDependencies: ['test/unit/index.js'] }], 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', "no-restricted-syntax": 0, // "guard-for-in": 0, // "prefer-const": 0, // "no-else-return": 0, // "no-plusplus": 0, // 不容许应用++符号 "object-shorthand": ["error", "always", { "avoidQuotes": false }], // 去除禁止'videoData.isPause'(newValue) 的命名 "no-lonely-if": 0, // 不容许给函数参数从新赋值 "no-param-reassign": 0, // 不容许给函数参数从新赋值 "no-mixed-operators": 0, // 不容许混合应用运算符 "no-underscore-dangle": 0, // 不容许下划线作为变量名之一 "no-under": 0, // 不容许混合应用运算符 'generator-star-spacing': 'off', 'no-console': 'off', // 禁用no-console规定 'semi': ['error', 'never'], // 行尾不应用分号 'comma-dangle': ['error'], 'eqeqeq': 0, // 不须要强制应用全等 'max-len': 0, 'radix': 0,// parseInt不须要传第二个参数 'linebreak-style': 0, // 强制执行统一的换行款式,windows和mac不一样 'consistent-return': 0, // 箭头函数最初不须要最初强制return值 'no-unused-expressions': ["error", { "allowShortCircuit": true, "allowTernary": true }], // 容许您在表达式中应用三元运算符 'no-multi-spaces': ['error', { "ignoreEOLComments": true }], }}原文地址:https://www.jb51.net/article/... ...

March 21, 2021 · 3 min · jiezi

关于eslint:使用vueCli40配置eslintprettier

家喻户晓eslint只是个语法查看工具,要想做到真正的主动批改语法错误,还要考prettier。上面介绍两种形式,能够在VScode工具里应用。首先,所有的前提是你的vscode曾经装置了prettier插件,而且我倡议你开启保留时主动调整代码,文章最初附上。 上面步骤用图片代替:而后接下来的步骤两个可选项: 第一个 第二个好了,当初应用vuecli4.0生成的vue就胜利了。间接用VScode关上我的项目,而后在主目录增加这样这个文件:prettier.config.js。文件的内容次要如下: module.exports = { printWidth: 80, tabWidth: 2, useTabs: false, semi: false, // 开端不加尾号 singleQuote: true, // 默认单引号 quoteProps: 'as-needed', jsxSingleQuote: false, trailingComma: 'none', // es5对象属性最初加逗号。none不加 bracketSpacing: true, jsxBracketSameLine: false, arrowParens: 'always', htmlWhitespaceSensitivity: 'ignore', vueIndentScriptAndStyle: false, // script、style标签不缩进 endOfLine: 'lf',}当然这样还没行,在.eslintrc.js文件要多一个规定:这里是代码: 'space-before-function-paren': 'off'至此,我的项目就配置实现了。运行npm run serve能够我的项目失常运行。 补充如何在VScode开启prettier保留时运行呢?上面是步骤:关上设置->搜寻save 揭示如果我的项目理论开发过程中有哪些eslint的报错,间接在文件中敞开即可。如果有问题能够在上面发问,个别的问题博主大略可能应该能够答复。

December 8, 2020 · 1 min · jiezi

关于eslint:前端工程化webpackeslint

后面讲了,wepack一些相干的常识,这里集成一下eslint的相干配置。首先装置对应模块: 装置eslint模块装置eslint-loader模块初始化 .eslintrc.js文件配置装置实现后先初始化配置:yarn eslint --init而后答复一些问题:1.咱们抉择查看语法,发现问题,执行对立代码格调2.模块化这里咱们应用javascript modules(es6语法)3.咱们目前假如说配置的是个react我的项目,选react4.咱们这里应用ts,选yes(应用ts的时候要先把ts装置下来,不然后续操作会报错)5.最终我专门这个工程运行时浏览器Browser6.咱们应用市面上支流格调 抉择了第一个 (应用了开源社区的标准Standard: https://github.com/standard/s...)7.配置文件应用了js格局8.最初主动装置一些其余的包最初配置文件js如果有一些全局要用的货色能够增加,例如jQueryglobals:{ "jQuery":"readonly"} eslint配置正文http://eslint.cn/docs/user-gu... webpack 中loader配置 而后就是eslint联合git hooks钩子在提交之前检测代码应用husky首先进行装置 npm install husky --save-dev而后对应package.json配置husky属性配置 pre-commit 这个git钩子阶段,来进行咱们的npm run test来进行查看而后 npm scripts里对应增加test命令, test:"eslint . src/"咱们检测src目录下的所有文件. 咱们能够手动在增加一个修复命令用来手动执行 test:"eslint --fix . src/"也能够git commit时主动格式化而后再add回来:首先装置 npm install -D lint-staged而后配置package.json,通过procommit调起lint-staged { "scripts": { "precommit": "lint-staged" }, "lint-staged": { "src/**/*.js": ["eslint --fix" , "git add"] }, "husky":{ "hooks":{ "pre-commit":"npm run precommit" } }}这样就能在commit之前,先用eslint修复在git add了。 如果想和Prettier配合起来一起应用的话请参考如下:Prettier介绍与根本用法

November 24, 2020 · 1 min · jiezi

关于eslint:利用githooks-使用huskyprettiereslintstylelint进行代码校验和格式化

我的项目中须要对代码进行格式化,并且对代码进行校验。能够通过git提供的钩子在commit时能够对==git暂存区的文件==提前进行校验和格式化,如果校验不通过,则不让提交。 在我的项目中最开始运行的时候,能够把校验规定配置的等级低一些,后续再减少校验难度。 git钩子git hooks都存储在 .git/hooks文件夹,外面都是一些可执行的脚本。生成我的项目时,会生成一些带sample的文件,能够把sample去掉执行。 客户端钩子个别比拟罕用到的钩子 pre-commit:在commit音讯之前执行脚本prepare-commit-msg:能够在这里执行 提交信息的模板,合并提交、压缩提交等commit-msg: 对提交信息进行校验服务端钩子pre-receive:解决来自客户端的推送操作时执行husky 和 vue-clihusky提供了commits的各种钩子,包含pre-commit、commit-msg等。 vue-cli内置了git-hooks yorkie, yorkie是两年前从 husky 我的项目中fork进去的,关上能够看到yorkie曾经两年没有更新了。 husky 应用在pre-commit钩子中应用 lint-staged, lint-staged只会对git暂存区的文件进行校验。 装置相应依赖npm install --save-dev husky lint-stagednpm i -D prettiernpm i -D eslint-plugin-prettiernpm i -D eslint-config-prettiernpm i -D eslintnpm i -D eslint-plugin-standardnpm i -D eslint-plugin-vuenpm i -D stylelintnpm i -D stylelint-scssnpm i -D stylelint-config-standardnpm i -D stylelint-config-recess-orderhusky相应配置将上面配置拷贝到package.json中 "husky": { "hooks": { "pre-commit": "lint-staged" }},"lint-staged": { "*.{html,vue,css,scss}": [ "prettier --write", "stylelint --fix", "git add" ], "*.{js,vue}": [ "prettier --write", "eslint --fix", "git add -A" ]},Prettier配置格式化代码,通过配置.prettierrc达到我的项目中应用对立格局。能够与eslint配合应用。 ...

November 4, 2020 · 2 min · jiezi

关于eslint:使Prettier一键格式化WXSS下集

上一篇文章介绍了如何一键格式化 wxss 文件。 明天介绍利用 Git Hooks 钩子实现提交代码主动执行此前的 ESLint、Prettier 命令,以保障咱们提交的代码是不丑的。 一、Git 钩子Git 提供了一些钩子,能在特定的重要操作产生时触发自定义脚本。 当咱们执行 git init 初始化一个 Git 版本库时,Git 会默认在 .git/hooks 目录中搁置一些示例脚本(Shell 脚本)。这些示例脚本都是以 .sample 结尾,如果你想启用它们,得先移除这个后缀。 把一个正确命名(不带扩展名)且可执行的文件放入 .git/hooks 目录下,即可激活该钩子脚本。 这样一来,它就能被 Git 调用。 二、罕用钩子pre-commit该钩子在键入提交信息前运行。 它用于查看行将提交的快照,例如,查看是否有所脱漏,确保测试运行,以及核查代码。 如果该钩子以非零值退出,Git 将放弃此次提交,不过你能够用 git commit --no-verify 来绕过这个环节。 你能够利用该钩子,来查看代码格调是否统一、尾随空白字符是否存在,或新办法的文档是否适当等等。 三、huskyhusky 是一个为 Git 客户端减少 hook 的工具。当其装置到所在仓库时,它会主动在 .git/hooks 减少相应的钩子实现在 pre-commit 阶段就执行一系列保障每一个 commit 的正确性。 当然,pre-commit 阶段执行的命令,当然要保障其速度不要太慢,每次 commit 都等很久也不是好的体验。 1. 装置 npm-run-all它用于同步或者并行执行 npm script 脚本。 $ yarn add --dev npm-run-all@4.1.5于是乎,联合之前的 npm script,再通过 npm-run-all 来把几个命令串起来。 ...

September 13, 2020 · 2 min · jiezi

关于eslint:使Prettier一键格式化WXSS上集

本文将会联合 ESLint、Prettier、husky、lint-stage、gulp.js 等工具使得我的项目一键化操作,缩小在格式化、代码查看等操作上浪费时间,因为大前端真的太多货色学了,不学会“偷懒”的话,咱们就要落后更多了。 本系列文章的示例 Demo 在这里 ???? GitHub: wechat_applet_demo。 分为两篇文章介绍: 使Prettier一键格式化WXSS(上集)使Prettier一键格式化WXSS(下集)在简书也有更新 ???? 这里。 最近在做公司部门前端我的项目由 SVN 迁徙 Git 的事件,因为历史代码在此之前并没有引入相似 ESLint、Prettier 的代码查看或者格局束缚等工具。 目前部门仅剩我一人保护这十几个小程序、H5 前端我的项目。当初只有接触以前那些没有经手的我的项目,就头疼不想改。尽管思维是这样,但很无奈,谁让我只是一个“打工仔”呢! 吐槽完,入正题。 一、必备1. 新建一个微信小程序我的项目此处过于简略省略一万字... # 或者克隆 wechat_applet_demo 我的项目下来$ cd your_folder$ git clone git@github.com:toFrankie/wechat_applet_demo.git2. 应用 yarn 作为包管理工具yarn 相干的装置不在本系列教程,置信你们都懂。也不再赘述,自行搜寻。 3. 应用 Visual Studio Code 作为编辑器尽管从业有一段时间了,不好意思,前端开发我只用 VS Code,未来好长一段时间应该还是它。至于什么 WebStorm、Atom、Sublime Text 等,用过但当初曾经不会了。 Anyway,什么开发工具不重要,本人用着难受就好。 上面介绍几个与本我的项目相干的 VS Code 插件 ESLint:自动检测 ESLint Rule,不合乎规定时,在编辑页面会有正告 ️Prettier - Code formatter:可用于格式化依照以上两个插件之后,须要对编辑器做增加一些配置。 思考到多人开发的场景,而每个人的开发工具配置不尽相同,所以我把以下配置放到我的项目根目录下中,并将其退出 Git 版本控制中,这样每个人拿到我的项目都有此配置了。 门路是:your_project/.vscode/settings.json { "files.associations": { "*.wxss": "css", "*.wxs": "javascript", "*.acss": "css", "*.axml": "html", "*.wxml": "html", "*.swan": "html" }, "files.trimTrailingWhitespace": true, "eslint.workingDirectories": [{ "mode": "auto" }], "eslint.enable": true, // 是否开启 vscode 的 eslint "eslint.options": { // 指定 vscode 的 eslint 所解决的文件的后缀 "extensions": [".js", ".ts", ".tsx"] }, "eslint.validate": ["javascript"], "editor.codeActionsOnSave": { "source.fixAll.eslint": true }, "git.ignoreLimitWarning": true}二、要开始了1. yarn 初始化生成 package.json: ...

September 13, 2020 · 4 min · jiezi

关于eslint:规范代码工具eslint

标准代码工具eslint创立vue我的项目时候会问你需不需要eslint,当然要啦,晓得是好货色,然而始终不会用。 因为你抉择在vue我的项目里装置这货色他就会有一些最根本的检测,比方 一个大红 'error' 就立在那,通知你有变量未定义但还未应用。而后他就不编译了,直到你改了。有时候你只是想这些变量在那,先看看成果,之后再解决,然而...他不批准。 ok,明天终于有精力钻研一下吧(其实之前钻研过一次,只知其一;不知其二啊) 在 vue-cli3 之后的版本里,vue会吧对于eslint的配置都放在package.json里 如下: 其实只有在rules 对象外面配置一些规定就行了。 然而在package.json外面配置规定切实太奇怪了,而且还不能写正文。 拆散把package.json外面的删掉。创立.eslintrc.js 文件, 外面: module.exports = {}而后配置一些项:root,parser, parserOPtions, env, extends, plugins, rules 当然除了这些还有,不过目前这就够了。 其实配置eslint就是分两大类, eslint的解析规定 (rules之外的项)eslint按什么规定去检测代码 (rules项)这些都配置好了之后,就功败垂成了。 注: 如果是中途加了一些规定,而后代码改变范畴很大怎么办呢?package.json 中启动参数那里有lint 也就是运行 npm run lint 会帮你一键校验并改过 上面是目前配置好的本人用的一套规定: 根本都应用的正告而不是报错。 module.exports = { // 此项是用来通知eslint找以后配置文件不能往父级查找 root: true, // 解析器 https://eslint.vuejs.org/user-guide/#usage parser: 'vue-eslint-parser', parserOptions: { 'parser': 'babel-eslint', 'sourceType': 'module' }, // 指定环境 env: { // 浏览器全局 browser: true, node: true, es6: true }, // 在这里增加更多的通用规定集 https://github.com/feross/standard/blob/master/RULES.md#javascript-standard-style extends: [ 'plugin:vue/essential', 'eslint:recommended' ], // 插件 检测 .vue 文件 plugins: [ // 'html' 'vue' ], /** * "off"或者0 敞开规定敞开 * "warn"或者1 在关上的规定作为正告(不影响退出代码) * "error"或者2 把规定作为一个谬误(退出代码触发时为1) */ rules: { 'semi': 1, 'quotes': [1, 'single'], // 引号类型 'no-unused-vars': 1, // 查看未应用变量 'no-undef': 0, // 查看未定义就应用变量 'no-useless-escape': 0, // 本义符 'indent': [1, 2], // 缩进格调 'no-trailing-spaces': 1, // 一行完结前面不要有空格 'spaced-comment': 1, // 正文格调要不要有空格什么的 'space-unary-ops': [1, { 'words': true, 'nonwords': false }], 'array-bracket-spacing': [1, 'never'], // 数组前后不加空格 'object-curly-spacing': [1, 'always'], // 对象前后加空格 'space-before-blocks': 1, // 代码块前后空格 'comma-dangle': [1, 'never'], // always-multiline:多行模式必须带逗号,单行模式不能带逗号 'comma-spacing': [1, { 'before': false, 'after': true }], // 管制逗号前后的空格 'key-spacing': [1, { 'beforeColon': false, 'afterColon': true }]// 对象字面量中冒号的前后空格 }};其余一些规定参数: ...

August 6, 2020 · 3 min · jiezi

关于eslint:使用eslint和githooks统一前端风格

应用eslint和githooks对立前端格调前端团队开发时,是必须要有一个对立的前端标准的,用一套对立的标准来标准开发者,能够无效的防止在提交和拉取代码时造成的代码错乱问题,这边文章次要讲下咱们团队的代码标准应用,eslint联合vscode保留时主动修复不标准代码,githooks提交代码时的eslint校验和信息标准。增加eslintvue-cli3构建一个新我的项目(蕴含eslint模块),实现后增加.eslintrc.js配置如下: module.exports = { root: true, parserOptions: { parser: 'babel-eslint', sourceType: 'module' }, env: { browser: true }, // https://github.com/standard/standard/blob/master/docs/RULES-en.md extends: [ 'plugin:vue/base' ], // required to lint *.vue files plugins: [ 'vue' ], // add your custom rules here 'rules': { // allow paren-less arrow functions 'indent': [2, 2], // 两个空格的缩进 'quotes': [2, 'single'], // js必须应用单引号 'linebreak-style': [2, 'unix'], // 换行格调 unix/windows 'semi': [2, 'never'], // 语句强制分号结尾 // 'no-console': [1], // 不容许console语句 'no-unused-vars': [1], // 申明了变量然而没有应用检测 'space-unary-ops': [1, { 'words': true, 'nonwords': false }], // 一元运算符的前/后要不要加空格 'brace-style': [2, '1tbs', { 'allowSingleLine': false }], // 大括号格调 'comma-spacing': [2, { 'before': false, 'after': true }], // 逗号后有空格,前没有空格 'comma-style': [2, 'last'], // 逗号跟在结尾 'key-spacing': [2, { 'beforeColon': false, 'afterColon': true }], // 对象字面量中冒号的前后空格 'lines-around-comment': [ // 行前/行后备注 2, { 'beforeBlockComment': false, // 段正文的前后 'beforeLineComment': false, // 行正文的后面 'afterBlockComment': false, // 块正文的前面 'afterLineComment': false, // 行正文的前面 'allowBlockStart': true, 'allowObjectStart': true, 'allowArrayStart': true }], 'max-depth': [2, 4], // 代码最多容许4层嵌套 'max-len': [1, 1000, 2], 'max-nested-callbacks': [2, 3], // 回调嵌套深度 'max-params': [2, 5], // 函数最多只能有5个参数 'max-statements': [1, 80], // 单个函数最多80条语句 'no-array-constructor': [2], // 禁止应用数组结构器 'no-lonely-if': 2, // // 禁止else语句内只有if语句 'no-multiple-empty-lines': [2, { 'max': 3, 'maxEOF': 1 }], // 空行最多不能超过2行 'no-nested-ternary': 2, // 不应用嵌套的三元表达式 'no-spaced-func': 2, // 函数调用时 函数名与()之间不能有空格 'no-trailing-spaces': 2, // 一行完结前面不要有空格 'no-unneeded-ternary': 2, // 禁止不必要的嵌套 var isYes = answer === 1 ? true : false;简略的判断用三元表达式代替 'object-curly-spacing': [2, 'always', { // 大括号内是否容许不必要的空格 always始终容许;never始终不容许 'objectsInObjects': false, 'arraysInObjects': false }], 'arrow-spacing': 2, // =>的前/后括号 'block-scoped-var': 2, // 块语句中应用var 'no-dupe-class-members': 2, // 'no-var': 1, // 禁用var,用let和const代替 'object-shorthand': [1, 'always'], // 强制对象字面量缩写语法 'array-bracket-spacing': [2, 'never'], // 是否容许非空数组外面有多余的空格 'operator-linebreak': [2, 'after'], // 换行时运算符在行尾还是行首 // 'semi-spacing': [2, { 'before': false, 'after': false }], // 分号前后空格 'keyword-spacing': ['error'], 'space-before-blocks': 2, // 不以新行开始的块{后面要不要有空格 'block-spacing': [2, 'always'], 'space-before-function-paren': [2, 'never'], // 函数定义时括号后面要不要有空格 'space-in-parens': [2, 'never'], // 小括号外面要不要有空格 'spaced-comment': [1, 'always', { 'exceptions': ['-', '*', '+'] }], // 正文格调要不要有空格什么的 'arrow-parens': 0, // allow async-await 'generator-star-spacing': 0, // allow debugger during development 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0 }, globals: { '$': false, 'jquery': false, 'ActiveXObject': false, 'arbor': true, 'layer': false }}运行npm run lint会给出报错,运行npm run serve也会对我的项目进行eslint校验,无奈通过校验就会报错 ...

July 29, 2020 · 3 min · jiezi

vue-eslint简要配置

在前端开发过程中,难免习惯了console.log。 但是刚入门vue时,基于vue-cli 3.x,运行时终端老抛出error。一看信息,发现是不能使用console.log,另外import后的但是没有使用的变量也提示error信息,这是不错的。 1. 修改rules但的你想去掉console提示?那可以通过package.json修改rules规则。在package.json中,有这几其中的一项,在rules中添加"no-console": "off",如下: 修改完成后,重新运行即可生效。 "eslintConfig": { "root": true, "env": { "node": true }, "extends": [ "plugin:vue/essential", "eslint:recommended" ], "rules": { "no-console": "off" }, "parserOptions": { "parser": "babel-eslint" } },2. eslintConfig说明"eslintConfig": { "root": true, // 此项是用来告诉eslint找当前配置文件不能往父级查找 "env": { "node": true // 此项指定环境的全局变量,下面的配置指定为node环境 }, "extends": [ // 此项是用来配置vue.js风格,就是说写代码的时候要规范的写,如果你使用vs-code我觉得应该可以避免出错 "plugin:vue/essential", "@vue/standard" ], "rules": { // 规则配置写在这里 "no-console": "off" }, "parserOptions": { "parser": "babel-eslint" // 此项是用来指定eslint解析器的,解析器必须符合规则,babel-eslint解析器是对babel解析器的包装使其与ESLint解析 } },2.1 关闭eslint(方案1)直接把package.json上面这一段删除 ...

July 26, 2019 · 2 min · jiezi

webstorm下关闭vue的eslint

1.webstorm设置File->Settings(或Ctrl+Alt+S)中关闭eslint 2.vue wepack项目中webpack.base.conf.js关闭eslint,注释如下代码

July 12, 2019 · 1 min · jiezi

vuecli3-取消eslint-校验代码

vue create hello-world创建项目的时候选择了Linter / Formatter,所以写代码的时候会有代码规范检查,怎么才能关闭这个校验呢 1.项目创建好后会生成 .eslintrc.js文件 module.exports = { root: true, env: { node: true }, 'extends': [ 'plugin:vue/essential', // '@vue/standard',//这行注释就可以 '@vue/typescript' ], rules: { 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' }, parserOptions: { parser: '@typescript-eslint/parser' }}@vue/standard 这个注释掉就可以了

July 5, 2019 · 1 min · jiezi

Eslint笔记

1:Eslint概念ESLint 是在 ECMAScript/JavaScript 代码中识别和报告模式匹配的工具,它的目标是保证代码的一致性和避免错误。说白了就是你们小组长想让你们按照他写代码的风格去写代码(完全插件话的配置插件和规则),指不定这规则还是从哪个大团队伸手党拿来的(各种比较规范化的一些规则配置) 2:Eslint的常用配置parser:配置解析器,这个解析器是把源代码解析成AST之后去验证规则的,默认的是Espree,解析ECMAScript5特性,当然也可以使用其他的解析器,目前常用的babel-eslint、typescript-eslint-parser等parserOptions:解析的配置,列举常用配置 ecmaVersion: 解析的ECMAScript的版本,默认ECMAScript5sourceType: 制定解析的模块类型。script或者module(ECMAScript模块)env: 配置解析的环境,env的值会为eslint默认的设置一些全局的变量,比如browser,会设置浏览器中的全局变量,jQuery,添加jQuery的全局变量,这些值可以并存,给出链接查看env环境变量globals: 全局变量,源文件中访问未定义变量会no-undef,定义一些全局变量就可以使用globals console.log(globalVarible);// 'globalVarible' is not defined no-undef// globals: {// globalVarible: false;// }// will make it rightplugins: 插件,通过插件去增强eslint的功能,以及可以输出一些额外的配置,可以去npm去搜一下eslint-plugin-*去找一些常用的插件rules: 规则,这里就是常用的设置一些项目中使用的规则,规则设置可以是eslint默认的一些rules也可以是插件中一些rules,比如vue/*,0->off关闭规则 1->warn报出警告 2->error报出错误级别,如果一些规则有其他选项,可以通过数组字面量形式配置 { "rules": { "eqeqeq": "off", "curly": "error", "quotes": ["error", "double"] // 代码中使用双引号,级别为错误 } }root: 当前文件的eslint配置文件会在当前目录寻找,如果不存在,会从父级依次寻找到根目录,为了将eslint限制为该项目,可以在项目的根目录下的eslint配置root:true,会停止继续向上寻找extends: 继承的概念,从前一个配置中继承规则,同时也可以去修改继承到的规则,修改分为两类,只修改错误级别或者整体覆盖规则,比如可以使用eslint:recommended来开启eslint的核心规则,这些规则可以在下面的链接中找到eslint:recommended规则,当然也可以继承一些第三方已有的配置,比如eslint-plugin-vue module.exports = { extends: [ // add more generic rulesets here, such as: // 'eslint:recommended', 'plugin:vue/recommended' ], rules: { // override/add rules settings here, such as: // 'vue/no-unused-vars': 'error' } }以上的配置基本可以满足日常开发的需要了,inline Comments可以在源码文件中帮助我们控制Eslint,比如忽略某行验证,在源码文件中添加全局变量等等 ...

June 28, 2019 · 2 min · jiezi

到底如何配置才能在-vscode-中正常使用-eslint-和-prettier

缘起心中一直有个疑惑,添加 --fix 参数后的 eslint 是否能替代 prettier 作为 JavaScript 格式化工具。 凑巧网上正好看到一篇文章《到底如何配置,才能在vscode中正常使用eslint和prettier?》聊了类似的问题。于是,顺着这个思路,我也来说一说。 定位eslint The pluggable linting utility for JavaScript and JSXprettier Prettier is an opinionated code formatter一个是 lint 工具,一个是格式化工具,两者本各司其职,相得益彰。但偏偏 eslint 有个附属功能也能干格式化的活,于是问题随之而来——同干一件事,规则冲突时,到底该听谁的呢? 举个例子demo // .prettierrc{ "trailingComma": "all"}// code var a = [1, 2]你会惊奇的发现,prettier 并没有在数组后添加逗号。其实,prettier 的这个配置等价于 .eslintrc.js { rules: { 'comma-dangle': [2, 'only-multiline'], }}如果你希望总是显示尾部的逗号,按照下面配置,那么,冲突已发生 { rules: { 'comma-dangle': [2, 'always'], }}prettier-eslintvscode 插件 prettier-eslint 的出现,提供了一个思路: Code ➡️ prettier ➡️ eslint --fix ➡️ Formatted Code最终结果以 prettier 的为准,但这个结果可能并不符合 eslint 配置的规则。 ...

June 27, 2019 · 1 min · jiezi

代码风格统一之代码自动格式化

目标保存时自动格式化保存时不能自动格式化,使其自动格式化注意事项项目是使用 npm 或 yarn可以自己配置 ESLint 实现代码风格统一安装 ESLint安装ESLint npm i eslint# ornpm i -S eslint // --save 写入到 dependencies 对象,仅在当前项目安装并使用# ornpm i -D eslint // --save-dev 写入到 devDependencies 对象,仅在当前项目安装并在 dev 环境使用配置ESlint 有两部分需要配置,一部分是项目的配置文件,一部分是 vscode 的配置 配置 vscode 实现保存自动格式化代码风格在安装好 vscode 的 ESlint 插件后,按 Ctrl + ,打开 vscode 的设置,然后找到扩展点击,找到 ESlint 勾选 Auto Fix On Save 配置 package.js 实现统一格式化代码风格在配置好上边后,可能会遇到开发同伴没有用 vscode 或者在保存时可能没能自动格式化,这种情况可以在 package.js 中添加一条脚本命令 // 使用 ESlint 修复(--fix) 检查(--ext) 后缀为 .js 的文件 路径是当前目录"lint": "eslint --fix --ext .js ."这样只需要在命令行运行 npm run lint 就可以自动格式化代码,有报错的话需要自己手动修复,一般是写错了字符或者逻辑错误 ...

June 21, 2019 · 1 min · jiezi

vscode代码格式化和eslint

简介今天看着写的代码越来越多后,发现自己读起都有点吃力了,哈哈,自己看着眼睛痛,就准备整顿一下,毕竟这个项目还要维护很久的,找解决方案和测试解决方案就用了一个半小时,严重开始怀疑自己的智商了。下面的目标让代码看起来很公正 代码编辑器vscodeversion:版本 1.35.1 (1.35.1) 2019-06-12T14:19:05.197Z更新的 vscode代码格式化因为目前公司就我一个后端,项目也不大,所以就采用这种方案,简单快捷粗暴。 一.点击code->preferences->settings 点击右上角{}二.用户自定义设置(/User/settings.json)添加代码"editor.formatOnType": true,"editor.formatOnSave": trueESLint配置ESLint不仅有代码规范而且还有一部分语法检查的功能,ex:命令规范(驼峰) a==b警告提示a===b...ESLint可以有效的规范代码,以后还是会采用,培养自己的规范的编码习惯https://cn.eslint.org/ 1.vscode安装ESLint这里以配置eslint-config-aribnb的例子vscode在extensions中安装ESLint 2.npm安装npm install -g eslint3.创建.eslintrc文件softwaredeMacBook-Pro:koa-pro software$ "eslint --init"? How would you like to configure ESLint? "Use a popular style guide"? Which style guide do you want to follow? "Airbnb" (https://github.com/airbnb/javascript)? Do you use React? "No"? What format do you want your config file to be in? "JSON"Checking peerDependencies of eslint-config-airbnb-base@latestThe config that you have selected requires the following dependencies:eslint-config-airbnb-base@latest eslint@^4.19.1 || ^5.3.0 eslint-plugin-import@^2.14.0? Would you like to install them now with npm? "Yes"Installing eslint-config-airbnb-base@latest, eslint@^4.19.1 || ^5.3.0, eslint-plugin-import@^2.14.0npm WARN koa-pro@1.0.0 No repository field.+ eslint@5.16.0+ eslint-plugin-import@2.17.3+ eslint-config-airbnb-base@13.1.0updated 3 packages and audited 7469 packages in 23.559sfound 370 vulnerabilities (1 low, 367 moderate, 2 high) run `npm audit fix` to fix them, or `npm audit` for detailsSuccessfully created .eslintrc.json file in /Users/software/workspace/Me/huafu/koa-pro项目目录下将会生成一个eslintrc.json的文件 ...

June 19, 2019 · 1 min · jiezi

代码规范箭头函数的四种写法

在JS中箭头函数根据是否书写大小括号可分为以下四种情况。 // 不省略const fun = (value) => { return value;};// 省略小括号const fun = value => { return value;};// 省略大括号const fun = (value) => value;// 省略大括号与小括号const fun = value => value;airbnb-javascript关于箭头函数的检查如果函数体没有副作用的结构,省略大括号,否则使用大括号。参考这里的副作用结构是指函数内的代码影响了函数外的代码。 const even = [];[1, 2, 3, 4].forEach((num) => { if (num % 2 === 0) { even.push(num); }};注意:airbnb文档没写,函数内代码块复杂时也需要大括号。 如果参数为一个,省略小括号,否则使用小括号。参考《Google JavaScript Style Guide》中箭头函数的提议大括号可有可无,建议始终写小括号。参考 个人看法针对不同的函数结构选择是否使用括号的方式会带来两个问题: 代码不一致:就像一个PPT中不应该一会左对齐一会右对齐一会居中对齐。省略括号不易扩展:单个参数变多个参数要加小括号,直接返回代码变为多行计算后再返回代码需要增加大括号我认为有这种争议时应该选择兼容性更强的不省略大括号与小括号,在配置种关闭了对这四种写法的检查,但是遵循约定大于配置的原则,始终按照一种风格书写。 eslint的配置根据文档,在eslint中以下两个模块控制以上四种情况的书写,可对其进行配置(代码如下) arrow-parensarrow-body-style// .eslintrc.jsmodule.exports = { extends: 'airbnb', rules: { 'arrow-parens': 'off', 'arrow-body-style': 'off', },};

May 24, 2019 · 1 min · jiezi

ESLint-工作原理探讨

摘要: 彻底理解ESLint。 原文:ESLint 工作原理探讨作者:zhangwangFundebug经授权转载,版权归原作者所有。 ESLint 可谓是现代前端开发过程中必备的工具了。其用法简单,作用却很大,使用过程中不知曾帮我减少过多少次可能的 bug。其实仔细想想前端开发过程中的必备工具似乎也没有那么多,ESLint 做为必备之一,值得深挖,理解其工作原理。 在正式讨论原理之前,我们还是先来聊聊为什么要使用 ESLint。 为什么要使用 ESLintESLint 其实早在 2013年 7月就发布了,不过我首次使用,是不到三年前的一个下午(清楚的记得那时候使用的编辑器主要还是 sublime text3 )。我在一个项目中尝试了 ESLint ,输入 eslint init 后按照提示最终选择了非常出名的 airbnb 的代码风格,结果整个项目几乎所有文件都被标红,尝试使用 --fix 却无法全部修复,内心十分沮丧。 现在想想,那时候的我对 ESLint 的认知是不完整的,在那时候的我看来 ESLint 就是辅助我们保持代码风格一致的工具,airbnb 的 js 风格备受大家推崇。 那时候的我知道保持代码风格的一致性能增加可读性,更便于团队合作。不过一致没有去深想,为什么大家会推崇某特定的风格,这背后肯定是有着特殊的意义。 保持一致就意味着要对我们编写的代码增加一定的约束,ESLint 就是这么一个通过各种规则(rule)对我们的代码添加约束的工具。JS 做为一种动态语言,写起来可以随心所欲,bug 遍野,但是通过合适的规则来约束,能让我们的代码更健壮,工程更可靠。 在官方文档 ESLint - rules 一节中,我们可以看到官方提供的了大量的规则,有推荐使用的("eslint:recommended"),也有默认不启用的,还有一些废弃的。 这和现实生活是一致的,现实生活中,我们也在不自觉中遵守和构建着各种不同的规则。新的规则被构建是因为我们在某方面有了更多的经验总结,将其转变为规则可能是希望以后少踩坑,也能共享一套最佳实践,提高我们的工作效率。 就像我们提交代码时,把希望大家共同遵守的约定转变为 MR 模板,希望所有人都能遵守。 在我看来 ESLint 的核心可能就是其中包含的各种规则,这些规则大多为众多开发者经验的结晶: 有的可以帮我们避免错误;有的可以帮我们写出最佳实践的代码;有的可以帮我们规范变量的使用方式;有的可以帮我们规范代码格式;用的可以帮我们更合适的使用新的语法;…之前看过一张图能很好的描述 ESLint 的作用: 如果你不使用 ESLint ,你的代码只能靠人工来检查,格式乱七八糟,运行起来 bug 丛生,你的合作者或用户会怒气冲冲????;如果你使用了 ESLint ,你的代码有可靠的机器进行检查,格式规则,运行起来问题会少很多,大家都会很满意。总得来说,ESLint 允许我们通过自由拓展,组合的一套代码应当遵循的规则,可以让我们的代码更为健壮,其功能不仅在于帮我们的代码风格保持统一,还能帮我们用上社区的最佳实践,减少错误。 ESLint 竟然这么重要,下面我们来看看 ESLint 的用法及这些用法是怎么生效的。 ...

May 23, 2019 · 7 min · jiezi

10秒钟构建你自己的造轮子工厂-2019年githubnpm工程化协作开发栈最佳实践

灵魂拷问:你有发布过npm包吗?发起过多人协作的github开源项目吗?据统计,70%的前端工程师从来没发布过npm包 对于初中级前端,维护开源项目是比较遥远的, 而前端工具的变化太快,高级前端也难以确定自己能写出开发栈的最佳实践,只能不断花时间摸索。 发起一个github/npm工程协作项目,门槛太高了!! 最基础的问题,你都要花很久去研究: 如何在项目中全线使用es2017代码? 答案是babel如何统一所有协作者的代码风格? 答案是eslint + prettier如何测试驱动开发,让项目更健壮? 答案是jest如何持续化集成,方便更多协作者参与项目? 答案是circleci这四样工具的配置,是每个github项目都会用上的。另外,gitignore配置editconfigreadmelisence。。。也是必不可缺的。 你可能需要花数天时间去研究文档、数天时间去做基础配置。 这样的时间成本,可以直接劝退大多数人。 然而,有的开发者,我们仰视的“神”,一年可以发上百个github/npm项目,其中更有几千上万的Star的大项目。 他们是正常人吗? 他们如何这样批量的造轮子的? 今天,这篇文章,让你第一次,拥有“神”的能力。 文章不是很长,但对你的前端生涯可能产生决定性影响,你会发现你与“神”之间的距离如此之近。 一切配置标准、正式、现代化。从此,你随手写的小工具、小函数,可以不断吸引协作开发者,膨帐成大型协作项目。就像当初的尤雨溪仿写angular时一样的起点。 你可以先来体验一下“轮子工厂”,在命令行输入: npx lunz myapp一路回车,然后试一试yarn lint,yarn test,yarn build命令 第一部分: 2019年github + npm工程化协作开发栈最佳实践 第二部分: 使用脚手架,10秒钟构建可自由配置的开发栈。 2019年github + npm工程化协作开发栈最佳实践我们将花半小时实战撸一个包含package.json, babel, jest, eslint, prettify, gitignore, readme, lisence的标准的用于github工程协作的npm包开发栈。 如果能实际操作,就实际操作。如果不能实际操作,请在bash下输入npx lunz npmdev获得同样的效果。 1. 新建文件夹mkdir npmdev && cd npmdev2. 初始化package.jsonnpm initpackage name: 回车version: 回车description: 自己瞎写一个,不填也行entry point: 输入`dist/index.js`test command: 输入`npx jest`git repository: 输入你的英文名加上包名,例如`wanthering/npmdev`keywords: 自己瞎写一个,不填也行author: 你的英文名,例如`wanthering`license: 输入`MIT`在package.json中添加files字段,使npm发包时只发布dist ...

May 13, 2019 · 7 min · jiezi

用vscode开发vue应用

现在用VSCode开发Vue.js应用几乎已经是前端的标配了,但很多时候我们看到的代码混乱不堪,作为一个前端工程师,单引号双引号乱用,一段有分号一段没有分号,有的地方有逗号有的地方没有逗号,空格回车都对不齐,还说自己做事认真,这不是开玩笑的事情。 我们今天从头开始,完整地讲述一下一个重度代码洁癖患者该如何用vscode开发vue,以及如何把一个已经可以宣判死刑的全身各种格式错误几万条的项目整容成标准美女。 从安装开始为了准确起见,我们把vscode里所有插件全部禁用,把用户设置清空,以让它尽可能恢复成原始的样子: 作为代码洁癖患者,对于系统的版本要求一定也是最苛刻的,不管什么时候,都让我们把所有的系统能升级的都升级到最高版本: npm install -g @vue/cli然后,我们开始创建项目: vue create hello-world在这里,一定要选择第一项:babel + eslint,这两个是必不可少的。我见到有些人嫌eslint麻烦,居然在项目建立好之后手工把eslint关掉的,简直无语。 安装完毕: 我们先不急着执行,执行代码是最容易的事情,我们先打开代码看一下: 好吧,至少我们需要先安装vetur插件。这几乎已经确定是开发vue项目的标配了,即使我不说,vscode也会强烈建议你安装它。 装上vetur以后多少有点人样了。接下来我们来试一试能不能自动格式化,这部分才是洁癖患者的最爱。胡乱加几个空格,然后保存试试看: 不能格式化,连个提示都没有! 用lint格式化就算vscode里的vetur不能帮我们自动格式化,好在package.json命令里还有一个lint命令,我们看看lint命令能不能帮我们自动格式化: lint居然说没有错误!明明就是多了很多空格的错误好吧,为什么? 这是因为缺省的vue-cli没有为我们安装@vue/prettier插件,我们先来手工安装一下: yarn add -D @vue/eslint-config-prettier然后在package.json或者.eslintrc.js或者其它什么你设置eslint的地方,给它加上: "extends": [ "plugin:vue/essential", "eslint:recommended", "@vue/prettier" ],特别是最后这一个@vue/prettier,非常重要。然后再执行yarn lint。多余的空格被自动干掉了,但是我们发现有一些地方同时也被篡改了: 所有的单引号被变成双引号了,原本行尾没有的分号被加上了分号。这是为什么呢?因为我们虽然引入了prettier,但是还没有对prettier做设置,我们在项目的根目录下创建一个.prettierrc.js文件,然后在其中加入: module.exports = { semi: false, singleQuote: true}再次执行yarn lint,现在我们看到lint已经能够起作用了。它不但能把我们多余插入的空格删掉,并且能按照规则把双引号变成单引号,把行尾多余的分号删掉。当然,关于行尾加不加分号这是一个哲学命题,你可以根据你个人的喜好自行决定。在这里,我们权且按照vue-cli的标配执行。 到这一步很关键,假设你拿到一个烂的不再烂的vue项目,里面有几千个.vue文件,几万个各种格式错误,也都能通过yarn lint这一行命令把它们全部修正过来! 在vscode里格式化事情还没有完,我们注意到虽然yarn lint命令能在编写完代码之后帮我们格式化,但是既然我们是用vscode进行开发,我们当然希望能在vscode里直接看到对于错误的标注。 这时候我们需要在vscode里再安装一个插件eslint。 你以为安装上eslint插件就行了吗?不行的。因为eslint并不知道我们的.vue文件里面包含了js语法,所以还需要打开我们的vscode设置文件。 注意:这里一定要设置到项目的设置里,而不要只是设置到你自己个人的设置里,否则你团队的小伙伴随便一改又乱掉了。正确的方法是在你项目的文件夹下有一个.vscode文件夹,而vue最讨厌的地方是它居然会把这个文件夹放到.gitignore里,这个错误你必须要纠正过来,也就是说从.gitignore文件里把.vscode删掉。切切。在你项目的settings.json里文件里添加以下代码: { "eslint.autoFixOnSave": true, "eslint.validate": [ "javascript", "javascriptreact", { "language": "vue", "autoFix": true } ],}这时候所有错误都被标注出来了,注意看左侧,一定要让这个settings.json文件是绿色的,而不能是灰色的,如果是灰色的,请检查你的.gitignore文件: ...

May 2, 2019 · 1 min · jiezi

配置eslint规范项目代码风格

为什么要使用eslint你在接手一个项目的维护迭代任务,阅读代码的时候是否会因为项目中充斥着各种风格的代码而感到头疼?没错,eslint就是为了解决这类问题eslint能做什么?1.代码风格错误提示配置好eslint后,如果代码风格与配置描述的不符,eslint会提示代码中存在的风格问题;一般提示的情形有:1.编辑器内,大多数编辑器配置好后能读取eslint配置文件并在文件中进行相应提示2.eslint-loader配合webpack-dev-server能在页面中弹出相应错误内容3.eslint通过命令号对代码进行风格检查2.修复相应风格问题eslint –fix 命令能修复一部分代码风格问题;能修复的范围见https://cn.eslint.org/docs/ru…常见问题如何在局部禁用eslint/* eslint-disable no-alert, no-console /alert(‘foo’);console.log(‘bar’);/ eslint-enable no-alert, no-console */以下是详细配置{ root: true,// 直接在根目录读取配置文件,能提高eslint性能 “env”: { “node”: true,// 允许使用nodejs相关的变量,下同 “es6”: true, “browser”: true, “commonjs”: true }, “extends”: “standard”, // 继承eslint-config-standard中的配置,可以在rules中覆盖 “parser”: “babel-eslint”, // 为eslint制定parser,默认的Esprima只允许已纳入es标准的内容 “plugins”: “vue”,// 使用eslint-plugin-vue,使eslint能对vue语法进行处理,相应rules见https://eslint.vuejs.org/rules/ “rules”: { “no-alert”: 2, “indent”: [“error”, 4, { “SwitchCase”: 1, “VariableDeclarator”: 1, “outerIIFEBody”: 1, “MemberExpression”: 1, “FunctionDeclaration”: { “parameters”: 1, “body”: 1 }, “FunctionExpression”: { “parameters”: 1, “body”: 1 }, “CallExpression”: { “arguments”: 1 }, “ArrayExpression”: 1, “ObjectExpression”: 1, “ImportDeclaration”: 1, “flatTernaryExpressions”: false, “ignoreComments”: false }] }} ...

March 10, 2019 · 1 min · jiezi

ESLint简介

ESLint简介ESLint是一个用来识别 ECMAScript 并且按照规则给出报告的代码检测工具,使用它可以避免低级错误和统一代码的风格。如果每次在代码提交之前都进行一次eslint代码检查,就不会因为某个字段未定义为undefined或null这样的错误而导致服务崩溃,可以有效的控制项目代码的质量。在许多方面,它和 JSLint、JSHint 相似,除了少数的例外:ESLint 使用 Espree 解析 JavaScript。ESLint 使用 AST 去分析代码中的模式。ESLint 是完全插件化的。每一个规则都是一个插件并且你可以在运行时添加更多的规则。使用安装ESLint 支持多种安装方式,可以通过 npm 来安装,也可以在 webpack(eslint-loader) 和 Gulp.js(gulp-eslint) 中使用。全局安装npm i -g eslint局部安装(推荐)npm i -D eslint初始化安装完毕后,接下来新建一个配置文件.eslintrc.js,或者使用如下的命令行来自动生成,命令如下:eslint –init配置注意:如果你之前使用的版本低于 1.0.0,请查看 迁移指南。运行 eslint –init 之后,.eslintrc 文件会在你的文件夹中自动创建。文件的内容大体如下:{ “env”: { “es6”: true, “node”: true }, “extends”: “eslint:recommended”, “parserOptions”: { “sourceType”: “script” }, “rules”: { “no-console”: 0, “no-unused-vars”: “error”, “no-use-before-define”: “error”, “linebreak-style”: [ “error”, “unix” ], “quotes”: [ “error”, “single” ], “semi”: [ “error”, “always” ], “curly”: [“error”, “all”], “default-case”: “error”, “no-else-return”: “error”, “no-empty-function”: “error”, “no-implicit-coercion”: “error”, “no-invalid-this”: “error”, “no-loop-func”: “error”, “no-multi-spaces”: “error”, “no-new-func”: “error”, “no-useless-return”: “error”, “global-require”: “error”, “no-path-concat”: “error”, “no-sync”: “error”, “array-bracket-spacing”: [ “error”, “never” ], “block-spacing”: [ “error”, “always” ], “brace-style”: [ “error”, “1tbs” ], “camelcase”: “error”, “comma-dangle”: [ “error”, “always-multiline” ], “comma-spacing”: [ “error”, { “before”: false, “after”: true } ], “comma-style”: [ “error”, “last” ], “key-spacing”: [ “error”, { “beforeColon”: false, “afterColon”: true } ], “lines-around-comment”: [ “error”, { “beforeBlockComment”: true } ], “newline-after-var”: [ “error”, “always” ], “newline-before-return”: “error”, “no-multi-assign”: “error”, “max-params”: [1, 3], “new-cap”: [ “error”, { “newIsCap”: true, “capIsNew”: false } ], “no-multiple-empty-lines”: [ “error”, { “max”: 2 } ], “no-shadow-restricted-names”: “error”, “no-undef-init”: “error”, “keyword-spacing”: “error”, “space-before-blocks”: [ “error”, “always” ] }}ESlint支持的可配置信息主要分为3类:Environments:Javascript 脚步将要运行在什么环境中(如:nodejs,browser,commonjs等),ESlint支持的所有环境都可以在官网查到。Globals:执行代码时脚步需要访问的额外全局变量。Rules:开启某些规则,也可以设置规则的等级。检测规则接下来,可以在配置文件中设置一些规则。ESLint规则的三种级别:“off” 或者 0:关闭规则。“warn” 或者 1:打开规则,并且作为一个警告(不影响exit code)。“error” 或者 2:打开规则,并且作为一个错误(exit code将会是1)。例如,下面的一些配置规则:“no-console”:“off” 禁用 console。“no-unused-vars”:2 禁止出现未使用过的变量。“no-use-before-define”:2 不允许在变量定义之前使用它们。“linebreak-style”:[2, “unix”] 强制使用一致的换行风格。“quotes”: [“error”, “single”] 强制使用一致的单引号。“semi”:[“error”, “always”] 控制行尾部分号。“curly”:[“error”, “all”] 强制所有控制语句使用一致的括号风格。“default-case”: “error” switch 语句强制 default 分支,也可添加 // no default 注释取消此次警告。“no-else-return”:“error” 禁止 if 语句中有 return 之后有 else。“no-implicit-coercion”: “error” 禁止出现空函数.如果一个函数包含了一条注释,它将不会被认为有问题。“no-invalid-this”: “error” 禁止 this 关键字出现在类和类对象之外。“no-loop-func”:“error” 禁止在循环中出现 function 声明和表达式。“no-multi-spaces”:“error” 禁止使用多个空格。“no-new-func”:“error” 禁止对 空Function 对象使用 new 操作符。“no-useless-return”:“error” 禁止没有任何内容的return;“global-require”: “error” 要求 require() 出现在顶层模块作用域中。“no-path-concat”: “error” 禁止对 dirname 和 filename进行字符串连接"no-sync": “error” 禁用同步方法。“array-bracket-spacing”: [“error”, “never”] 指定数组的元素之间要以空格隔开(, 后面), never参数:[ 之前和 ] 之后不能带空格,always参数:[ 之前和 ] 之后必须带空格。“block-spacing”: [“error”, “always”] 禁止或强制在单行代码块中使用空格(禁用)。“brace-style”: [“error”, “1tbs”]“camelcase”: “error” 强制驼峰法命名。“comma-dangle”: [“error”, “always-multiline”] 数组和对象键值对最后一个逗号, never参数:不能带末尾的逗号, always参数:必须带末尾的逗,always-multiline:多行模式必须带逗号,单行模式不能带逗号号。“comma-spacing”: [“error”, { “before”: false, “after”: true }] 控制逗号前后的空格。“comma-style”: [“error”, “last”] 控制逗号在行尾出现还是在行首出现 (默认行尾)。“key-spacing”: [“error”, { “beforeColon”: false, “afterColon”: true }] 该规则规定了在对象字面量语法中,key和value之间的空白,冒号前不要空格,冒号后面需要一个空格。“lines-around-comment”: [“error”, { “beforeBlockComment”: true }] 要求在注释周围有空行 ( 要求在块级注释之前有一空行)。“newline-after-var”: [“error”, “always”] 要求或禁止 var 声明语句后有一行空行。“newline-before-return”: “error” 要求 return 语句之前有一空行。“no-multi-assign”: “error” 链接变量的赋值可能会导致意外的结果并难以阅读,不允许在单个语句中使用多个分配。“max-params”: [1, 3] function 定义中最多允许的参数数量。“new-cap”: [“error”, { “newIsCap”: true, “capIsNew”: false}] 构造函数首字母大写。“no-multiple-empty-lines”: [“error”, {“max”: 2}] 空行不能够超过2行。“no-shadow-restricted-names”: “error” 禁止对一些关键字或者保留字进行赋值操作,比如NaN、Infinity、undefined、eval、arguments等。“no-undef-init”: “error” 禁止把undefined赋值给一个变量。“keyword-spacing”: “error” keyword 前后需要空格。“space-before-blocks”: [“error”,“always”] 强制在块之前使用一致的空格。忽略检测既然有检测的规则,那么必然有忽略检测的配置。要新增忽略检测的规则,首先要在项目根目录创建一个 .eslintignore 文件告诉 ESLint 去忽略掉不需要检测的文件或者目录。或者通过package.json文件设置需要忽略检测的对象,例如:{ “name”: “my_project”, “version”: “1.0.0”, “main”: “index.js”, “scripts”: { “test”: "" }, “eslintConfig”: { // 也可配置eslint “env”: { “es6”: true, “node”: true } }, “eslintIgnore”: [“test.js”]}Gulp中使用ESLint除了npm方式之外,ESLint还支持Gulp插件方式使用,使用之前需要先安装插件。npm install gulp-eslint如果要使用gulp-eslint进行eslint规则的校验,可以使用下面的方式:var gulp = require(‘gulp’);var eslint = require(‘gulp-eslint’);gulp.task(’lint’,function(){ return gulp.src([‘app/**/*.js’]) //指定的校验路径 .pipe(eslint({configFle:"./.eslintrc"})) //使用你的eslint校验文件 .pipe(eslint.format())});ESLint技巧eslint-config-standardeslint-config-standard是一个标准的ESLint规则检测库,因此只需要安装这个库就可以省去配置ESLint规则。然后,在项目的根目录里面手动创建一个.eslintrc文件,然后在里面添加如下代码:{ “extends”: “standard”}执行完以上步骤,就可以使用ESLint这个工具来校验项目里的代码。在Vue项目里,.vue文件写的是类似于html的格式,不是标准的JavaScript文件,ESLint无法直接识别.vue文件里的JavaScript代码,那么这个时候我们需要去安装一个工具,安装命令如下: npm i eslint-plugin-html -D因为在vue文件里面写JavaScript代码也是写在script标签里面的,这个插件的作用就是识别一个文件里面script标签里面的JS代码,官方也是这么推荐的。所以我们要在.eslintrc文件里面新增一段脚本:{ “extends”: “standard”, “plugins”: [ “html” ]}执行完以上步骤后,我们跳转到package.json文件里面的scripts里面新增一条命令:“lint”: “eslint –ext .js –ext .jsx –ext .vue src/“在上面的脚本命令中,ext后面需要写上指定检测文件的后缀,如.js、.jsx、 .vue等,紧接着后面要写上一个参数,这个参数就是我们要检测哪个目录下面的文件,一般项目文件都在src下面,所以在后面写上src/就好。现在我们就可以到terminal里面输入$ npm run lint,来检验项目里的代码是否符合ESLint的规则。ESLint自动修复报错一般来说,当我们使用命令“npm run lint”检测JavaScript的时候,基本上都会出现非常的多报错,基本上就是满屏的error和warning。在报这么多的错误之后,如果我们一条一条地去修复,就会变的非常的麻烦,相信刚接触ESLint的童鞋都深有体会。其实这些错误都可以让ESLint帮助我们自动地修复。具体来说,只需要在package.json文件里面的scripts里面新增一条命令即可:“lint-fix”: “eslint –fix –ext .js –ext .jsx –ext .vue src/“当我们再去terminal中执行命令:$ npm run lint-fix,你会发现没有那么多飘红的报错,也没有满屏的error和warning了。当然,还有一种万能方法,就是在报错的JS文件中第一行写上/ eslint-disable /,具体可以参考Command line Interfaceeslint-loader有时候,我们希望在项目开发的过程当中,每次修改代码都能够自动进行ESLint的检查。因为在我们改代码的过程中去做一次检查,如果有错误,我们就能够很快地去定位到问题并解决问题。这时候我们可以借助eslint-loader插件。npm i eslint-loader babel-eslint -D执行完安装操作后,我们还需要在.eslintrc文件里面配置如下脚本:{ “extends”: “standard”, “plugins”: [ “html” ], “parser”: “babel-eslint”}为什么我们要配置parser呢?因为我们的项目是基于webpack的,项目里的代码都是需要经过babel去处理的。babel处理的这种语法可能对ESLint不是特别的支持,然后我们使用loader处理ESLint的时候就会出现一些问题。所以一般来说,我们用webpack和babel来进行开发的项目,都会指定它的parser使用babel-eslint。同时,使用webpack方式构建的项目,还需要在webpack.config.base.js的module下面的rules里面添加一个如下脚本:rules: [ { test: /.(vue|js|jsx)$/, loader: ’eslint-loader’, exclude: /node_modules/, enforce: ‘pre’ }, ……]然后我们就可以使用命令 $ npm run dev就可以在开发环境进行ESLint错误检测。附:https://cn.eslint.org/https://www.imooc.com/article… ...

February 27, 2019 · 3 min · jiezi

从0到1使用VUE-CLI3开发实战(六):这是一个有代码洁癖的项目

从0到1使用VUE-CLI3开发实战(六):这是一个有代码洁癖的项目一个小故事一天我路过一座桥,碰巧看见一个人想跳河自杀。我跑过去对他大喊道:“别跳,别死啊。”“为什么不让我跳?”他说。“因为还有很多东西值得我们活下去啊。”“有吗?比如说?”“呃……你做什么工作?”“前端工程师。”我说:“我也是!瞧,有共同点了吧。你是使用JavaScript还是TypeScript?”“JavaScript。”“我也是。字符串用单引号也可以用双引号?”“双引号。”“去死吧!你这个异教徒人渣!”我一把将他推下桥去。故事权且供大家一乐,实际开发过程中,关于代码风格,我们很难区分谁对谁错,不同的人有不同偏好,唯有强制要求才能规避争论。新手程序员对自己没有代码规范要求,就会出现同一个项目不同地方的代码风格都无法保持一致,时间久了回头看自己代码都觉得惨不忍睹,所以程序员对哪怕自己不收拾打扮,对代码却都有极高的审美要求。在最开始我们用vue-cli来初始化项目的时候,已经给我们提供了代码检查及格式化工具,今天我们就来看看如何配置Eslint+prettier。Eslint+Prettier配置什么是ESlint?ESLint 是一个开源的 JavaScript 代码检查工具,由 Nicholas C. Zakas 于2013年6月创建。代码检查是一种静态的分析,常用于寻找有问题的模式或者代码,并且不依赖于具体的编码风格。对大多数编程语言来说都会有代码检查,一般来说编译程序会内置检查工具。JavaScript 是一个动态的弱类型语言,在开发中比较容易出错。因为没有编译程序,为了寻找 JavaScript 代码错误通常需要在执行过程中不断调试。像 ESLint 这样的可以让程序员在编码的过程中发现问题而不是在执行的过程中。ESLint 的初衷是为了让程序员可以创建自己的检测规则。ESLint 的所有规则都被设计成可插入的。ESLint 的默认规则与其他的插件并没有什么区别,规则本身和测试可以依赖于同样的模式。为了便于人们使用,ESLint 内置了一些规则,当然,你可以在使用过程中自定义规则。ESLint 使用 Node.js 编写,这样既可以有一个快速的运行环境的同时也便于安装。什么是Prettier?Prettier的中文意思是“漂亮的、机灵的”,也是一个流行的代码格式化工具的名称,它能够解析代码,使用你自己设定的规则来重新打印出格式规范的代码。Prettier具有以下几个有优点:可配置化支持多种语言集成多数的编辑器简洁的配置项实战配置vue-cli3已经将大部分配置工作做好了,我们只需要在.eslintrc.js文件中添加我们的规则即可,我把大部分规则及其含义都写在了我的配置文件中,大家可以直接看代码参考:module.exports = { root: true, env: { node: true }, extends: [“plugin:vue/essential”, “@vue/prettier”], rules: { “no-console”: process.env.NODE_ENV === “production” ? “error” : “off”, “no-debugger”: process.env.NODE_ENV === “production” ? “error” : “off”, “prettier/prettier”: [ “error”, { // tab缩进大小,默认为2 “tabWidth”: 2, // 使用tab缩进,默认false “useTabs”: false, // 使用分号, 默认true “semi”: false, // 使用单引号, 默认false(在jsx中配置无效, 默认都是双引号) “singleQuote”: true, // 行尾逗号,默认none,可选 none|es5|all // es5 包括es5中的数组、对象 // all 包括函数对象等所有可选 “trailingComma”: ’none’, // 对象中的空格 默认true // true: { foo: bar } // false: {foo: bar} “bracketSpacing”: true, // JSX标签闭合位置 默认false // false: <div // className="" // style={{}} // > // true: <div // className="" // style={{}} > “jsxBracketSameLine”: false, // 箭头函数参数括号 默认avoid 可选 avoid| always // avoid 能省略括号的时候就省略 例如x => x // always 总是有括号 “arrowParens”: ‘always’ } ], “no-alert”: 0, //禁止使用alert confirm prompt “no-array-constructor”: 2, //禁止使用数组构造器 “no-bitwise”: 0, //禁止使用按位运算符 “no-caller”: 1, //禁止使用arguments.caller或arguments.callee “no-catch-shadow”: 2, //禁止catch子句参数与外部作用域变量同名 “no-class-assign”: 2, //禁止给类赋值 “no-cond-assign”: 2, //禁止在条件表达式中使用赋值语句 “no-console”: 0, //禁止使用console “no-const-assign”: 2, //禁止修改const声明的变量 “no-constant-condition”: 2, //禁止在条件中使用常量表达式 if(true) if(1) “no-continue”: 0, //禁止使用continue “no-control-regex”: 2, //禁止在正则表达式中使用控制字符 “no-debugger”: 2, //禁止使用debugger “no-delete-var”: 2, //不能对var声明的变量使用delete操作符 “no-div-regex”: 1, //不能使用看起来像除法的正则表达式/=foo/ “no-dupe-keys”: 2, //在创建对象字面量时不允许键重复 {a:1,a:1} “no-dupe-args”: 2, //函数参数不能重复 “no-duplicate-case”: 2, //switch中的case标签不能重复 “no-else-return”: 2, //如果if语句里面有return,后面不能跟else语句 “no-empty”: 2, //块语句中的内容不能为空 “no-empty-character-class”: 2, //正则表达式中的[]内容不能为空 “no-empty-label”: 0, //禁止使用空label “no-eq-null”: 2, //禁止对null使用==或!=运算符 “no-eval”: 1, //禁止使用eval “no-ex-assign”: 2, //禁止给catch语句中的异常参数赋值 “no-extend-native”: 2, //禁止扩展native对象 “no-extra-bind”: 2, //禁止不必要的函数绑定 “no-extra-boolean-cast”: 2, //禁止不必要的bool转换 “no-extra-parens”: 2, //禁止非必要的括号 “no-extra-semi”: 2, //禁止多余的冒号 “no-fallthrough”: 1, //禁止switch穿透 “no-floating-decimal”: 2, //禁止省略浮点数中的0 .5 3. “no-func-assign”: 2, //禁止重复的函数声明 “no-implicit-coercion”: 1, //禁止隐式转换 “no-implied-eval”: 2, //禁止使用隐式eval “no-inline-comments”: 0, //禁止行内备注 “no-inner-declarations”: [2, “functions”], //禁止在块语句中使用声明(变量或函数) “no-invalid-regexp”: 2, //禁止无效的正则表达式 “no-invalid-this”: 2, //禁止无效的this,只能用在构造器,类,对象字面量 “no-irregular-whitespace”: 2, //不能有不规则的空格 “no-iterator”: 2, //禁止使用__iterator__ 属性 “no-label-var”: 2, //label名不能与var声明的变量名相同 “no-labels”: 2, //禁止标签声明 “no-lone-blocks”: 2, //禁止不必要的嵌套块 “no-lonely-if”: 2, //禁止else语句内只有if语句 “no-loop-func”: 1, //禁止在循环中使用函数(如果没有引用外部变量不形成闭包就可以) “no-mixed-requires”: [0, false], //声明时不能混用声明类型 “no-mixed-spaces-and-tabs”: [2, false], //禁止混用tab和空格 “linebreak-style”: [0, “windows”], //换行风格 “no-multi-spaces”: 1, //不能用多余的空格 “no-multi-str”: 2, //字符串不能用\换行 “no-multiple-empty-lines”: [1, { “max”: 2 }], //空行最多不能超过2行 “no-native-reassign”: 2, //不能重写native对象 “no-negated-in-lhs”: 2, //in 操作符的左边不能有! “no-nested-ternary”: 0, //禁止使用嵌套的三目运算 “no-new”: 1, //禁止在使用new构造一个实例后不赋值 “no-new-func”: 1, //禁止使用new Function “no-new-object”: 2, //禁止使用new Object() “no-new-require”: 2, //禁止使用new require “no-new-wrappers”: 2, //禁止使用new创建包装实例,new String new Boolean new Number “no-obj-calls”: 2, //不能调用内置的全局对象,比如Math() JSON() “no-octal”: 2, //禁止使用八进制数字 “no-octal-escape”: 2, //禁止使用八进制转义序列 “no-param-reassign”: 2, //禁止给参数重新赋值 “no-path-concat”: 0, //node中不能使用__dirname或__filename做路径拼接 “no-plusplus”: 0, //禁止使用++,– “no-process-env”: 0, //禁止使用process.env “no-process-exit”: 0, //禁止使用process.exit() “no-proto”: 2, //禁止使用__proto__属性 “no-redeclare”: 2, //禁止重复声明变量 “no-regex-spaces”: 2, //禁止在正则表达式字面量中使用多个空格 /foo bar/ “no-restricted-modules”: 0, //如果禁用了指定模块,使用就会报错 “no-return-assign”: 1, //return 语句中不能有赋值表达式 “no-script-url”: 0, //禁止使用javascript:void(0) “no-self-compare”: 2, //不能比较自身 “no-sequences”: 0, //禁止使用逗号运算符 “no-shadow”: 2, //外部作用域中的变量不能与它所包含的作用域中的变量或参数同名 “no-shadow-restricted-names”: 2, //严格模式中规定的限制标识符不能作为声明时的变量名使用 “no-spaced-func”: 2, //函数调用时 函数名与()之间不能有空格 “no-sparse-arrays”: 2, //禁止稀疏数组, [1,,2] “no-sync”: 0, //nodejs 禁止同步方法 “no-ternary”: 0, //禁止使用三目运算符 “no-trailing-spaces”: 1, //一行结束后面不要有空格 “no-this-before-super”: 0, //在调用super()之前不能使用this或super “no-throw-literal”: 2, //禁止抛出字面量错误 throw “error”; “no-undef”: 1, //不能有未定义的变量 “no-undef-init”: 2, //变量初始化时不能直接给它赋值为undefined “no-undefined”: 2, //不能使用undefined “no-unexpected-multiline”: 2, //避免多行表达式 “no-underscore-dangle”: 1, //标识符不能以_开头或结尾 “no-unneeded-ternary”: 2, //禁止不必要的嵌套 var isYes = answer === 1 ? true : false; “no-unreachable”: 2, //不能有无法执行的代码 “no-unused-expressions”: 2, //禁止无用的表达式 “no-unused-vars”: [2, { “vars”: “all”, “args”: “after-used” }], //不能有声明后未被使用的变量或参数 “no-use-before-define”: 2, //未定义前不能使用 “no-useless-call”: 2, //禁止不必要的call和apply “no-void”: 2, //禁用void操作符 “no-var”: 0, //禁用var,用let和const代替 “no-warning-comments”: [1, { “terms”: [“todo”, “fixme”, “xxx”], “location”: “start” }], //不能有警告备注 “no-with”: 2, //禁用with “array-bracket-spacing”: [2, “never”], //是否允许非空数组里面有多余的空格 “arrow-parens”: 0, //箭头函数用小括号括起来 “arrow-spacing”: 0, //=>的前/后括号 “accessor-pairs”: 0, //在对象中使用getter/setter “block-scoped-var”: 0, //块语句中使用var “brace-style”: [1, “1tbs”], //大括号风格 “callback-return”: 1, //避免多次调用回调什么的 “camelcase”: 2, //强制驼峰法命名 “comma-dangle”: [2, “never”], //对象字面量项尾不能有逗号 “comma-spacing”: 0, //逗号前后的空格 “comma-style”: [2, “last”], //逗号风格,换行时在行首还是行尾 “complexity”: [0, 11], //循环复杂度 “computed-property-spacing”: [0, “never”], //是否允许计算后的键名什么的 “consistent-return”: 0, //return 后面是否允许省略 “consistent-this”: [2, “that”], //this别名 “constructor-super”: 0, //非派生类不能调用super,派生类必须调用super “curly”: [2, “all”], //必须使用 if(){} 中的{} “default-case”: 0, //switch语句最后必须有default “dot-location”: 0, //对象访问符的位置,换行的时候在行首还是行尾 “dot-notation”: [0, { “allowKeywords”: true }], //避免不必要的方括号 “eol-last”: 0, //文件以单一的换行符结束 “eqeqeq”: 2, //必须使用全等 “func-names”: 0, //函数表达式必须有名字 “func-style”: [0, “declaration”], //函数风格,规定只能使用函数声明/函数表达式 “generator-star-spacing”: 0, //生成器函数*的前后空格 “guard-for-in”: 0, //for in循环要用if语句过滤 “handle-callback-err”: 0, //nodejs 处理错误 “id-length”: 0, //变量名长度 “indent”: [2, 2], //缩进风格 “init-declarations”: 0, //声明时必须赋初值 “key-spacing”: [0, { “beforeColon”: false, “afterColon”: true }], //对象字面量中冒号的前后空格 “lines-around-comment”: 0, //行前/行后备注 “max-depth”: [0, 4], //嵌套块深度 “max-len”: [0, 80, 4], //字符串最大长度 “max-nested-callbacks”: [0, 2], //回调嵌套深度 “max-params”: [0, 3], //函数最多只能有3个参数 “max-statements”: [0, 10], //函数内最多有几个声明 “new-cap”: 2, //函数名首行大写必须使用new方式调用,首行小写必须用不带new方式调用 “new-parens”: 2, //new时必须加小括号 “newline-after-var”: 2, //变量声明后是否需要空一行 “object-curly-spacing”: [0, “never”], //大括号内是否允许不必要的空格 “object-shorthand”: 0, //强制对象字面量缩写语法 “one-var”: 0, //连续声明 “operator-assignment”: [0, “always”], //赋值运算符 += -=什么的 “operator-linebreak”: [2, “after”], //换行时运算符在行尾还是行首 “padded-blocks”: 0, //块语句内行首行尾是否要空行 “prefer-const”: 0, //首选const “prefer-spread”: 0, //首选展开运算 “prefer-reflect”: 0, //首选Reflect的方法 “quotes”: [1, “single”], //引号类型 `` "" ’’ “quote-props”: [0, “always”], //对象字面量中的属性名是否强制双引号 “radix”: 2, //parseInt必须指定第二个参数 “id-match”: 0, //命名检测 “require-yield”: 0, //生成器函数必须有yield “semi”: [0, “always”], //语句强制分号结尾 “semi-spacing”: [0, { “before”: false, “after”: true }], //分号前后空格 “sort-vars”: 0, //变量声明时排序 “space-after-keywords”: [0, “always”], //关键字后面是否要空一格 “space-before-blocks”: [0, “always”], //不以新行开始的块{前面要不要有空格 “space-before-function-paren”: [0, “always”], //函数定义时括号前面要不要有空格 “space-in-parens”: [0, “never”], //小括号里面要不要有空格 “space-infix-ops”: 0, //中缀操作符周围要不要有空格 “space-return-throw-case”: 0, //return throw case后面要不要加空格 “space-unary-ops”: [0, { “words”: true, “nonwords”: false }], //一元运算符的前/后要不要加空格 “spaced-comment”: 0, //注释风格要不要有空格什么的 “strict”: 2, //使用严格模式 “use-isnan”: 2, //禁止比较时使用NaN,只能用isNaN() “valid-jsdoc”: 0, //jsdoc规则 “valid-typeof”: 2, //必须使用合法的typeof的值 “vars-on-top”: 2, //var必须放在作用域顶部 “wrap-iife”: [2, “inside”], //立即执行函数表达式的小括号风格 “wrap-regex”: 0, //正则表达式字面量用小括号包起来 “yoda”: [2, “never”] //禁止尤达条件 }, parserOptions: { parser: “babel-eslint” }};小结小肆是处女座,处女座的代码洁癖有多严重你们知道的吧?不在项目开始前把代码规范先做好,项目直接进行不下去了呀。使用了eslint-prettier之后,不论我写代码时多么行(luan)云(qi)流(ba)水(zao),一按保存,跟开了十级美颜似的,自信心暴增啊!如果你和小肆一样,记得点好看呦。前置阅读:用vue-cli3从0到1做一个完整功能手机站(一)从0到1开发实战手机站(二):Git提交规范配置从0到1使用VUE-CLI3开发实战(三): ES6知识储备从0到1使用VUE-CLI3开发实战(四):Axios封装从0到1使用VUE-CLI3开发实战(五):模块化VUEX及使用vuetify ...

January 27, 2019 · 4 min · jiezi

在 React-CRA 应用中配合 VSCode 使用 ESLint 实践前端代码规范

更新时间:2019-01-22React.js create-react-app 项目 + VSCode 编辑器 + ESLint 代码检查工具 + Airbnb 编码规范前言为什么要使用 ESLint在项目开发过程中,编写符合团队编码规范的代码是尤为重要的,程序首先是给人看的,其次才是给机器去执行。我们在开发工作中,代码维护会占很大的比重,很多时候我们还需要阅读他人的代码,如果没有一个统一的编码规范,将会给我们的工作带来很大的困扰。因此,我们期望在开发过程中遵循统一的编码规范,以实现避免基本语法错误、代码格式化、规避一些不推荐的用法等目的,最大程度的保证代码的可读性和正确性。通常每个团队都会制定适合自己的编码规范和代码风格,但是仅仅制定规范是不够的,还需要借助代码检查工具来强制推行团队的编码规范,比如 ESLint 代码检查工具。本文会介绍一种 ESLint 的配置方案,但本文关于 ESLint 的配置是基于一定的开发环境的,偏重于实际应用,并非 ESLint 本身的介绍。这里对 ESLint 的配置基于以下环境:React.js create-react-app 脚手架项目使用 VSCode 编辑器基于 Airbnb 编码规范相关链接ESLint 代码检查工具ESLint 中文 是一个开源的 JavaScript 代码检查工具,由 Nicholas C. Zakas 于2013年6月创建。JavaScript 是一个动态的弱类型语言,在开发中比较容易出错。因为没有编译程序,为了寻找 JavaScript 代码错误通常需要在执行过程中不断调试。像 ESLint 这样的可以让程序员在编码的过程中发现问题而不是在执行的过程中。ESLint 的初衷是为了让程序员可以创建自己的检测规则。ESLint 的所有规则都被设计成可插入的。ESLint 的默认规则与其他的插件并没有什么区别,规则本身和测试可以依赖于同样的模式。为了便于人们使用,ESLint 内置了一些规则,当然,你可以在使用过程中自定义规则。Create-React-App 应用Create React App 是 React 官方支持的创建单页面 React 应用的方式,通过 create-react-app 脚手架命令可以快速创建一个 React 应用,免去了我们自己配置 webpack 的麻烦,我们这次 ESLint 的配置方案就是基于 create-react-app 项目的。VSCode 编辑器VSCode 是微软的良心之作,是一个轻量且强大的代码编辑器,支持 Windows 和 Linux。内置 JavaScript、TypeScript 和 Node.js 支持,而且拥有丰富的插件生态系统,还可以通过安装插件来支持 C++、C#、Python、PHP 等其他语言,堪称开发的利器。插件扩展:Extensions for the Visual Studio family of products。Airbnb 编码规范Airbnb JavaScript Style Guide 是独角兽公司 Airbnb 内部的 JavaScript 编码规范,该项目是 Github 上很受欢迎的一个开源项目,在前端开发中使用广泛,本文的 ESLint 配置规则就是以Airbnb JavaScript 编码规范(2.0) 和 Airbnb React/JSX 编码规范 作为基础的。具体配置方法在 VSCode 中安装 ESLint 扩展在 VSCode 扩展面板搜索 ESLint,找到安装最多的那个安装即可,安装完成之后需要 重新加载 以激活扩展,但想要让扩展进行工作,我们还需要进行 ESLint 的安装配置。创建 CRA 项目我们的配置方案是基于 CRA 脚手架项目进行测试的,因此我们要先创建一个 CRA 项目,具体方法详见官方文档:Create React App。创建的 CRA 项目文件组织结构如下: my-app ├── README.md ├── node_modules ├── package.json ├── .gitignore ├── public │ ├── favicon.ico │ ├── index.html │ └── manifest.json └── src ├── App.css ├── App.js ├── App.test.js ├── index.css ├── index.js ├── logo.svg └── serviceWorker.js安装 ESLintESLint 可以选择进行本地安装: npm install eslint –save-dev也可以进行全局安装: npm install -g eslint一般推荐进行全局安装,使其可以作用于我们所有的项目。具体请参见 eslint-npm 文档。创建 ESLint 配置文件ESLint 安装完成之后,我们需要创建一个配置文件,为了详细演示 ESLint 是如何在实际项目中工作的,我们接下来的操作都在我们上面已经创建的 CRA 脚手架项目中进行,且先不考虑 Airbnb 编码规范的使用,而是先创建一个较为常见的自定义代码风格。我们在创建的 my-app 项目下执行 cmd 命令 eslint –init,根据提示我们选择通过 Answer questions about your style 的方式创建一份自定义的代码规范,下图是一个示例,具体可根据项目需要进行配置:这样我们就已经创建了一个自定义的 ESLint 配置文件,可以看到在 my-app 项目中生成了一个名为 .eslintrc.js 的文件,其中的规则就是根据我们上图中的选择进行设定的,具体内容如下: /* .eslintrc.js / module.exports = { “env”: { “browser”: true, “commonjs”: true, “es6”: true }, “extends”: “eslint:recommended”, “parserOptions”: { “ecmaFeatures”: { “jsx”: true }, “ecmaVersion”: 2018, “sourceType”: “module” }, “plugins”: [ “react” ], “rules”: { “indent”: [ “error”, 4 ], “linebreak-style”: [ “error”, “windows” ], “quotes”: [ “error”, “single” ], “semi”: [ “error”, “always” ] } };至此,我们在 VSCode 中打开 my-app 项目,可以发现 ESLint 扩展已经可以正常工作了,ESLint 会自动检测语法错误,并高亮显示,同时在 VSCode 编辑器的问题窗口会输出相应的错误信息。设置 autoFixOnSave经过以上步骤操作之后,ESLint 扩展已经正常工作了,并且可以根据错误提示手动修复检测到的错误,但是这样显然是低效和繁琐的,这个时候就需要配置 ESLint 扩展插件的自动修复功能了。在 VSCode 中依次点击 文件–>首选项–>设置,打开 settings.json 文件,在设置中搜索 eslint,会发现 ESLint 扩展插件的自动修复功能是关闭的,我们在右侧的用户设置中对此项进行修改,将其设置为:“eslint.autoFixOnSave”: true,,这样 ESLint 扩展插件的自动修复功能就打开了。此时,我们再次打开错误页面,执行保存(Ctrl+s)操作,就会发现 eslint 的错误可以自动修复了,如果当前页面错误较多的话,可能需要多次执行 Ctrl+s。使用 Airbnb 编码规范上面我们已经使 ESLint 在我们的项目中正常工作了,但使用的代码风格是我们自定义的,有时候我们希望使用一些大厂的比较成熟的代码规范,比如 Airbnb JavaScript Style,接下来我们就将自定义的 ESLint 配置改为使用 Airbnb 编码规范配置。首先,我们需要安装 2 个 npm 依赖包:babel-eslint,增强语法识别能力babel-eslint allows you to lint ALL valid Babel code with the fantastic ESLint.$ npm i babel-eslinteslint-config-airbnb,Airbnb 提供的支持 ECMAScript 6+ 和 React 的 ESLint rules,包括 eslint eslint-plugin-import eslint-plugin-react 以及 eslint-plugin-jsx-a11y。Our default export contains all of our ESLint rules, including ECMAScript 6+ and React. It requires eslint, eslint-plugin-import, eslint-plugin-react, and eslint-plugin-jsx-a11y. If you don’t need React, see eslint-config-airbnb-base.// If using npm 5+, use this shortcut$ npx install-peerdeps –dev eslint-config-airbnb然后我们要修改 .eslintrc.js 文件,以使用我们安装的 Airbnb 编码规范,修改后内容如下: / .eslintrc.js / module.exports = { “env”: { “browser”: true, “commonjs”: true, “es6”: true }, “extends”: “airbnb”, // 使用 eslint-config-airbnb “parser”: “babel-eslint”, // 增强语法识别能力 “parserOptions”: { “ecmaFeatures”: { “jsx”: true }, “ecmaVersion”: 2017, “sourceType”: “module” }, “rules”: { // 这里可以根据需要对 airbnb 的规则进行修改,此处仅为示例 “linebreak-style”: 0, “prefer-destructuring”: 0, “prefer-const”: 0, “one-var”: 0, “comma-dangle”: [’error’, { arrays: ‘only-multiline’, objects: ‘always-multiline’, imports: ‘only-multiline’, exports: ‘only-multiline’, functions: ‘ignore’, }], “no-console”: 1, “import/prefer-default-export”: 0, “import/no-extraneous-dependencies”: [2, {‘devDependencies’: true}], “react/prop-types”: 1, “react/forbid-prop-types”: 0, “react/jsx-filename-extension”: [2, {extensions: [’.js’, ‘.jsx’, ‘.tsx’]}], “jsx-a11y/anchor-is-valid”: 0, // VSCode 的 ESLint 扩展插件暂时无法正确修复这条规则带来的错误 “react/jsx-one-expression-per-line”: 0, } };至此,我们完成了在 React-CRA 应用中配合 VSCode 使用 ESLint 的全部配置。错误信息在修改 .eslintrc.js 文件以使用Airbnb 编码规范(eslint-config-airbnb)的过程中,发现 VSCode 的 ESLint 扩展插件对其中的有些规则不能正确的自动修复,比如: // One JSX Element Per Line // https://github.com/yannickcr/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/jsx-one-expression-per-line.md ‘react/jsx-one-expression-per-line’: [’error’, { allow: ‘single-child’ }],查阅 eslint-config-airbnb 的文档发现,eslint-config-airbnb v17.1.0 版本修改了上面这条规则,具体可以参见:re-enabling jsx-one-expression-per-line allowing single children 以及 One JSX Element Per Line (react/jsx-one-expression-per-line)。当前版本的 VSCode 的 ESLint 扩展插件无法正确修复这条规则带来的错误,由于暂时找不到其他解决方法,这里就先将这条规则关闭。由此可见,随着 VSCode 或 ESLint 相关的插件和依赖包版本的变动,配置也会发生一些不可预期的变化,这里将用来测试的 CRA 脚手架项目的 package.json 文件内容附录如下; / package.json */ { “name”: “my-app”, “version”: “0.1.0”, “private”: true, “dependencies”: { “babel-eslint”: “^10.0.1”, “react”: “^16.7.0”, “react-dom”: “^16.7.0”, “react-scripts”: “2.1.3” }, “scripts”: { “start”: “react-scripts start”, “build”: “react-scripts build”, “test”: “react-scripts test”, “eject”: “react-scripts eject” }, “eslintConfig”: { “extends”: “react-app” }, “browserslist”: [ “>0.2%”, “not dead”, “not ie <= 11”, “not op_mini all” ], “devDependencies”: { “eslint”: “^5.3.0”, “eslint-config-airbnb”: “^17.1.0”, “eslint-plugin-import”: “^2.14.0”, “eslint-plugin-jsx-a11y”: “^6.1.1”, “eslint-plugin-react”: “^7.11.0” } } ...

January 23, 2019 · 3 min · jiezi

webpack4系列教程(八):使用Eslint审查代码

前言:本章内容,我们在项目中加入eslint配置,来审查校验代码,这样能够避免一些比较低级的错误。并且在团队协作的时候,保持同一种风格和规范能提高代码的可读性,进而提高我们的工作效率。安装:eslint-config-standard 是一种较为成熟通用的代码审查规则,这样就不用我们自己去定义规则了,使用起来非常方便,记住还需要安装一些依赖插件:npm install –save-dev eslint eslint-config-standard eslint-plugin-standard eslint-plugin-promise eslint-plugin-import eslint-plugin-node配置:在项目根目录下创建 .eslintrc 文件:{ “extends”: “standard”, “rules”: { “no-new”: “off” }}在vue项目中,.vue文件中的 script标签内的代码,eslint 是无法识别的,这时就需要使用插件: eslint-plugin-htmlnpm i eslint-plugin-html -D然后在 .eslintrc 中配置该插件:{ “extends”: “standard”, “plugins”: [ “html” ], “rules”: { “no-new”: “off” }}这样就能解析 .vue文件中的JS代码了,官方也是如此推荐。使用:配置完成,如何使用呢?在 package.json 文件中添加一条 script:“scripts”: { “build”: “cross-env NODE_ENV=production webpack –config config/webpack.config.js –progress –inline –colors”, “lint”: “eslint –ext .js –ext .vue src/” }- -ext 代表需要解析的文件格式,最后接上文件路径,由于我们的主要代码都在src 目录下,这里就配置 src 文件夹。npm run lint可见控制台给出了很多错误: 在项目前期没有加入eslint的情况下,后期加入必然会审查出许多错误。出现这么多错误之后,如果我们逐条手动去解决会非常耗时,此时可以借助eslint自动修复,方法也很简单。 只需要添加一条命令即可:“scripts”: { “build”: “cross-env NODE_ENV=production webpack –config config/webpack.config.js –progress –inline –colors”, “lint”: “eslint –ext .js –ext .vue src/”, “lint-fix”: “eslint –fix –ext .js –ext .jsx –ext .vue src/"}然后执行npm run lint-fix我们希望在开发过程中能够实时进行eslint代码审查,需要安装两个依赖:npm i eslint-loader babel-eslint -D修改 .eslintrc:{ “extends”: “standard”, “plugins”: [ “html” ], “rules”: { “no-new”: “off” }, “parserOptions”:{ “parser”: “babel-eslint” }}由于我们的项目使用了webpack并且代码都是经过Babel编译的,但是Babel处理过的代码有些语法可能对于eslint支持性不好,所以需要指定一个 parser。下一步,在webpack.config.js中添加loader:{ test: /.(vue|js)$/, loader: ’eslint-loader’, exclude: /node_modules/, enforce: ‘pre’ }enforce: ‘pre’ 表示预处理,因为我们只是希望eslint来审查我们的代码,并不是去改变它,在真正的loader(比如:vue-loader)发挥作用前用eslint去检查代码。记得在你的IDE中安装并开启eslint插件功能,这样就会有错误提示了。比如: 图中的错误是未使用的变量。# editorconfig: editorconfig是用来规范我们的IDE配置的,在根目录创建 .editorconfig文件:root = true[*]charset = utf-8indent_style = spaceindent_size = 2end_of_line = lfinsert_final_newline = truetrim_trailing_whitespace = true这样就能在各种IDE使用相同的配置了。同样需要在IDE中安装editorconfig插件以上就是eslint的配置方法了。本人才疏学浅,如有不当之处,欢迎批评指正 ...

January 15, 2019 · 1 min · jiezi

这可能是vue中eslintrc.js最详细的介绍了

本文是对vue项目中自带文件eslintrc.js的内容解析,介绍了各个eslint配置项的作用,以及为什么这样设置。比较详细,看完能对eslint有较为全面的了解,基本解除对该文件的疑惑。/** * 参考文档 * 【eslint英文文档】https://eslint.org/docs/user-guide/configuring * 【eslint中文文档】http://eslint.cn/docs/rules/ //* * eslint有三种使用方式 * 【1】js代码中通过注释的方式使用 * 【2】通过webpack的eslintConfig字段设置,eslint会自动搜索项目的package.json文件中的配置 * 【3】通过配置文件的方式使用,配置文件有多种文件方式,如JavaScript、JSON 或者 YAML等 //* * 文件忽略 * 【】让eslint跳过特定文件的检测 * 【】通过当前工作目录下 「.eslintignore」 文件进行设置 * 其使用的是Glob路径书写方式,与「.gitignore」的使用方法相同 * 【】也可以在 package.json 文件中,通过 eslintIgnore 参数进行设置 //* * 文件内局部设置 * 【】eslint可以具体文件中设置特定代码的规则,常用于跳过某条语句的检测。 * 【】注销全部规则,在代码前新建一行,添加注销 /* eslint-disable / 。如果没有恢复设置的语句,则下列全部代码都会跳过检测。 * 【】恢复eslint,在代码前新建一行,添加注销 / eslint-enable / * 【】指定忽略的规则,/ eslint-disable no-alert, no-console / * 【】在特定行禁用,// eslint-disable-line * 【】在下一行禁用,// eslint-disable-next-line /module.exports = { / * 根目录标识 * http://eslint.cn/docs/user-guide/configuring#using-configuration-files * http://eslint.cn/docs/user-guide/configuring#configuration-cascading-and-hierarchy * 【】标识当前配置文件为最底层的文件,无需往更上一级的文件目录中进行搜索 * 【】默认eslint的配置文件搜索方式是,从目标文件夹进行搜索,遍历内部每一个文件夹,找到配置文件并层叠使用。再跳出本项目,往祖先文件夹进行遍历 * 【】注意「/.eslintrc」的意义,「」是指linux上的家目录,「~/.eslintrc」是指家目录下的eslint配置文件,用于私人开发者,用于整个电脑全局约束的。这个配置通过本配置项root去设置,设置了root,eslint检测时将不会再往上搜索 * 【】eslint的生效规则是就近使用,越近的配置项优先级越高,覆盖其他配置项。如一个项目中,可以在不同文件夹中都添加配置文件,这些规则将重叠组合生效 / root: true, // 标识当前配置文件为eslint的根配置文件,让其停止在父级目录中继续寻找。 /* * 解析器 * http://eslint.cn/docs/user-guide/configuring#specifying-parser * 【】ESLint 默认使用Espree作为其解析器 * 【】解析器必须是本地安装的一个 npm 模块。即必须按照在本地的node_module中 * 【】解析器是用于解析js代码的,怎么去理解每一个表达式,有点C++中编译器的概念,会对js进行一些语法分析,语义分析什么的,才能判断语句符不符合规范。而不是通过简单的字符串对比。 * 【】解析器有很多,但兼容eslint的解析器有以下几个 * Espree:默认解析器,一个从Esprima中分离出来的解析器,做了一些优化 * Esprima:js标准解析器 * Babel-ESLint: 一个对Babel解析器的包装,babel本身也是js解析器的一种(不然怎么能转化为兼容性代码呢?首先需要进行js解析,才能转化)。如果我们的代码需要经过babel转化,则对应使用这个解析器 * typescript-eslint-parser(实验) - 一个把 TypeScript 转换为 ESTree 兼容格式的解析器 / parser: ‘babel-eslint’, /* * 解析器配置项 * http://eslint.cn/docs/user-guide/configuring#specifying-parser-options * 【】这里设置的配置项将会传递到解析器中,被解析器获取到,进行一定的处理。具体被利用到,要看解析器的源码有没有对其进行利用。这里仅仅做了参数定义,做了规定,告诉解析器的开发者可能有这些参数 * 【】配置项目有: * “sourceType”: “module”, // 指定JS代码来源的类型,script(script标签引入?) | module(es6的module模块),默认为script。为什么vue的会使用script呢?因为vue是通过babel-loader编译的,而babel编译后的代码就是script方式 * “ecmaVersion”: 6, // 支持的ES语法版本,默认为5。注意只是语法,不包括ES的全局变量。全局变量需要在env选项中进行定义 * “ecmaFeatures”: { // Features是特征的意思,这里用于指定要使用其他那些语言对象 “experimentalObjectRestSpread”: true, //启用对对象的扩展 “jsx”: true, //启用jsx语法 “globalReturn”:true, //允许return在全局使用 “impliedStrict”:true //启用严格校验模式 } / parserOptions: {}, /* * 运行环境 * http://eslint.cn/docs/user-guide/configuring#specifying-environments * 【】一个环境定义了一组预定义的全局变量 * 【】获得了特定环境的全局定义,就不会认为是开发定义的,跳过对其的定义检测。否则会被认为改变量未定义 * 【】常见的运行环境有以下这些,更多的可查看官网 * browser - 浏览器环境中的全局变量。 * node - Node.js 全局变量和 Node.js 作用域。 * es6 - 启用除了 modules 以外的所有 ECMAScript 6 特性(该选项会自动设置 ecmaVersion 解析器选项为 6)。 * amd - 将 require() 和 define() 定义为像 amd 一样的全局变量。 * commonjs - CommonJS 全局变量和 CommonJS 作用域 (用于 Browserify/WebPack 打包的只在浏览器中运行的代码)。 * jquery - jQuery 全局变量。 * mongo - MongoDB 全局变量。 * worker - Web Workers 全局变量。 * serviceworker - Service Worker 全局变量。 / env: { browser: true, // 浏览器环境 }, /* * 全局变量 * http://eslint.cn/docs/user-guide/configuring#specifying-globals * 【】定义额外的全局,开发者自定义的全局变量,让其跳过no-undef 规则 * 【】key值就是额外添加的全局变量 * 【】value值用于标识该变量能否被重写,类似于const的作用。true为允许变量被重写 * 【】注意:要启用no-global-assign规则来禁止对只读的全局变量进行修改。 / globals: { // gTool: true, // 例如定义gTool这个全局变量,且这个变量可以被重写 }, /* * 插件 * http://eslint.cn/docs/user-guide/configuring#configuring-plugins * 【】插件同样需要在node_module中下载 * 【】注意插件名忽略了「eslint-plugin-」前缀,所以在package.json中,对应的项目名是「eslint-plugin-vue」 * 【】插件的作用类似于解析器,用以扩展解析器的功能,用于检测非常规的js代码。也可能会新增一些特定的规则。 * 【】如 eslint-plugin-vue,是为了帮助我们检测.vue文件中 <template> 和 <script> 中的js代码 / plugins: [ ‘vue’ ], /* * 规则继承 * http://eslint.cn/docs/user-guide/configuring#extending-configuration-files 【】可继承的方式有以下几种 【】eslint内置推荐规则,就只有一个,即「eslint:recommended」 【】可共享的配置, 是一个 npm 包,它输出一个配置对象。即通过npm安装到node_module中 * 可共享的配置可以省略包名的前缀 eslint-config-,即实际设置安装的包名是 eslint-config-airbnb-base 【】从插件中获取的规则,书写规则为 「plugin:插件包名/配置名」,其中插件报名也是可以忽略「eslint-plugin-」前缀。如’plugin:vue/essential’ 【】从配置文件中继承,即继承另外的一个配置文件,如’./node_modules/coding-standard/eslintDefaults.js’ / extends: [ ‘plugin:vue/essential’, // 额外添加的规则可查看 https://vuejs.github.io/eslint-plugin-vue/rules/ / * 「airbnb,爱彼迎」 * 【】有两种eslint规范,一种是自带了react插件的「eslint-config-airbnb」,一种是基础款「eslint-config-airbnb-base」, * 【】airbnb-base 包括了ES6的语法检测,需要依赖 「eslint-plugin-import」 * 【】所以在使用airbnb-base时,需要用npm额外下载 eslint-plugin-import * 【】所以eslint实际上已经因为 airbnb-base 基础配置项目,添加上了 eslint-plugin-import 插件配置 * 【】所以在setting和rules里,都有 ‘import/xxx’ 项目,这里修改的就是 eslint-plugin-import 配置 / ‘airbnb-base’, ], / * 规则共享参数 * http://eslint.cn/docs/user-guide/configuring#adding-shared-settings * 【】提供给具体规则项,每个参数值,每个规则项都会被注入该变量,但对应规则而言,有没有用,就看各个规则的设置了,就好比 parserOptions,解析器用不用它就不知道了。这里只是提供这个方法 * 【】不用怀疑,经源码验证,这就是传递给每个规则项的,会当做参数传递过去,但用不用,就是具体规则的事情 / settings: { / * * 注意,「import/resolver」并不是eslint规则项,与rules中的「import/extensions」不同。它不是规则项 * 这里只是一个参数名,叫「import/resolver」,会传递给每个规则项。 * settings并没有具体的书写规则,「import/」只是import模块自己起的名字,原则上,它直接命名为「resolver」也可以,加上「import」只是为了更好地区分。不是强制设置的。 * 因为「import」插件很多规则项都用的这个配置项,所以并没有通过rules设置,而是通过settings共享 * 具体使用方法可参考https://github.com/benmosher/eslint-plugin-import / ‘import/resolver’: { / * 这里传入webpack并不是import插件能识别webpack,而且通过npm安装了「eslint-import-resolver-webpack」, * 「import」插件通过「eslint-import-resolver-」+「webpack」找到该插件并使用,就能解析webpack配置项。使用里面的参数。 * 主要是使用以下这些参数,共享给import规则,让其正确识别import路径 * extensions: [’.js’, ‘.vue’, ‘.json’], * alias: { * ‘vue$’: ‘vue/dist/vue.esm.js’, * ‘@’: resolve(‘src’), * ‘static’: resolve(‘static’) * } / webpack: { config: ‘build/webpack.base.conf.js’ } } }, / * 针对特定文件的配置 * 【】可以通过overrides对特定文件进行特定的eslint检测 * 【】特定文件的路径书写使用Glob格式,一个类似正则的路径规则,可以匹配不同的文件 * 【】配置几乎与 ESLint 的其他配置相同。覆盖块可以包含常规配置中的除了 extends、overrides 和 root 之外的其他任何有效配置选项, / overrides: [ { ‘files’: [‘bin/.js’, ’lib/.js’], ’excludedFiles’: ‘.test.js’, ‘rules’: { ‘quotes’: [2, ‘single’] } } ], /** * 自定义规则 * http://eslint.cn/docs/user-guide/configuring#configuring-rules * 【】基本使用方式 * “off” 或者0 关闭规则 * “warn” 或者1 将规则打开为警告(不影响退出代码) * “error” 或者2 将规则打开为错误(触发时退出代码为1) * 如:’no-restricted-syntax’: 0, // 表示关闭该规则 * 【】如果某项规则,有额外的选项,可以通过数组进行传递,而数组的第一位必须是错误级别。如0,1,2 * 如 ‘semi’: [’error’, ’never’], never就是额外的配置项 / rules: { /* * 具体规则 * 【】具体的规则太多,就不做介绍了,有兴趣的同学可以上eslint官网查 * 【】注意 xxx/aaa 这些规则是 xxx 插件自定的规则,在eslint官网是查不到的。需要到相应的插件官网中查阅 * 【】如 import/extensions,这是「eslint-plugin-import」自定义的规则,需要到其官网查看 https://github.com/benmosher/eslint-plugin-import */ ‘import/extensions’: [’error’, ‘always’, { js: ’never’, vue: ’never’ }], ‘import/no-extraneous-dependencies’: [’error’, { optionalDependencies: [’test/unit/index.js’] }], ’no-debugger’: process.env.NODE_ENV === ‘production’ ? ’error’ : ‘off’, “no-restricted-syntax”: 0, // “guard-for-in”: 0, // “prefer-const”: 0, // “no-else-return”: 0, // “no-plusplus”: 0, // 不允许使用++符号 “object-shorthand”: [“error”, “always”, { “avoidQuotes”: false }], // 去除禁止’videoData.isPause’(newValue) 的命名 “no-lonely-if”: 0, // 不允许给函数参数重新赋值 “no-param-reassign”: 0, // 不允许给函数参数重新赋值 “no-mixed-operators”: 0, // 不允许混合使用运算符 “no-underscore-dangle”: 0, // 不允许下划线作为变量名之一 “no-under”: 0, // 不允许混合使用运算符 ‘generator-star-spacing’: ‘off’, ’no-console’: ‘off’, // 禁用no-console规则 ‘semi’: [’error’, ’never’], // 行尾不使用分号 ‘comma-dangle’: [’error’], ’eqeqeq’: 0, // 不需要强制使用全等 ‘max-len’: 0, ‘radix’: 0,// parseInt不需要传第二个参数 ’linebreak-style’: 0, // 强制执行一致的换行样式,windows和mac不一样 ‘consistent-return’: 0, // 箭头函数最后不需要最后强制return值 ’no-unused-expressions’: [“error”, { “allowShortCircuit”: true, “allowTernary”: true }], // 允许您在表达式中使用三元运算符 ’no-multi-spaces’: [’error’, { “ignoreEOLComments”: true }], }} ...

December 20, 2018 · 3 min · jiezi

/*eslint-disable*/

在 Vue-cli 创建的项目中,使用了 ESLint 规范代码的项目中如何针对单个js文件禁用ESLint语法校验,但整个项目依然保留 ESLint 的校验规则?在代码顶部添加一行注释 /eslint-disable/ (两个/中间有两个*,像题目那样) ,ESLint 在校验的时候就会跳过后面的代码。比如:main.js 里的/ eslint-disable no-new /(两个/中间有两个*,像题目那样)在js里面,new 一个对象,需要赋值给某个值(变量),用Vue实例化的时候,不需要赋值给值(变量),所以要单独给配一条规则,给new Vue这行代码上面加这个注释,把这行代码规则的校验跳过,通过eslint-disable。eslint的常用技巧之一一. 安装 npm install eslint二. 配置 ESLint的配置有三种方式:1、.eslintrc.*文件的配置 首先你需要初始化配置文件。eslint init这将会在你的当前目录下生成一个.eslintrc.文件。.eslintrc的后缀可以是.js、.yalm、.yml和.json中的任意一个。以.json格式为例。.eslintrc.json 文件的内容类似如下: { //extends用于引入某配置作为基础配置,然后再在后续的rules中对其进行扩展 “extends”: “eslint:recommended”, //如果你想使用插件中的环境变量,请先把插件名写入"plugins"数组中,然后再在"env":{}中以"插件名/插件中的需引入的环境名"的方式进行指定。“plugins”: [“example”], “env”: { //An environment defines global variables that are predefined. //定义env会带进来一些全局变量 “browser”: true, “node”: true, “es6”:true, “mocha”:“true”, “qunit”:true, “jquery”:true, “mongo”:true, //通过插件名命名空间引入插件中的环境 “example/custom”: true }, “globals”: { // globals are the additional global variables your script accesses during execution. // 即插件在执行过程中用到的其它全局变量 “angular”: true, }, “rules”: { //which rules are enabled and at what error level. //这里指定用哪些规则进行eslint检查以及每个规则的错误级别:0或者off表示规则关闭,出错也被忽略;1或者warn表示如果出错会给出警告;2或者error表示如果出错会报出错误 “semi”: [“error”, “always”], “quotes”: [“error”, “double”] }, //parser指定解析器,默认的为espree,可选的还有Esprima、Babel-ESLint。 //babel-eslint is a wrapper around the Babel parser that makes it compatible with ESLint. //babel-eslint是一个Babel parser的包装器,这个包装器使得Babel parser可以和ESLint协调工作 “parser”: “babel-eslint”, “parserOptions”: { //ecmaVersion指定ECMAScript的版本,可选值有3\5\6\7,默认是5 “ecmaVersion”: 6, //sourceType指定被检查的文件是什么扩展名的,可选项"script"和"module",默认是"script"。“module"是ES6的。 “sourceType”: “module”, //ecmaFeatures指定你想使用哪些额外的语言特性 “ecmaFeatures”: { “jsx”: true } }, } “rules”中的每一项即是一条规则。其中,“:”之前的事规则的名称(如上面的”semi” 和 “quotes”),“:”后面的数组中,第一个项用于指定规则的错误级别,它有 3 个可选的取值:“off” 或者 0 - 关闭规则“warn” or 1 - 不符合规则时作为一个警告(不会影响退出码)“error” or 2 - 不符合规则时视作一个错误 (退出码为1)在你的.eslintrc文件中包含这行代码,可以使用推荐规则。“extends”: “eslint:recommended"通过这行代码,会开启规则页中标有对勾符号的规则。当然,你也可以到 npmjs.com 搜索 “eslint-config” 查找别人创建好的配置列表,并拿来直接使用。.eslintrc.如果放在项目的根目录中,则会作用于整个项目。如果在项目的子目录中也包含着.eslintrc文件,则对于子目录中文件的检查会忽略掉根目录中的配置,而直接采用子目录中的配置,这就能够在不同的目录范围内应用不同的检查规则,显得比较灵活。ESLint采用逐级向上查找的方式查找.eslintrc.文件,当找到带有”root”: true配置项的.eslintrc.文件时,将会停止向上查找。“extends”除了可以引入推荐规则,还可以以文件形式引入其它的自定义规则,然后在这些自定义规则的基础上用rules去定义个别规则,从而覆盖掉”extends”中引入的规则。例如: { “extends”: [ “./node_modules/coding-standard/eslintDefaults.js”, // Override eslintDefaults.js “./node_modules/coding-standard/.eslintrc-es6”, // Override .eslintrc-es6 “./node_modules/coding-standard/.eslintrc-jsx”, ], “rules”: { // Override any settings from the “parent” configuration “eqeqeq”: “warn” } }2、在 package.json 中加入 eslintConfig 配置块进行配置 例如: { “name”: “demo”, “version”: “1.0.0”, “eslintConfig”: { “env”: { “browser”: true, “node”: true }, “rules”: { “eqeqeq”: “warn” } } } 3、直接在代码文件中以注释的方式定义 需要注意的是,代码文件内以注释配置的规则会覆盖配置文件里的规则,即优先级要更高。例如:临时在一段代码中取消eslint检查,可以如下设置: `/ eslint-disable /// Disables all rules between comments alert(‘foo’);/ eslint-enable /临时在一段代码中取消个别规则的检查(如no-alert, no-console):/ eslint-disable no-alert, no-console /// Disables no-alert and no-console warnings between comments alert(‘foo’); console.log(‘bar’);/ eslint-enable no-alert, no-console /在整个文件中取消eslint检查:/ eslint-disable /// Disables all rules for the rest of the file alert(‘foo’);在整个文件中禁用某一项eslint规则的检查:/ eslint-disable no-alert /// Disables no-alert for the rest of the file alert(‘foo’);针对某一行禁用eslint检查:alert(‘foo’); // eslint-disable-line// eslint-disable-next-line alert(‘foo’);针对某一行的某一具体规则禁用eslint检查:alert(‘foo’); // eslint-disable-line no-alert// eslint-disable-next-line no-alert alert(‘foo’);针对某一行禁用多项具体规则的检查:alert(‘foo’); // eslint-disable-line no-alert, quotes, semi// eslint-disable-next-line no-alert, quotes, semi alert(‘foo’);三. 把ESLint集成到工作流之中 比如,与babel和gulp结合:package.json:{ “name”: “my-module”, “scripts”: { “lint”: “eslint my-files.js” }, “devDependencies”: { “babel-eslint”: “…”, “eslint”: “…” }}或者gulpfile.jsvar gulp = require(‘gulp’);var eslint = require(‘gulp-eslint’);gulp.task(’lint’, function() { return gulp.src(‘app/**/.js’) .pipe(eslint()) .pipe(eslint.format());});eslintrc.:{ “plugins”: [ “react” //使用eslint-plugin-react插件 ], “ecmaFeatures”: { “jsx”: true //开启ESLint JSX 支持 } “rules”: { “react/display-name”: 1, //注意一下,自定义规则都是以插件名称为命名空间的 “react/jsx-boolean-value”: 1 }}四. 通过配置.eslintignore文件忽略掉不想被检查的文件 可以通过在项目目录下建立.eslintignore文件,并在其中配置忽略掉对哪些文件的检查。需要注意的是,不管你有没有在.eslintignore中进行配置,eslint都会默认忽略掉对/node_modules/ 以及 /bower_components/文件的检查。下面是一个简单的.eslintignore文件的内容。# Ignore built files except build/index.jsbuild/!build/index.js五. 执行检测 eslint test.js test2.js文中后部分例子来源于:https://blog.csdn.net/qq_3100… ...

November 26, 2018 · 2 min · jiezi

开发 eslint 规则

前端的日常开发离不开各种 lint 的支持,使用 lint 的一种误解是:个人能力不足,必须 lint 规范才能写出规范的代码,实际上规范的定义主要取决于开源项目作者的习惯,或者公司团队编码的习惯,即使两个前端专家,写出的代码规范也会有差别。今天主题聊聊 eslint,作为最主流的 JavaScript lint 工具深受大家喜爱,而 JSHint 却逐渐淡出了大家的视线,使用的比较少了常用的 eslint 扩展有 standard,airbnb 等剖析 eslint 扩展扩展无非就作两个事情在原有的 eslint 的基础上配置些 config(具体规则参数,全局变量,运行环境等)自定义些自己的 rule,以满足需求原理就是利用 eslint 的继承模式,理论上可以无限继承并覆盖上一级的规则第一条不详细介绍了,eslint 官网说的十分详细,基本每一条规则都支持自定义参数,覆盖面也特别广,基本上所有的语法都有 rule第二条的自定义 rule 才是本文的重头戏,因为特殊的业务场景靠 eslint 自身配置已经无法满足业务需求了,如:eslint-plugin-vueeslint-plugin-reacteslint-plugin-jest一般特殊场景的自定义规则都使用 eslint-plugin-* 的命名,使用时可以方便的写成{ plugins: [ ‘vue’, ‘react’, ‘jest’ ]}当然 eslint-config-* 同理,不过配置时需要写成{ extends: ‘standard’}下面介绍下开发流程创建 eslint plugin 工程官方推荐使用 yeoman 生成项目,感觉生成的项目比较守旧,推荐下习惯我的项目结构eslint-plugin-skr |- tests | |- rules | |- utils | |- lib | |- rules | |- utils | |- index.js | |- jest.config.js | |- package.json | |- README.md整体看下来发现多了 jest 配置文件,是的 yeoman 生成的项目默认采用 Mocha 作为测试框架,个人感觉调试起来麻烦,没有 jest 灵活,vscode 轻松搞定调试教程一搜一大把哈,给伸手党一个链接 debugging-jest-tests关于 jest 的 config 文件也po出来一下,都是些基本的配置,复杂的用不到,下面会详细介绍测试部分module.exports = { testEnvironment: ’node’, roots: [’tests’], resetModules: true, clearMocks: true, verbose: true}自定义的规则全部在 lib/rules 下面,每条规则单独一个文件足以下面一个简单的例子打通任督二脉开发一个规则前期准备官方开发文档AST 抽象语法树这个官方文档写的密密麻麻,好几十个属性,其实只是冰山一角,有很多复杂场景需要考虑有人疑问:一定需要精通 AST?我的回答是当然不需要,简单了解便是,最起码知道解析出来的语法树大体结构长什么样子那就随便给自己一个命题写吧!写个超级简单的module.exports = { meta: { docs: { description: ‘禁止块级注释’, category: ‘Stylistic Issues’, recommended: true } }, create (context) { const sourceCode = context.getSourceCode() return { Program () { const comments = sourceCode.getAllComments() const blockComments = comments.filter(({ type }) => type === ‘Block’) blockComments.length && context.report({ message: ‘No block comments’ }) } } }}具体写法官方文档有介绍哈,就不赘述了,例子也十分简单,调用了环境变量 context 中的方法获取全部注释稍微复杂点的场景如需要 lint bar 对象中属性的顺序,如下假设一个规则// goodconst bar = { meta: {}, double: num => num * 2}// bedconst bar = { double: num => num * 2, meta: {},}这个第一次些会有些蒙,官网没有提供具体的例子,解决办法很简单,推荐一个利器 astexplorer点进去别着急复制代码查看 AST 结果,首先选择 espree(eslint 使用的语法解析库),如下这短短的四行代码会对应着一个抽象语法树,如下图:由于全展开太长了哈,感兴趣的自行尝试,会发现层级嵌套的特别深,找到 bar 的属性需要 Program.body[0].declarations[0].init.properties当然不至于每次都从最顶级的 Program 找下来,从上面的例子可以看出 create 方法的 return 返回的是一个 object,里面可以定义很多检测类型,如官网的例子:function checkLastSegment (node) { // report problem for function if last code path segment is reachable}module.exports = { meta: { … }, create: function(context) { // declare the state of the rule return { ReturnStatement: function(node) { // at a ReturnStatement node while going down }, // at a function expression node while going up: “FunctionExpression:exit”: checkLastSegment, “ArrowFunctionExpression:exit”: checkLastSegment, onCodePathStart: function (codePath, node) { // at the start of analyzing a code path }, onCodePathEnd: function(codePath, node) { // at the end of analyzing a code path } } }}这里可以使用 VariableDeclarator 类型作为检察目标,从下面的解析树可以分析出筛选条件以 VariableDeclarator 对象作为当前的 node当变量名为 bar,即 node.id.name === ‘bar’,且值为对象,即 node.init.type === ‘ObjectExpression’,代码如下:module.exports = { meta: { … }, create (context) { return { VariableDeclarator (node) { const isBarObj = node.id.name === ‘bar’ && node.init.type === ‘ObjectExpression’ if (!isBarObj) return // checker } } }}就这样成功取到 bar 对象后就可以检测属性的顺序了,排序算法一大把,挑一个喜欢的用就行了,这里不啰嗦了,直接上结果:const ORDER = [‘meta’, ‘double’]function getOrderMap () { const orderMap = new Map() ORDER.forEach((name, i) => { orderMap.set(name, i) }) return orderMap}module.exports = { create (context) { const orderMap = getOrderMap() function checkOrder (propertiesNodes) { const properties = propertiesNodes .filter(property => property.type === ‘Property’) .map(property => property.key) properties.forEach((property, i) => { const propertiesAbove = properties.slice(0, i) const unorderedProperties = propertiesAbove .filter(p => orderMap.get(p.name) > orderMap.get(property.name)) .sort((p1, p2) => orderMap.get(p1.name) > orderMap.get(p2.name)) const firstUnorderedProperty = unorderedProperties[0] if (firstUnorderedProperty) { const line = firstUnorderedProperty.loc.start.line context.report({ node: property, message: The "{{name}}" property should be above the "{{firstUnorderedPropertyName}}" property on line {{line}}., data: { name: property.name, firstUnorderedPropertyName: firstUnorderedProperty.name, line } }) } }) } return { VariableDeclarator (node) { const isBarObj = node.id.name === ‘bar’ && node.init.type === ‘ObjectExpression’ if (!isBarObj) return checkOrder(node.init.properties) } } }}这里代码有点多,耐心看完其实挺简单的,大致解释下getOrderMap 方法将数组转成 Map 类型,方面通过 get 获取下标,这里也可以处理多纬数组,例如两个 key 希望在相同的排序等级,不分上下,可以写成:const order = [ ‘meta’ [‘double’, ’treble’]]function getOrderMap () { const orderMap = new Map() ORDER.forEach((name, i) => { if (Array.isArray(property)) { property.forEach(p => orderMap.set(p, i)) } else { orderMap.set(property, i) } }) return orderMap}这样 double 和 treble 就拥有相同的等级了,方便后面扩展,当然实际情况会有 n 个属性的排序规则,也可以在这个规则上轻松扩展,内部的 sort 逻辑就不赘述了。开发就介绍到这里,通过上面安利的在线语法解析工具可以轻松反推出 lint 逻辑。如果 rule 比较复杂,就需要大量的 utils 支持,不然每个 rule 都会显得一团糟,比较考验公共代码提取的能力测试如前面所讲建议使用 jest 进行测试,这里的测试和普通的单元测试还不太一样,eslint 是基于结果的测试,什么意思呢?lint 只有两种情况,通过与不通过,只需要把通过和不通过的情况整理成两个数组,剩下的工作交给 eslint 的 RuleTester 处理就行了上面的属性排序 rule,测试如下:const RuleTester = require(’eslint’).RuleTesterconst rule = require(’../../lib/rules/test’)const ruleTester = new RuleTester({ parserOptions: { ecmaVersion: 6 }})ruleTester.run(’test rule’, rule, { valid: [ const bar = { meta: {}, double: num =&gt; num * 2 } ], invalid: [ { code: const bar = { double: num =&gt; num * 2, meta: {}, }, errors: [{ message: ‘The “meta” property should be above the “double” property on line 2.’ }] } ]})valid 中是希望通过的代码,invalid 中是不希望通过的代码和错误信息,到这里一个 rule 算是真正完成了。打包输出最后写好的 rules 需要发一个 npm 包,以便于在项目中使用,这里就不赘述怎么发包了,简单聊聊怎么优雅的把 rules 导出来。直接上代码:const requireIndex = require(‘requireindex’)// import all rules in lib/rulesmodule.exports.rules = requireIndex(${__dirname}/rules)这里使用了三方依赖 requireindex,对于批量的导出一个文件夹内的所有文件显得简洁很多。当然前提是保证 rules 文件夹下都是 rule 文件,不要把 utils 写进去哈总结行文目的是国内外对于自定义 eslint rule 的相关资源较少,希望分享一些写自定义规则的经验。千万不要在学习 AST 上浪费时间,不同的库对 AST 的实现是不同的,下次写 babel 插件又要学其它的 AST 规则,再次安利一下 AST 神器 astexplorer,只要把需要验证的代码放到 astexplorer 里跑一遍,然后总结出规律,逻辑其实十分简单,对 AST 结果进行判断就行了。从团队层面讲,希望所有的团队都有自己的 eslint 规则库,可以大大降低 code review 的成本,又能保证代码的一致性,一劳永逸的事情。 ...

September 30, 2018 · 4 min · jiezi