- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
Vetur - 作用于*.vue
文件
- 代码高亮
- 代码片段
- Emmet 语法支持
- 语法错误校验检查
- 格式化代码
- 代码提醒
- 对三方 UI 框架的支持
安装
-
vscode侧边栏
扩展
-> 搜索Vetur
-> 安装截止20211012 Vetur最新版本:
Vue tooling for VS Code 0.34.1
快捷键使用:Shift + alt + f
- 如果之前已安装并已快捷键使用过其他格式化工具,如
Prettier
,则在settings.json
去掉其相应配置:{ // …… // 定义一个默认格式化程序, 该格式化程序优先于所有其他格式化程序设置。必须是提供格式化程序的扩展的标识符 "[vue]": { "editor.defaultFormatter": "esbenp.prettier-vscode", }, // …… }
- 关闭
settings.json
中的"[vue]"
配置后,Shift + alt + f
快捷键格式化时,编辑器将弹出窗口,让你重新选择所需格式化工具,这里选择vetur
使用Vetur时出现问题的解决方案:
- Vetur issues
- 大部分Vetur扩展问题,都可以在该issues查找到
- 如果安装后无法使用,提示
扩展Vetur无法格式化
,尝试重启VSCode, 或运行Vetur重启命令Restart VLS
, 如果最终还是无法使用,安装Vetur另外版本,如0.30.3
vetur
与Prettier
的配合使用:
vetur
的formatter大多采用Prettier
的格式化风格。- 所以在使用
vetur
的时候,我们选择继续安装Prettier
扩展程序,与vetur
配合使用。- 当然,你也可以选择
js-beautify-html
、prettyhtml
等其他扩展程序与vetur
搭配。
- 当然,你也可以选择
- Prettier使用方式:VSCode扩展工具 2. 格式化工具Prettier
定制Vetur+Prettier
配置项settings.json
:
{
/* Vetur ->Start */
"vetur.ignoreProjectWarning": true, // 忽略警告提示: Vetur find tsconfig.json/jsconfig.json, but they aren’t in the project root.
"vetur.useWorkspaceDependencies": true, // 使用本项目的依赖版本
"vetur.validation.template": true, // vetur模板校验template/style/script,错误提示将来自 ESLint 插件eslint-plugin-vue,而不是 Vetur,确保项目或全局有安装ESLint相关插件
"vetur.validation.templateProps": true, // Prop属性校验,export default { props: { str: String }}
"vetur.experimental.templateInterpolationService": true, // Vetur 现在提供完成、诊断、悬停、跳转到定义、查找这些 JavaScript 片段v-if等的API资料, 也可禁用模板诊断vetur.validation.interpolation: false
"vetur.validation.interpolation": false, // 不对新 TS 语法进行校验
"vetur.format.defaultFormatter.html": "prettier", // Valid values: "none", "prettier", "js-beautify-html". 配置值范围取决于你当前编辑器所安装的格式化扩展程序,如js-beautify-html => Beautify 扩展程序
"vetur.format.defaultFormatter.pug": "prettier",
"vetur.format.defaultFormatter.css": "prettier",
"vetur.format.defaultFormatter.postcss": "prettier",
"vetur.format.defaultFormatter.scss": "prettier",
"vetur.format.defaultFormatter.less": "prettier",
"vetur.format.defaultFormatter.stylus": "stylus-supremacy",
"vetur.format.defaultFormatter.js": "prettier",
"vetur.format.defaultFormatter.ts": "prettier",
"vetur.format.defaultFormatter.sass": "sass-formatter",
"vetur.format.options.tabSize": 2,
"vetur.format.options.useTabs": false, // 是否利用tab替代空格
"vetur.format.styleInitialIndent": true, // 对vue文件中的style是否统一缩进格式
"vetur.format.scriptInitialIndent": false, // 对vue文件中的script是否统一缩进格式
// 支持自定义块显示格式
"vetur.grammar.customBlocks": {
"docs": "md",
"i18n": "json"
},
// vetur格式 HTML 模板
"vetur.format.defaultFormatterOptions": {
"prettier": { // 如果这里prettier不配置,则默认采用prettier的公共配置
"printWidth": 100,
"tabWidth": 2, // prettier的tabWidth未明确设置时,取"vetur.format.options.tabSize" (useTabs 工作方式相同)
"singleQuote": true, // 用单引号
"semi": false, // 不加分号
"trailingComma": "none", // 禁止末尾添加逗号
"javascript.format.insertSpaceBeforeFunctionParenthesis": true, // 函数括号前是否加空格
"typescript.format.insertSpaceBeforeFunctionParenthesis": true, // 函数括号前是否加空格
"arrowParens": "avoid" // (x) => {} 箭头函数参数只有一个时是否要有小括号。avoid:省略括号
},
// Beautify 扩展程序
"js-beautify-html": {},
// 已弃用
"prettyhtml": {}
},
"[vue]": {
// 定义一个默认格式化程序, 该格式化程序优先于所有其他格式化程序设置。必须是提供格式化程序的扩展的标识符
"editor.defaultFormatter": "octref.vetur",
// "editor.formatOnSave": true, // 保存时是否自动格式化
},
/* Vetur ->End */
}
vetur.config.js 使用Vetur定义全局组件
-
vetur.config.js
作用:- Vetur 支持定义全局组件,可以通过配置选项
projects.globalComponents
,从而在项目的任何位置为该组件注册模板插值。 - 严格校验vue语法规则,红色警告提示
- Vetur 支持定义全局组件,可以通过配置选项
-
vetur.config.js
存放位置:- 当您的项目不是在 monorepo 众项目代码仓库, 并且
package.json/(ts|js)config.json
位于项目根目录时,那么将配置文件vetur.config.js
放于当前项目根目录下,与package.json/(ts|js)config.json
同级。
- 当您的项目不是在 monorepo 众项目代码仓库, 并且
-
安装或使用过程出现的问题
- vetur 常见问题
- VSCode报错提示:
Could't start client Vue Language Server
- 解决方法:
- 参考文档:# Unknown problem with vue language server crash #2724
- 在以上参考文档中并没有找到合适的解决方案,最终笔者选择降低Vetur版本,选择安装
V0.31.1
版本 - 安装完新版本后,重启VSCode或用
Ctrl + shift + p
命令重启Vetur Language Server服务:Vetur: Restart VLS
- 解决方法:
- Vue + js 的项目,vetur却报ts的语法错误:
Property 'xxx' does not exist on type ……
- 解决方法:参考文档:
Property 'xxx' does not exist on type 'CombinedVueInstance'
- 配置
vetur.validation.interpolation: false
禁用模板诊断,这样一来将不会获得对新 TS 语法的支持
- 配置
- 解决方法:参考文档:
-
vetur.config.js
配置文件内容:- vetur.config.js 配置参考文档
- 可将VSCode的
Settings.json
中的vetur配置内容,直接复制一份放置vetur.config.js
的settings
选项当中,再根据项目需要进行调整 - Project中的
vetur.config.js
优先级大于VSCode的settings.json
- 修改VSCode
settings.json
的vetur配置内容,只需要稍微等待便可看到项目代码校验效果; - 而修改
vetur.config.js
的配置内容,则需用Ctrl + shift + p
命令重启Vetur Language Server服务:Vetur: Restart VLS
,才能看到配置效果
注意:除
projects.root
是必填外,其他如projects.globalComponents
等选项没有需要配置的值时,可以选择注释掉,避免报错;
// vetur.config.js
/** @type {import('vls').VeturConfig} */
// vetur配置,会覆盖vscode中的设置
module.exports = {
// **optional** default: `{}`
// override vscode settings part
// Notice: It only affects the settings used by Vetur.
settings: {
"vetur.ignoreProjectWarning": true, // 忽略警告提示: Vetur find tsconfig.json/jsconfig.json, but they aren’t in the project root.
"vetur.useWorkspaceDependencies": true, // 使用本项目的依赖版本
"vetur.validation.template": true, // vetur模板校验template/style/script,错误提示将来自 ESLint 插件eslint-plugin-vue,而不是 Vetur,确保项目或全局有安装ESLint相关插件
"vetur.validation.templateProps": true, // Prop属性校验,export default { props: { str: String }}
"vetur.experimental.templateInterpolationService": true, // Vetur 现在提供完成、诊断、悬停、跳转到定义、查找这些 JavaScript 片段v-if等的API资料, 也可禁用模板诊断vetur.validation.interpolation: false
"vetur.validation.interpolation": false, // 不对新 TS 语法进行校验
},
// **optional** default: `[{ root: './' }]`
// support monorepos
projects: [
'./', // shorthand for only root.
{
// **required**
// Where is your project?
// It is relative to `vetur.config.js`.
root: './',
// **optional** default: `'package.json'`
// Where is `package.json` in the project?
// We use it to determine the version of vue.
// It is relative to root property.
package: './package.json',
// **optional**
// Where is TypeScript config file in the project?
// It is relative to root property.
// tsconfig: './tsconfig.json',
// **optional** default: `'./.vscode/vetur/snippets'`
// Where is vetur custom snippets folders?
// snippetFolder: './.vscode/vetur/snippets',
// **optional** default: `[]`
// Register globally Vue component glob.
// If you set it, you can get completion by that components.
// It is relative to root property.
// Notice: It won't actually do it. You need to use `require.context` or `Vue.component`
globalComponents: [
'./src/components/**/*.vue',
{
// Component name
name: 'FakeButton',
// Component file path, please use '/'.
path: './src/app/components/AppButton.vue'
}
]
}
]
}