大家好,今天小编来为大家解答夹小玩具出门WRITEAS这个问题,这些工具可以帮你写出干净的代码很多人还不知道,现在让我们一起来看看吧!
想写出好代码,却不知道从哪里开始?想删除死代码?想在代码库中找出未被使用的变量?想在代码中找出有问题的模式?
你是多元化团队的负责人吗?你的团队中有新来的开发人员吗?你担心他们会写出不符合标准的代码吗?在代码评审时是否花了一整天的时间去检查代码标准,而不是实际的逻辑实现?
我一直在做这样的事情,经常忙得像热锅上的蚂蚁。但从现在开始,我们要保证永远不再担心这类问题。在阅读本文过程中,如果遇到困难,可以参考代码库(https://github.com/adeelibr/react-starter-kit)。
本文更多地是针对React应用程序,但同样适用于其他Web项目。
Prettier是一种代码格式化程序,它以特定的方式为你格式化代码。
创建一个叫作app的文件夹,进入该文件夹,在命令行中敲入:
npminit-yn
这将在app文件夹中创建一个package.json文件。
我将在本文中使用yarn,但你也可以使用npm。
yarnadd--devprettiern
这将安装package.json中指定的开发依赖项,如下所示:
{n"name":"react-boiler-plate",n"version":"1.0.0",n"description":"Areactboilerplate",n"main":"src/index.js",n"author":"AdeelImran",n"license":"MIT",n"scripts":{n"prettier":"prettier--writesrc/**/*.js"n},n"devDependencies":{n"prettier":"^1.14.3"n}n}n
稍后我会解释“prettier”:“prettier?—?writesrc/**/*.js”的作用,现在先让我们在app文件夹中创建一个src/文件夹。在src/文件夹中,再创建一个名为index.js的文件——名字可以随意起。
在index.js文件中,按原样粘贴这句话:
letperson={nname:"Yoda",ndesignation:'JediMaster'n};nnnnnfunctiontrainJedi(jediWarrion){nif(jediWarrion.name==='Yoda'){nconsole.log('Noneed!alreadytrained');n}nconsole.log(`Training${jediWarrion.name}complete`)n}nnntrainJedi(person)ntrainJedi({name:'Adeel',ndesignation:'padawan'n});n
到目前为止,我们有了一个src/app/index.js文件,包含了一些难看的代码。
我打算选择第二项,所以我们安装了一个依赖项,并在package.json中声明了Prettier。
现在在app根文件夹中创建一个prettier.config.js文件,并在其中添加一些Prettier规则:
module.exports={nprintWidth:100,nsingleQuote:true,ntrailingComma:'all',nbracketSpacing:true,njsxBracketSameLine:false,ntabWidth:2,nsemi:true,n};n
printWidth将确保你的单行代码不会超过100个字符。
singleQuote会将所有双引号转换为单引号。
trailingComma将确保在最后一个对象属性的末尾会有一个逗号。
bracketSpacing在对象字面量之间打印空格:
IfbracketSpacingistrue-Example:{foo:bar}nIfbracketSpacingisfalse-Example:{foo:bar}n
jsxBracketSameLine将在多行JSX元素的最后一行放置>:
//trueexamplen<buttonnclassName="prettier-class"nid="prettier-id"nonClick={this.handleClick}>nClickHeren</button>nn//falseexamplen<buttonnclassName="prettier-class"nid="prettier-id"nonClick={this.handleClick}n>nClickHeren</button>n
tabWidth指定单个缩进的空格数。
如果semi设置为true,将在语句末尾加上;。
现在让我们来说说这个脚本的作用:
“prettier”:“prettier—writesrc/**/*.js”n
它的意思是运行prettier,并让它在src/文件夹中查找所有的.js文件。–write标志告诉prettier要把格式化好的内容保存到文件中,并找出格式化过程中发现的任何异常。
yarnprettiern
这是我在运行代码时看到的:
由于JavaScript是动态类型的,而且是一种松散类型的语言,因此开发人员在使用这门语言时很容易犯错。因为不经过编译,所以通常需要在执行.js文件的情况下才能发现语法或其他错误。
像ESLint这样的linting工具可以帮助开发人员在不执行JavaScript代码的情况下发现问题。
ESLint中的所有东西都是可插拔的,你甚至可以在运行时添加规则。你添加的每个linting规则都是独立的,任何一个规则都可以独自打开或关闭。每个规则都可以设置为警告或错误级别。
我一直在使用Airbnb的风格指南。这个风格指南一直有人在维护,在本文中,我将使用受Airbnb风格指南启发的规则集。
{n"name":"react-boiler-plate",n"version":"1.0.0",n"description":"Areactboilerplate",n"main":"src/index.js",n"author":"AdeelImran",n"license":"MIT",n"scripts":{n"lint":"eslint--debugsrc/",n"lint:write":"eslint--debugsrc/--fix",n"prettier":"prettier--writesrc/**/*.js"n},n"husky":{n"hooks":{n"pre-commit":"lint-staged"n}n},n"lint-staged":{n"*.(js|jsx)":["npmrunlint:write","gitadd"]n},n"devDependencies":{n"babel-eslint":"^8.2.3",n"eslint":"^4.19.1",n"eslint-config-airbnb":"^17.0.0",n"eslint-config-jest-enzyme":"^6.0.2",n"eslint-plugin-babel":"^5.1.0",n"eslint-plugin-import":"^2.12.0",n"eslint-plugin-jest":"^21.18.0",n"eslint-plugin-jsx-a11y":"^6.0.3",n"eslint-plugin-prettier":"^2.6.0",n"eslint-plugin-react":"^7.9.1",n"husky":"^1.1.2",n"lint-staged":"^7.3.0",n"prettier":"^1.14.3"n}n}n
在开始进行配置之前,先让我们来看看每个依赖包的功能。
babel-eslint:这个包让你可以轻松在Babel上使用lint。如果你不使用ESLint尚不支持的Flow或实验性功能,则不一定需要这个插件。
eslint:这是lint代码所需的主要工具。
eslint-config-airbnb:这个包提供了所有Airbnb的ESLint配置,你可以修改它们。
eslint-plugin-babel:babel-eslint的插件伴侣。
eslint-plugin-import:这个插件旨在支持ES2015+(ES6+)的导入/导出语法,并防止出现拼写错误的文件路径和导入名称。
eslint-plugin-jsx-a11y:适用于JSX元素可访问性规则的linting规则。
eslint-plugin-prettier:让ESLint与Prettier的使用更顺畅。
eslint-plugin-react:特定于React的linting规则。
eslint-config-jest-enzyme:用于特定于React和Enzyme的全局变量。这个lint配置让ESLint知道有哪些全局变量,并且不会针对它们发出警告——有点像断言it和describe。
eslint-plugin-jest:Jest的ESLint插件。
husky:在自动化部分会进行更多介绍。
lint-staged:在自动化部分会进行更多介绍。
现在我们已经有了基本的了解,接下来可以开始了。
在app/根目录创建.eslintrc.js文件:
module.exports={ntenv:{nttes6:true,nttbrowser:true,nttnode:true,nt},ntextends:['airbnb','plugin:jest/recommended','jest-enzyme'],ntplugins:[ntt'babel',ntt'import',ntt'jsx-a11y',ntt'react',ntt'prettier',nt],ntparser:'babel-eslint',ntparserOptions:{nttecmaVersion:6,nttsourceType:'module',nttecmaFeatures:{ntttjsx:truentt}nt},ntrules:{ntt'linebreak-style':'off',//Don'tplaynicelywithWindows.ntt'arrow-parens':'off',//Incompatiblewithprettierntt'object-curly-newline':'off',//Incompatiblewithprettierntt'no-mixed-operators':'off',//Incompatiblewithprettierntt'arrow-body-style':'off',//Notourtaste?ntt'function-paren-newline':'off',//Incompatiblewithprettierntt'no-plusplus':'off',ntt'space-before-function-paren':0,//Incompatiblewithprettierntt'max-len':['error',100,2,{ignoreUrls:true,}],//airbnbisallowingsomeedgecasesntt'no-console':'error',//airbnbisusingwarnntt'no-alert':'error',//airbnbisusingwarnntt'no-param-reassign':'off',//Notourtaste?ntt"radix":"off",//parseInt,parseFloatradixturnedoff.Notmytaste.ntt'react/require-default-props':'off',//airbnbuseerrorntt'react/forbid-prop-types':'off',//airbnbuseerrorntt'react/jsx-filename-extension':['error',{extensions:['.js']}],//airbnbisusing.jsxntt'prefer-destructuring':'off',ntt'react/no-find-dom-node':'off',//Idon'tknowntt'react/no-did-mount-set-state':'off',ntt'react/no-unused-prop-types':'off',//Isstillbuggyntt'react/jsx-one-expression-per-line':'off',nntt"jsx-a11y/anchor-is-valid":["error",{"components":["Link"],"specialLink":["to"]}],ntt"jsx-a11y/label-has-for":[2,{nttt"required":{ntttt"every":["id"]nttt}ntt}],//fornestedlabelhtmlForerrornntt'prettier/prettier':['error'],nt},n};n
还要在app/根目录中添加.eslintignore文件:
/.gitn/.vscodennode_modulesn
我们先介绍一下.eslintrc.js文件的作用。
module.exports={nenv:{},nextends:{},nplugin:{},nparser:{},nparserOptions:{},nrules:{},n};nenv:用于预定义全局变量。在我们的例子中,可用的环境包括es6、browser和es6。es6将启用除模块之外的所有ECMAScript6功能。browser将添加所有浏览器全局变量,如Windows。node将添加Node全局变量和Node作用域,比如global。extends:字符串数组——扩展了之面配置的额外配置选项。现在我们正在使用airbnb的linting规则,这些规则被扩展到jest,然后是jest-enzyme。plugins:插件基本上就是我们想要使用的linting规则。现在我们正在使用babel、import、jsx-a11y、react、prettier。parser:默认情况下,ESLint使用Espree,但因为我们使用了babel,我们还需要使用Babel-ESLint。parserOptions:如果我们将Espree的默认解析器更改为babel-eslint,需要指定parserOptions——它是必需的。我通过选项告诉ESLint,ecmaVersion是6。因为我们在EcmaScript模块(而不是script)中编写代码,所以我们将sourceType指定为module。由于我们使用了React,引入了JSX,所以在ecmaFeatures中加了jsx选项,并将其设置为true。rules:我们已经扩展并通过插件添加的所有规则,我们可以更改或覆盖它们。
3、现在介绍一下.eslintignore。
.eslintignore里包含了我们不希望ESLint对它们进行lint的路径列表。这里我只指定三个:
接下来让我们来看看package.json中新添加的脚本。
"lint":"eslint--debugsrc/"n"lint:write":"eslint--debugsrc/--fix"n$yarnlint——运行这个命令,它将遍历src/中的所有文件,并在每个找到错误的文件中提供详细日志,你可以手动打开这些文件并更正错误。$yarnlint:write——运行这个命令,它将执行与上述命令相同的操作。不同的地方在于,如果它可以纠正它发现的错误,它将纠正它们,并尝试从代码中尽可能多地移除代码坏气味。让它更自动化一些
到目前为止,我们设置好了prettier和eslint,但每次我们都要运行脚本。接下来我们让它更加自动化一些。
要在保存代码时进行格式化和lint,需要使用像VSCode这样的编辑器:
安装ESLint扩展插件。在此(https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)下载插件或在VSCode编辑器中按下ctrl+shift+x打开扩展模块,搜索eslint,将出现一系列插件。安装DirkBa??eumer开发的那个。安装完成后,点击reload按钮重新启动编辑器。
安装好这个插件后,在app/根文件夹中创建一个名为.vscode/的文件夹——不要忘了那个点号,这个非常重要。
在文件夹中创建一个settings.json文件,如下所示:
{n"editor.formatOnSave":false,n"eslint.autoFixOnSave":true,n}neditor.formatOnSave——我在这里将它设置为false,因为我不希望文件格式的默认编辑器配置与ESLint和Prettier发生冲突。eslint.autoFixOnSave——我在这里将它设置为true,因为我希望每次在保存文件时安装的插件都能正常工作。由于ESLint的配置关联了Prettier的配置,所以每次在点击保存时,它都会格式化和lint你的代码。
需要注意的是,当你运行yarnlint:write时,它也会lint和美化你的代码。
试想一下,如果你有2万行代码,然后通过手动的方式进行审计和改进,然后再想象一下用一个命令就可以完成所有事情。手动方法可能需要30天,而自动方法可能只需要30秒。
脚本已经设置好了,每次点击保存时,编辑器都会对特定文件做出神奇的回应。但是,并不是团队中的每个人都会选择使用VSCode。不过没关系,我们可以更自动化一些。
husky(https://github.com/typicode/husky)是一个Git钩子,你可以在提交代码前或在将代码推送到分支时执行某些特定的操作。
yarnadd--devhuskyn
然后在package.json文件中添加以下内容:
"husky":{n"hooks":{n"pre-commit":"YOUR_COMMAND_HERE",n"pre-push":"YOUR_COMMAND_HERE"n}n},n
每次在提交或推送代码时,它都会执行某个脚本或命令——比如运行测试用例或格式化代码。
lint-staged(https://github.com/okonet/lint-staged)可以在暂存(Gitstaged)文件上运行linter,这样就不会将错误的代码推送到分支上。
在提交代码之前进行lint是很有意义的,你可以确保没有错误进入到代码库中,并且可以强制应用代码样式。但在整个项目上运行lint过程会很慢,而且有些lint结果可能无关紧要。你可能只想对要提交的文件进行lint。
这个项目提供了一个脚本,这个脚本将执行任意的shell任务,并将暂存文件列表作为参数,按指定的通配模式进行文件过滤。
yarnadd--devlint-stagedn
然后在package.json文件中添加:
"lint-staged":{n"*.(js|jsx)":["npmrunlint:write","gitadd"]n},n
这段配置的意思是先运行lint:write命令,然后将文件添加到暂存区域。它仅针对.js和.jsx文件运行这个命令,但你也可以根据需要针对其他文件运行这个命令。
每次提交代码之前,都会运行一个叫作lint-staged的脚本,这个脚本将运行npmrunlint:write命令,这个将lint并格式化你的代码,然后将代码添加到暂存区并提交。
最终的package.json文件应如下所示。
{n"name":"react-boiler-plate",n"version":"1.0.0",n"description":"Areactboilerplate",n"main":"src/index.js",n"author":"AdeelImran",n"license":"MIT",n"scripts":{n"lint":"eslint--debugsrc/",n"lint:write":"eslint--debugsrc/--fix",n"prettier":"prettier--writesrc/**/*.js"n},n"husky":{n"hooks":{n"pre-commit":"lint-staged"n}n},n"lint-staged":{n"*.(js|jsx)":["npmrunlint:write","gitadd"]n},n"devDependencies":{n"babel-eslint":"^8.2.3",n"eslint":"^4.19.1",n"eslint-config-airbnb":"^17.0.0",n"eslint-config-jest-enzyme":"^6.0.2",n"eslint-plugin-babel":"^5.1.0",n"eslint-plugin-import":"^2.12.0",n"eslint-plugin-jest":"^21.18.0",n"eslint-plugin-jsx-a11y":"^6.0.3",n"eslint-plugin-prettier":"^2.6.0",n"eslint-plugin-react":"^7.9.1",n"husky":"^1.1.2",n"lint-staged":"^7.3.0",n"prettier":"^1.14.3"n}n}n
现在,每当你提交代码时:
$gitadd.n$gitcommit-m"somedescriptivemessagehere"n
它将根据.eslintrc.js文件的所有规则对代码进行lint和格式化。有了这个,你就可以确保没有坏代码被推到生产环境中。
首先在app/根文件夹中创建一个.editorconfig文件,然后在该文件中粘贴以下代码:
#EditorConfigisawesome:http://EditorConfig.orgnn#top-mostEditorConfigfilenroot=truen[*.md]ntrim_trailing_whitespace=falsen[*.js]ntrim_trailing_whitespace=truenn#Unix-stylenewlineswithanewlineendingeveryfilen[*]nindent_style=spacenindent_size=2nend_of_line=lfncharset=utf-8ninsert_final_newline=truenmax_line_length=100n
那么EditorConfig是什么东西?
并不是每个人都会使用VSCode,所以为了让每个人保持统一(例如在制表符空格或换行方面),我们使用.editorconfig,这样有助于强制执行某些规则。
支持EditorConfig(https://editorconfig.org/)的编辑器包括WebStorm、AppCode、Atom、Eclipse、Emacs、bbedit,等等。
英文原文:https://medium.freecodecamp.org/these-tools-will-help-you-write-clean-code-da4b5401f68e
《学习Dart的10大理由》
《你的前端知识框架,该如何搭建?》
《最新Go语言学习路线图》
查看文章,点击了解更多
关于夹小玩具出门WRITEAS和这些工具可以帮你写出干净的代码的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
还没有评论,来说两句吧...