惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
I
InfoQ
Engineering at Meta
Engineering at Meta
Jina AI
Jina AI
Recent Announcements
Recent Announcements
T
The Blog of Author Tim Ferriss
P
Proofpoint News Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
D
Docker
Microsoft Security Blog
Microsoft Security Blog
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
GbyAI
GbyAI
博客园 - Franky
博客园 - 聂微东
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 叶小钗
酷 壳 – CoolShell
酷 壳 – CoolShell
B
Blog RSS Feed
WordPress大学
WordPress大学
MyScale Blog
MyScale Blog
月光博客
月光博客
罗磊的独立博客

Ray's Blog

从 GitHub Discussions 自动生成静态评论区 — Ray's Blog 给 2025 年的告别 — Ray's Blog Ray's Blog 可重用的工作流 — Ray's Blog Ray's Blog 把博客用 Nuxt Content 重写及踩坑记录 — Ray's Blog Ray's Blog 你这个级别的 Devtools 无权哈我 — Ray's Blog 辞旧迎新:Ray 的 2024 年终总结 — Ray's Blog Ray's Blog 使用 ip6tables 在群晖 DiskStation 上开启 Docker Bridge 网络 IPV6 支持(不支持 SA6400) — Ray's Blog Ray's Blog 迟来了一个月的 2023 年度总结 + 2024 新年快乐! — Ray's Blog Vue Language Tools 深度解析 (1):Vue 编辑器插件发展历程及基本工作原理 — Ray's Blog Ray's Blog TypeScript 小寄巧!如何在不使用 const 泛型修饰符的情况下推导出列表字面量? — Ray's Blog Ray's Blog 快使用 Dprint 换掉你的 Prettier 罢(迫切 — Ray's Blog Ray's Blog chi 的小红包冒险 v.e.r. 2023 — Ray's Blog Ray's Blog 打造一个强大的 PowerShell 终端 =) — Ray's Blog Ray's Blog 2023 新年快乐! + 年度总结 — Ray's Blog Ray's Blog Clerc:一个轻量但强大的命令行框架 — Ray's Blog Ray's Blog 无服务器动态博客系统 Dolan:从设想到现实 — Ray's Blog Ray's Blog 使用 Scoop + 版本管理器科学地管理你的开发环境! — Ray's Blog
Ray's Blog
i@mk1.io (Ra · 2024-01-19 · via Ray's Blog

Vue Language Tools 深度解析 (1):Vue 编辑器插件发展历程及基本工作原理

Vue Language Tools 深度解析 (1):Vue 编辑器插件发展历程及基本工作原理

作为一门独立的模板语言,编写 Vue SFC 时必不可少的就是像 TSX 一样的自动补全、错误提示等功能。而这些功能的实现离不开编辑器插件与语言服务器。自 Vue 诞生以来,有三个项目为 Vue 提供了语言功能 Vetur,VueDX 和本系列的主角 Vue Language Tools。本文将从历史的角度出发,介绍这三个项目的发展历程,以及 Vue Language Tools 的基本工作原理。

Vetur 在发布之初实际上并没有提供 <template> 块中的 JavaScript 语言功能,而是仅仅提供了 HTML 的补全。Katashin 提出了一个 issue,希望能够在 <template> 块中提供 JavaScript 的补全。Katashin 后来自己实现了一个简单的类型检查器 (原文),不过由于它没有复用 TypeScript 的类型检查器,所以它的功能非常有限。后来海老师提出了一个思路,即将 <template> 转换为等价的 TypeScript,然后让 TypeScript 的类型检查器来检查它,最后通过 SourceMap 将自动补全、错误提示等功能映射回 <template>。这个思路最终被采纳,也成为了日后所有 Vue 语言工具的基本工作原理。

Vetur 使用 vue-eslint-parser (eslint-plugin-vue 用的那个) 作为 SFC 解析器,然后遍历 <template> 中的 AST 节点,同时生成等价的 TS 代码 (称为 Virtual Code,虚拟代码)。Vetur 这里的代码生成用的是 TypeScript 的 API。具体的工作原理请见 Pine 的文章

VueDX 没有 Vetur 那么出名,不过两者的工作方式大致相同。VueDX 手写了一个轻量级的 SFC 解析器,然后将 <template> 转换为 TSX 代码,最后映射回 <template>。VueDX 的代码生成用的是 @vue/compiler-dom 的 API。

上面提到的两者都手写了 SourceMap 映射