一句话总结

不同格式化程序执行时长不一样,导致文件格式好后和预期不符。

请务必保持校验(Lint)规则和格式化(Format)规则一致,不然格式化后还是不符合预期是非常讨厌的。

本篇主要讲解怎么调教VSCode的保存时格式化程序。

适用人员

本文用于解决各类格式化冲突问题,如何使用 vscode自带格式化/ESLint/TSLint/Prettier 不在本文讨论范围之内。

看完本文你将收获:

  1. 为什么格式化后依然报错?
  2. 为什么有时候会格式化两次?

现状

多数VSCode使用者安装了冲突的格式化插件,但却不知道如何设置。

一个编辑器里对某个类型的文件有多个Formatter(格式化执行者),是一定会打架的。

常见格式程序执行时长(自测

prettier > default > eslint

意味着 通常情况下 prettier 最后执行完毕。代码样式就由prettier决定了(所以其他程序格式化好后,再prettier格式化可能会闪烁)。

格式化的类型及设置

Shift + Option + F : 手动执行格式化程序。

不同平台执行快捷键不一,见:

How do you format code in Visual Studio Code (VSCode)​stackoverflow.com

若有多个格式化程序,可能会让你选用哪个进行格式化。

Save时格式化

下面的json型设置需要写到setting.json里,详情请看:

Visual Studio Code User and Workspace Settings​code.visualstudio.com

// 保存时使用VSCode 自身格式化程序格式化
"editor.formatOnSave": true,
// 保存时用eslint格式化
"editor.codeActionsOnSave": {"source.fixAll.eslint": true
}
// 两者会在格式化js时冲突,所以需要关闭默认js格式化程序
"javascript.format.enable": false

有哪些格式化程序和插件?

一、VSCode自带格式化程序

以js为例

// 代表默认格式js程序是否开启,默认开启。用eslint格式化js时需要设置为false
// 既然用ESLint进行格式校验,一定也用ESLint来格式化是最能匹配的
"javascript.format.enable": true 

只有一些普适型的格式化规则,够正常适用。

无任何其他格式化插件时执行此格式化程序。

二、ESlint

按照eslint的规则进行格式化,格式化之后eslint还报错不是eslint的原因,是后面又有其他格式化程序格式化成了其他格式。

eslint.validate 无须设置,基本没有意义。

eslint-plugin-vue 可以管到vue文件的html部分。

三、vetur

VSCode 商店里的 Vue 插件。用于在 Vue 单文件中展示不同语言,有格式化、展示、高亮等能力。

安装即默认开启格式化。

// 关闭vetur内的js格式化程序
"vetur.format.defaultFormatter.js": "none",

vetur 内置了 prettier 和 eslint 的能力。实测prettier的执行慢于eslint。所以会出现Vue文件中js格式化后eslint还报错的情况。

prettier: For css/scss/less/js/ts. prettier-eslint: For js. Run prettier and eslint --fix. prettyhtml: For html. stylus-supremacy: For stylus. vscode-typescript: For js/ts. The same js/ts formatter for VS Code.

四、prettier

格式化界的钢铁直男,他有一套自己的格式化规则。

安装即默认开启保存格式化,手动格式化也会触发prettier。 例如若安装了 prettier,vscode 里的所有右下角有 prettier 的均有 prettier 托管格式化,默认程序似乎就不起作用了。

即使不安装 vetur,prettier 也会格式化 vue 文件

总结

格式化由 VSCode 执行,但可能执行者可能是很多种,这是导致格式化‘不好用’的根源所在。

VSCode 本身有个格式化程序

eslint 可以执行格式化 js

prettier 可以执行格式化 js html css 等

vetur 可以执行格式化 vue 单文件中的各类语言

例如: pretter里的indent 缩进默认为 2,可通过"prettier.tabWidth": 4 修改

VSCode如何判断应该使用哪种格式化工具?

文件后缀识别。
不同的文件在 VSCode 里被识别成不同的语言格式,展示在编辑器下方的状态栏里,这非常关键。

所以vue文件通常会被vetur格式化而不是其他的。

prettier 和 eslint 同时格式化

prettier 和 eslint 的 "source.fixAll.eslint": true 若同时存在,会格式化两次(能肉眼可见),最后会以 prettier 的为准。

prettier-eslint

未尝试过,不敢妄断。

按照官方文档是用eslint的规则进行格式化。 使用prettier的格式化能力,使用eslint的格式化规则(eslint的格式化有时候不好用)。

推荐设置

本人设置,仅供参考

以下配置切勿照搬,需要理解原理。如果你有eslint的格式化项目也有tslint的格式化项目,需要对每个项目进行特殊配置。

插件安装

dbaeumer.vscode-eslint(用于eslint报错和格式化)

octref.vetur(用于vue文件识别)

mikebovenlander.formate(vscode没有自动格式化css的程序,用于格式化css和less等)

    // 以下程序用于格式化Vue项目,其他项目可以根据原理一通百通。// 设置保存时格式化。只用于用于格式化css/less程序"editor.formatOnSave": true,// 关闭js/ts的默认format,统一用eslint进行格式化(tslint已经不维护了,所以转eslint吧)"javascript.format.enable": false,"typescript.format.enable": false,// 关闭vetur的js/ts/html的formatter。html用eslint-plugin-vue格式化。// js/ts程序用eslint,防止vetur中的prettier与eslint格式化冲突"vetur.format.defaultFormatter.html": "none","vetur.format.defaultFormatter.js": "none","vetur.format.defaultFormatter.ts": "none",// 开启eslint自动修复js/ts功能"editor.codeActionsOnSave": {"source.fixAll.eslint": true},

说明:在开启了VSCode的默认格式化程序后,Vetur对Vue文件进行识别,格式化时采用prettier格式化Less等类型。但由于关闭了js/ts/html的格式化,所以只用Vetur和Vscode配合格式化CSS程序,TS/JS由ESLint格式化,template由eslint-plugin-vue格式化。

设置后的文件执行的格式化程序

  1. html。相当于利用默认格式化程序
  2. JS/TS。用eslint的save format即可。但是需要删掉默认的vscode的设置
  3. 纯css/less文件。VSCode没有格式化样式的格式化程序,可以用插件 mikebovenlander.formate进行格式化
  4. vue 文件。关闭vetur部分formatter。 js 直接使用eslint和eslint-plugin-vue格式化 。less使用其自带的prettier格式化 。html使用 eslint-plugin-vue 格式化。

若帮到了你,请点赞 哦~

本文涉及的语言

JavaScript Less Typescript Vue HTML 等

英文关键字

Prettier not working in VSCode

Eslint format not working in VSCode

Vetur format not working in VSCode

vscode html 格式化_详解VSCode 格式化不符合预期的问题相关推荐

  1. vscode自动加前缀_详解VScode自动补全CSS3前缀插件以及配置无效的解决办法

    1.在vscode中搜索Autoprofixer 2.在安装完成之后要配置 在需要添加前缀的css文件上,右键点击命令面板,输入Autoprefixer CSS就好啦 ps: 如果想要兼容性最好的话, ...

  2. Java之格式化字符串及格式化输出详解

    Java之格式化字符串及格式化输出详解: 格式化输出: Java 5引入了与C语言的printf函数风格类似的format方法和printf方法,这两个方法可用于java.io.PrintStream ...

  3. mysql日期格式化 yyyymmdd_mysql中格式化日期详解

    1. DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据. DATE_FORMAT(date,format) format参数的格式有 %a 缩写星期名 %b 缩写月名 %c 月,数值 ...

  4. Python print函数及format()格式化输出详解

    今天继续给大家介绍Python相关知识,本文主要内容是Python print函数及format()格式化输出详解. 一.print()函数基本使用 print()函数是Python中用于向控制台输出 ...

  5. python strptime函数转时间数组_python time.strptime格式化实例详解

    在python的时间使用时,我们无非就是输出字符串的形式,又或者是其他的形式跟字符串之间的来回转换.时间数组对于我们获取具体的年或是天数,都是常用的首段.本篇需要讲到的time.strptime函数, ...

  6. 大脑构造图与功能解析_大脑的结构和功能分区_详解人脑构造与功能

    大脑的结构和功能分区 _ 详解人脑构造与功能 学习,可以开阔人的大脑 ; 学习,可以使人的大脑拥有更多的知识,人的大脑和肢 体一样,多用则灵,不用则废.那么下面学习啦小编给大家分享一些大脑的结构和功 ...

  7. dateformat 返回类型_详解Java中格式化日期的DateFormat与SimpleDateFormat类

    DateFormat其本身是一个抽象类,SimpleDateFormat 类是DateFormat类的子类,一般情况下来讲DateFormat类很少会直接使用,而都使用SimpleDateFormat ...

  8. html5边框顶格,CSS 三种定位方式以及格式化上下文详解 》 html5jscss

    常规流( Normal flow ) 之称之为常规流,是因为这是相对于后面的浮动和绝对定位的一个概念,浮动和绝对定位元素都脱离了当前的常规流. 在 CSS2.1中,常规流包括块框( block box ...

  9. Spring MVC Formatter(数据格式化)详解

    Spring MVC 框架的 Formatter<T> 与 Converter<S,T> 一样,也是一个可以将一种数据类型转换成另一种数据类型的接口.不同的是,Formatte ...

最新文章

  1. App用户体验的一点思考
  2. Struts2-Action的基本流程
  3. 关于FragmentPager实现Fragment的滑动切换
  4. 巅峰对决!Spring Boot VS .NET 6
  5. 排序算法之快速排序(Java)
  6. Week 1 Team Homework #3 from Z.XML-软件工程在北航
  7. 解决C#网络通信编程的阻塞问题
  8. BZOJ4025 二分图
  9. 信用评分模型详解(上)之 评分卡模型
  10. php 命格算法,八字格局中的弃命格mdash;mdash;从势格
  11. k8s集群Canal的网络控制
  12. 单片机C51学习心得_02
  13. springboot yml文件不是绿叶子问题
  14. 15、项目:见缝插针游戏---界面
  15. JSP婚纱影楼管理系统myeclipse开发sql数据库bs框架java编程jdbc
  16. 「网站服务器硬件配置」网站服务器配置要求
  17. 超级精仿高仿金山手机卫士源码
  18. mysql ver 14.14 distrib 5.5.49_MySQL简介及安装 mysql Ver 14.14 Distrib 5.7.28
  19. 【愚公系列】2023年05月 网络安全高级班 040.WEB渗透与安全(红队渗透测试技术分类和工具箱)
  20. NAS入门之——My Cloud EX2 Ultra通过USB连接外置硬盘

热门文章

  1. 链表应用 多项式相加
  2. 基于Java+jsp+servlet的养老院管理系统设计和实现《收藏版》
  3. 《SpringCloud超级入门》Spring Cloud Eureka是什么?《八》
  4. mysql删除员工_数据库删除职工信息
  5. java线程池案例_使用Executors 和 ThreadPoolExecutor实现Java线程池案例
  6. java类快速构造_程序员有什么办法能快速梳理java知识点?有这八张图就够了
  7. html5svg在线编辑器,SVG to Canvas在线转换工具
  8. Java 获取链表的元素
  9. 中职计算机组成原理期末,计组期末复习
  10. 山东大学 2020级数据库系统 实验四