大部分前端项目都配置Stylelint
、Eslint
、Tslint
和Prettier
四大前端代码校验工具。「代码校验工具」以下简称Lint
,为了解决代码不严谨,通过预设规则校验代码,检测其是否存在错误/漏洞
,并对错误/漏洞
提示修复方案并尽可能依据修复方案格式化出正确代码。该功能称为「格式化代码」,基本上所有编辑器都需配置该功能。
Lint
其实就是编辑器里运行的一个脚本进程,将代码解析成抽象语法树
,遍历抽象语法树
并通过预设规则做一些判断和修改,再将新的抽象语法树
转换成正确代码。整个校验过程都跟抽象语法树
相关,若暂未接触过抽象语法树
,可阅读babel源码
或eslint源码
了解其工作原理。
开发过程中启用Lint
能带来以下好处。
团队编码规范
,让新旧组员编码习惯得到一致提升团队编码风格
,让预设规则符合新旧组员心理预期可维护性
和可接入性
,让新组员能快速适应项目的架构与需求无用代码
、重复代码
、错误代码
和漏洞代码
的产生几率千万不能自私
有些同学可能一时适应不了Lint
带来的强制性操作,会在自己编辑器里关闭项目所有校验功能,这种自私行为会带来很严重的后果。
若上传无任何校验痕迹的代码块,当其他组员将该代码块更新合并到原有代码上时,由于编辑器一直配置着团队编码规范
,导致被拉下来的代码块立马报错甚至产生冲突。
上述情况会让其他组员花费更多时间解决因为你不遵守规矩而带来的问题,还浪费团队为了研究如何让整体编码风格更适合组员的精力。
这种自私行为不可取,若团队无任何编码规范可随意编码,若已认可团队编码规范
那就努力遵守,不给团队带来麻烦。
本文着重讲解「一键格式化代码」的部署,像Lint
常用配置就不会讲解,毕竟百度谷歌一搜一大堆。这个「一键」当然是ctrl+s
或cmd+s
保存文件啦。在保存文件时触发Lint
自动格式化代码,这个操作当然不能100%
保证将代码格式化出最正确代码,而是尽可能依据修复方案格式化出正确代码。言下之意就是可能存在部分代码格式化失败,但将鼠标移至红色下划线上会提示修复方案,此时可依据修复方案自行修正代码。
为何写下本文?笔者有着严谨的代码逻辑和优雅的编码风格,所以特别喜欢格式化代码。然而又不想为每个项目配置Lint
,这些重复无脑的复制粘贴让笔者很反感,所以笔者只想一次配置全局运行Lint
,这样就无需为每个项目配置Lint
。在大量百度谷歌都未能搜到一篇相关文章(搜到的全部文章都是单独为一个项目配置,害
),笔者就花了半年多时间探讨出本方案,真正做到「一次配置全局运行」。若使用本方案,相信能将所有项目的Stylelint
、Eslint
、Tslint
和Prettier
相关依赖和配置文件全部移除,使项目目录变得超级简洁,如同下图。
笔者选用VSCode
作为前端开发的编辑器,其他编辑器不是性能差就是配置麻烦,所以统统放弃,只认VSCode
。
在此强调两个重要问题,这两个问题影响到后面能否成功部署VSCode
的「一键格式化代码」。
Tslint
官方已宣布废弃Tslint
,改用Eslint
代替其所有校验功能Eslint
部分配置与Prettier
部分配置存在冲突且互相影响,为了保证格式化性能就放弃接入Prettier
所以部署VSCode
的「一键格式化代码」只需安装Stylelint
和Eslint
两个插件。为了方便表述,统一以下名词。
VSCode插件
NPM依赖
前方高能,两大步骤就能为VSCode
部署「一键格式化代码」,请认真阅读喔!
安装依赖
为了搞清楚两个插件集成哪些NPM依赖
,以下区分安装stylelint
和eslint
及其相关依赖(「看看即可,不要安装,重点在后头」)。笔者有个习惯,就是喜欢将依赖更新到最新版本,在享受新功能的同时也顺便填坑。
# Stylelint
npm i -D stylelint stylelint-config-standard stylelint-order
# Eslint
npm i -D eslint babel-eslint eslint-config-standard eslint-plugin-html eslint-plugin-import eslint-plugin-node eslint-plugin-promise eslint-plugin-react eslint-plugin-standard eslint-plugin-vue vue-eslint-parser
# TypeScript Eslint
npm i -D @typescript-eslint/eslint-plugin @typescript-eslint/parser typescript eslint-config-standard-with-typescript
安装完成后需配置多份对应配置文件,CSS方面有css/scss/less/vue
文件,JS方面有js/ts/jsx/tsx/vue
文件。查看插件文档,发现Stylelint
只能在settings.json
上配置,而Eslint
可配置成多份对应配置文件,并在settings.json
上通过特定字段指定Eslint
配置文件路径。
settings.json是VSCode的配置文件,用户可通过插件暴露的字段自定义编辑器功能。
由于配置文件太多不好管理,笔者开源了自己平常使用的配置文件集合,详情可查看vscode-lint。
js文件
jsx文件
vue文件
TypeScript
ts文件
tsx文件
vue文件
配置文件里的rule
可根据自己编码规范适当调整,在此不深入讲解,毕竟简单得来谁都会。建议使用vscode-lint
,若校验规则不喜欢可自行调整。
Stylelint
请戳这里Eslint
请戳这里TypeScriptEslint
请戳这里VueEslint
请戳这里以下会基于vscode-lint
部署VSCode
的「一键格式化代码」,找个目录通过git
克隆一份vscode-lint
,并安装其NPM依赖
。若使用vscode-lint
,上述依赖就不要安装了。
git clone https://github.com/JowayYoung/vscode-lint.git
cd vscode-lint
npm i
配置插件
打开VSCode
选择左边工具栏
的插件
,搜索并安装Stylelint
和Eslint
,安装完成后重启VSCode
选择文件 → 首选项 → 设置
,设置
里可选用户
和工作区
「用户」:配置生效后会作用于全局项目(若大部分项目都是单一的React应用或Vue应用推荐使用全局配置
)
「工作区」:配置生效后只会作用于当前打开项目
点击设置
右上角中间图标打开设置(json)
,打开的对应文件是settings.json
(上述有提及)
插入以下配置:若在用户
选项下插入以下配置,遇到其他项目需覆盖配置时在工作区
选项下插入eslint.options.configFile
指定Eslint
配置文件路径
重启VSCode
:为了保障每次修改配置后都能正常格式化代码,必须重启VSCode
{
"css.validate": false,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true,
"source.fixAll.stylelint": true
},
"eslint.nodePath": "path/vscode-lint/node_modules",
"eslint.options": {
"configFile": "path/vscode-lint/eslintrc.js"
},
"less.validate": false,
"scss.validate": false,
"stylelint.configBasedir": "path/vscode-lint",
"stylelint.configOverrides": {
"extends": "stylelint-config-standard",
"plugins": [
"stylelint-order"
],
"rules": {
"at-rule-empty-line-before": "never",
"at-rule-no-unknown": [
true,
{
"ignoreAtRules": [
"content",
"each",
"error",
"extend",
"for",
"function",
"if",
"include",
"mixin",
"return",
"while"
]
}
],
"color-hex-case": "lower",
"comment-empty-line-before": "never",
"declaration-colon-newline-after": null,
"declaration-empty-line-before": "never",
"function-linear-gradient-no-nonstandard-direction": null,
"indentation": "tab",
"no-descending-specificity": null,
"no-missing-end-of-source-newline": null,
"no-empty-source": null,
"number-leading-zero": "never",
"rule-empty-line-before": "never",
"order/order": [
"custom-properties",
"declarations"
],
"order/properties-order": [
// 布局属性
"display",
"visibility",
"overflow",
"overflow-x",
"overflow-y",
"overscroll-behavior",
"scroll-behavior",
"scroll-snap-type",
"scroll-snap-align",
// 布局属性:浮动
"float",
"clear",
// 布局属性:定位
"position",
"left",
"right",
"top",
"bottom",
"z-index",
// 布局属性:列表
"list-style",
"list-style-type",
"list-style-position",
"list-style-image",
// 布局属性:表格
"table-layout",
"border-collapse",
"border-spacing",
"caption-side",
"empty-cells",
// 布局属性:弹性
"flex-flow",
"flex-direction",
"flex-wrap",
"justify-content",
"align-content",
"align-items",
"align-self",
"flex",
"flex-grow",
"flex-shrink",
"flex-basis",
"order",
// 布局属性:多列
"columns",
"column-width",
"column-count",
"column-gap",
"column-rule",
"column-rule-width",
"column-rule-style",
"column-rule-color",
"column-span",
"column-fill",
"column-break-before",
"column-break-after",
"column-break-inside",
// 布局属性:格栅
"grid-columns",
"grid-rows",
// 尺寸属性
"box-sizing",
"margin",
"margin-left",
"margin-right",
"margin-top",
"margin-bottom",
"padding",
"padding-left",
"padding-right",
"padding-top",
"padding-bottom",
"border",
"border-width",
"border-style",
"border-color",
"border-colors",
"border-left",
"border-left-width",
"border-left-style",
"border-left-color",
"border-left-colors",
"border-right",
"border-right-width",
"border-right-style",
"border-right-color",
"border-right-colors",
"border-top",
"border-top-width",
"border-top-style",
"border-top-color",
"border-top-colors",
"border-bottom",
"border-bottom-width",
"border-bottom-style",
"border-bottom-color",
"border-bottom-colors",
"border-radius",
"border-top-left-radius",
"border-top-right-radius",
"border-bottom-left-radius",
"border-bottom-right-radius",
"border-image",
"border-image-source",
"border-image-slice",
"border-image-width",
"border-image-outset",
"border-image-repeat",
"width",
"min-width",
"max-width",
"height",
"min-height",
"max-height",
// 界面属性
"appearance",
"outline",
"outline-width",
"outline-style",
"outline-color",
"outline-offset",
"outline-radius",
"outline-radius-topleft",
"outline-radius-topright",
"outline-radius-bottomleft",
"outline-radius-bottomright",
"background",
"background-color",
"background-image",
"background-repeat",
"background-repeat-x",
"background-repeat-y",
"background-position",
"background-position-x",
"background-position-y",
"background-size",
"background-origin",
"background-clip",
"background-attachment",
"bakground-composite",
"mask",
"mask-mode",
"mask-image",
"mask-repeat",
"mask-repeat-x",
"mask-repeat-y",
"mask-position",
"mask-position-x",
"mask-position-y",
"mask-size",
"mask-origin",
"mask-clip",
"mask-attachment",
"mask-composite",
"mask-box-image",
"mask-box-image-source",
"mask-box-image-width",
"mask-box-image-outset",
"mask-box-image-repeat",
"mask-box-image-slice",
"box-shadow",
"box-reflect",
"filter",
"mix-blend-mode",
"opacity",
"object-fit",
"clip",
"clip-path",
"resize",
"zoom",
"cursor",
"pointer-events",
"user-modify",
"user-focus",
"user-input",
"user-select",
"user-drag",
// 文字属性
"line-height",
"line-clamp",
"vertical-align",
"direction",
"unicode-bidi",
"writing-mode",
"ime-mode",
"text-overflow",
"text-decoration",
"text-decoration-line",
"text-decoration-style",
"text-decoration-color",
"text-decoration-skip",
"text-underline-position",
"text-align",
"text-align-last",
"text-justify",
"text-indent",
"text-stroke",
"text-stroke-width",
"text-stroke-color",
"text-shadow",
"text-transform",
"text-size-adjust",
"src",
"font",
"font-family",
"font-style",
"font-stretch",
"font-weight",
"font-variant",
"font-size",
"font-size-adjust",
"color",
// 内容属性
"tab-size",
"overflow-wrap",
"word-wrap",
"word-break",
"word-spacing",
"letter-spacing",
"white-space",
"caret-color",
"quotes",
"content",
"content-visibility",
"counter-reset",
"counter-increment",
"page",
"page-break-before",
"page-break-after",
"page-break-inside",
// 交互属性
"will-change",
"perspective",
"perspective-origin",
"backface-visibility",
"transform",
"transform-origin",
"transform-style",
"transition",
"transition-property",
"transition-duration",
"transition-timing-function",
"transition-delay",
"animation",
"animation-name",
"animation-duration",
"animation-timing-function",
"animation-delay",
"animation-iteration-count",
"animation-direction",
"animation-play-state",
"animation-fill-mode",
// Webkit专有属性
"-webkit-overflow-scrolling",
"-webkit-box-orient",
"-webkit-line-clamp",
"-webkit-text-fill-color",
"-webkit-tap-highlight-color",
"-webkit-touch-callout",
"-webkit-font-smoothing",
"-moz-osx-font-smoothing"
]
}
}
}
以上配置的path
为vscode-lint
所在的根目录,若刚才的vscode-lint
克隆到E:/Github
,那么path
就是E:/Github
。
上述步骤完成后就可愉快敲代码了。每次保存文件就会自动格式化CSS代码
或JS代码
,这个格式化代码不仅会将代码按照规范整理
和排序
,甚至尽可能依据修复方案格式化出正确代码。
这样就无需为每个项目配置Lint
,将所有项目的Stylelint
、Eslint
、Tslint
和Prettier
相关依赖和配置文件全部移除,使项目目录变得超级简洁。
css/scss/less/vue文件
js/ts/jsx/tsx/vue文件
很多同学反映eslint v6+
在VSCode
上失效,最高版本只能控制在v5.16.0
。其实这本身就是配置问题,跟版本无关。vscode-lint
的eslint
使用v7
照样能使用Eslint
,只要配置正确就能正常使用。
上述安装行为使用了NPM
,那么settings.json
的eslint.packageManager
必须配置为npm
(小写),但最新版本Eslint
已默认此项,所以无需配置。若上述安装行为变成yarn install
,那么必须在settings.json
里添加以下配置。
{
"eslint.packageManager": "yarn"
}
这个配置就是解决该问题的关键了。
首次安装Eslint
可能会在js/ts/jsx/tsx/vue
文件里看到以下警告。
Eslint is disabled since its execution has not been approved or denied yet. Use the light bulb menu to open the approval dialog.
说明Eslint
被禁用了,虽然配置里无明确的禁用字段,但还是被禁用了。此时移步到VSCode
右下角的工具栏,会看到禁用图标+ESLINT
的标红按钮,单击它会弹出一个弹框,选择Allow Everywhere
就能启用Eslint
所有校验功能。
整体过程看似简单,其实笔者这半年填了很多坑才有了vscode-lint
,中间已省略了很多未记录的问题,这些疑问不重要却影响到很多地方。相信本文能让很多同学体验VSCode
一键格式化代码所带来的快感,最关键的部分还是无需为每个项目配置Lint
,这省下多少时间和精力呀!
本文由哈喽比特于3年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/ULTfBSIXNsCfqFU6WOnVPQ
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。