实现在 VSCode 中无痛开发 nvue:语法高亮、代码提示、eslint 配置及插件 Patch
实现在 VSCode 中无痛开发 nvue:语法高亮、代码提示、eslint 配置及插件 Patch
前言
.nvue 是 uni-app 中的一种文件类型,它是一种基于 Vue 的模板语法,并使用原生渲染引擎。
如果你需要实现如 map 等功能,使用 nvue 是一个不错的选择。
但是,nvue 在 vscode 中的开发体验并不是很好,没有内置的语法高亮,也没有内置的代码提示,这让我们在开发 nvue 时,并不能享受到 IDE 带来的便利。
本文将会手把手教你如何实现在 vscode 中无痛开发 nvue。
涉及到的知识点有:
vscode设置与扩展eslint配置与插件eslint-plugin-vue源码分析与 patch
正文
支持 Vue3/Vue2 SFC 语法高亮和代码提示
我们知道 .nvue 是基于 vue 的,所以第一步是让 vscode 支持 vue 的语法高亮和代码提示并将 nvue 关联至 vue 文件。
如果你已经实现了 vue 文件的支持,则可以查看添加 nvue 文件关联
在 vscode 的扩展商店中搜索 volar,或直接搜索扩展 ID Vue.volar 安装。

安装完成后,如果你使用的是 vue2 还添加 @vue/runtime-dom 这个依赖。
npm i @vue/runtime-dom -D
添加 nvue 文件关联
首先我们使用 Ctrl + , 打开设置项,并搜索 files.associations:

然后点击添加,并加入 *.nvue 关联 vue,使 vscode 解析 nvue 文件时使用 vue 的方式。

这样,我们就可以在 .vue 与 nvue 文件中享受到语法高亮和代码提示了。
设置 ESLint
在 vscode 中,我们可以通过 eslint 来规范我们的代码,让我们的代码更加规范,更加易读。
同样的,如果你的项目已经支持了 eslint,也可以跳过至添加 override 配置 .nvue 文件的解析。
安装 eslint 依赖
npm i eslint -D
初始化 eslint 配置文件
建议使用 antfu 的 @antfu/elsint-config 一键配置好基本的 ‘.vue’ 文件支持
npm i vue-eslint-parser @antfu/elsint-config -D
vue-eslint-parser 是 eslint 的解析器,用于解析
.vue文件,我们会在后面的步骤中使用到它。
创建 .eslintrc.js 文件
内容如下:
module.exports = {
extends: [
'@antfu,
],
}
如果你需要一些自定义的规则可以添加在 rules 选项中,如:
// .eslintrc.js
module.exports = {
extends: [
'@antfu,
],
rules: {
// 你的自定义规则
'no-console': 'off',
}
}
添加 override 配置 .nvue 文件的解析
在 .eslintrc.js 中添加 overrides 配置,使 eslint 解析 .nvue 文件时使用 vue 的方式。
// .eslintrc.js
module.exports = {
// ...
overrides: [
{
files: '.nvue',
// 使用 vue-eslint-parser 解析 .nvue 文件
parser: 'vue-eslint-parser',
},
],
};
这时 eslint 就可以正常的解析 .nvue 文件了,但是 eslint-plugin-vue 并不能正常的解析 .nvue 文件中的 <template>,<script>,<style> 标签,所以我们需要对 eslint-plugin-vue 进行 patch。
错误示例:

Patch eslint-plugin-vue
在 patch 之前,我们需要先了解一下 eslint-plugin-vue 的工作原理。
eslint-plugin-vue 的核心逻辑就是提供大量的规则,再由 vue-eslint-parser 提供的 AST 进行既定规则的检查。
eslint-plugin-vue 的入口文件,
index.js

如上图的第一个规则 array-bracket-newline,它会检查 [] 之间是否有换行符。
这其实是 eslint 的默认规则,eslint-plugin-vue 只是将 eslint 的规则进行了封装与扩展,使其可以支持检查 .vue 文件。
你可以在
node_modules/eslint-plugin-vue/lib/rules下查看array-bracket-newline的规则。

但 .nvue 的语法与 .vue 是一致的,为什么它不能正常的解析呢?
这点我们可以从 eslint 的官网中找到答案:

因为 eslint-plugin-vue 并没有提供对 .nvue 文件的 Processor(处理器),所以它的规则还是会使用 eslint 的默认规则逻辑,
也就是说,对于 .nvue 文件 eslint-plugin-vue 提供的规则并没有生效,其中也包括了最重要的规则的覆盖。

那么,到这一步我们就可以知道,要想让 eslint-plugin-vue 正常的解析 .nvue 文件,只需要为其提供一个 Processor 的入口即可。
而且它(Processor)的核心逻辑与 .vue 的相同。也就是说我们只需要在 eslint-plugin-vue 中添加一个 .nvue 的 Processor 就可以实现 .nvue 的 patch。
具体实现如下:
// eslint-plugin-vue/lib/index.js
module.exports = {
// ...
processors: {
'.vue': require('./processor'),
'.nvue': require('./processor'),
},
// ...
};
是不是很简单?这样我们就可以正常的使用 eslint-plugin-vue 来检查 .nvue 文件了。
当然,eslint 的 plugin 仅支持 npm package 的方式,所以我们需要将 eslint-plugin-vue 的源码进行打包,然后发布到 npm 上。
这里我就不再赘述了,你可以参考其他的文章。我已经将打包好的 eslint-plugin-vue 发布到了 npm 上,你可以直接安装使用。
pnpm add @jcfe/eslint-plugin-nvue -D
Prettier Overrides
如果你也同时在使用 prettier 作为格式化工具,那么到这一步应该就遇到 eslint-plugin-prettier 的报错了。
错误内容大致如下:
不要慌! 这时只需要在 .prettierrc 等 config 中添加 overrides 配置即可:
.prettierrc
{
"overrides": [
{
"files": "*.nvue",
"options": {
"parser": "vue"
}
}
]
}
修改完之后 重启 VSCode 就 OK 啦。
总结
至此,我们就可以在 uni-app 项目中使用 eslint 来规范我们的代码了。
其实一些项目的源码远比我们想象中的容易阅读,所以大家遇到困难的时候不要放弃,多看看源码,多思考,相信你一定会有所收获的。
当然,如果你有更好的实现方式,欢迎在评论区留言,我会及时回复的。
Siykt的博客