大家好,我是若川。欢迎加我微信 ruochuan12,长期交流学习。今天分享一篇技术热点,众所周知,前不久vue3不打算支持IE11,vue2将支持composition API,现在vue2用ts重构,试问:还学得动嘛^_^。点击下方卡片关注我,或者查看源码等系列文章。学习源码整体架构系列、年度总结、JS基础系列


事情起源于 4 月 7 号晚上,尤雨溪在推特说,Vue2 收到了一个将整个代码库迁移到 TypeScript 的 PR。

Evan's twitter

去 Github 围观了一下chore: move to typescript 这个 PR[1],基本上是 10w 行级别代码量的改动,把整个 Vue2 的代码库从原先的 flow 类型系统全部迁移到了 TypeScript,包括代码、构建系统、各种 lint 工具等等,恐怖的战斗力!

Github PR

这个 PR 的贡献者是 Carlos Rodrigues[2],以下是他的自我介绍:

Fullstack developer, interested in @vuejs, @dotnet and @nodejs.

Typescript ????‍♂️

Consultant ????️‍♂️

全栈开发工程师,Vue.js、dotnet、Node.js 的爱好者。

TypeScript 魔法师 ????‍♂️

顾问 ????️‍♂️。

起源

Vue2 为什么最开始选择 Flow 作为类型系统?其实在一个 2016 年的知乎问题Vue 2.0 为什么选用 Flow 进行静态代码检查而不是直接使用 TypeScript?[3]里,尤雨溪已经详细说明了这个问题,以下是当时他的回答:

这个选择最根本的还是在于工程上成本和收益的考量

Vue 2.0 本身在初期的快速迭代阶段是用 ES2015 写的,整个构建工具链也沿用了 Vue 1.x 的基于 ES 生态的一套(Babel, ESLint, Webpack, Rollup...),全部换 TS 成本过高,短期内并不现实。

相比之下 Flow 对于已有的 ES2015 代码的迁入/迁出成本都非常低:

  1. 可以一个文件一个文件地迁移,不需要一竿子全弄了。

  2. Babel 和 ESLint 都有对应的 Flow 插件以支持语法,可以完全沿用现有的构建配置;

  3. 更贴近 ES 规范。除了 Flow 的类型声明之外,其他都是标准的 ES。万一哪天不想用 Flow 了,用 babel-plugin-transform-flow-strip-types 转一下,就得到符合规范的 ES。

  4. 在需要的地方保留 ES 的灵活性,并且对于生成的代码尺寸有更好的控制力 (rollup / 自定义 babel 插件)

不过在 2018 年的时候,尤大更新了回答,真香定律再现:

真香

也正因如此,Vue3 从一开始就选择了 TypeScript 作为类型系统。

困扰

那么也许有人要问,Vue2 不是已经稳定了吗,何必再大费周章的把这么多代码迁移到 TypeScript 中呢?其实在之前 Vue3 放弃 IE11 的 RFC 中就有提及,之后还是会为 Vue 2.7 去加入一些和 Vue3 语法更类似的功能:

  • 把 @vue/composition-api plugin[4]合并进 Vue2。这会让使用 Composition API 开发的库同时支持 Vue2 和 Vue3。

  • 单文件组件(SFC)中的script setup[5]语法。

  • emits 选项。

  • 提升 TypeScript 类型支持。

  • 在 Vite 中正式支持 Vue 2(目前通过非官方插件[6])

而这些功能的开发和适配,如果继续用 flow 的话,势必会带来一些割裂的开发体验。一些已经用 TS 开发好的库,也没办法做代码的合并。事实上 Twitter 也有网友提出了这个问题,PR 作者进行了回答:

Why

简单来说,就是为 Vue 2.7 的开发做准备,尤其是 composition-api 的代码合并。

具体内容

先看作者对这次更新的简单描述:

  1. 代码格式化风格更新。

  2. 重构。

  3. 构建相关的改动。

  4. 代码库更新为 TypeScript 编写。

值得一提的是,更换成 TS 之后,生成的代码体积都有少量的增加,作者猜测是 TS 加入了一些 runtime 的代码导致的:

第一个 Commit 中,作者把代码的类型全部改成 .ts,移除文件开头 flow 的标记,并且把类型的语法全部替换成 TypeScript:

作者用 TS 的 import type 语法重构了类型导入,我个人也比较喜欢这样导入类型,更有助于区分导入的内容:

单测工具的更新,以及 TS 的支持,利用 ts-loader 做编译:

RollUp 版本的一次大升级:

ESLint 也需要一些改动,使用 @typescript-eslint/parser,继承的一些推荐预设也改为 @typescript-eslint/eslint-recommended

CI 中原本 flow 的类型检测,也改成使用 tsc --noEmit 做 TS 的类型检查。

评价

可怕的是,这个如此庞大的 PR 是作者在几天内完成的,这战斗力简直是惊人。

Twitter 的评论中有人提问:“把如此巨大的代码库迁移到 TypeScript 需要多长时间?”

作者回答:在几小时内重命名文件,把 flow types 重写成 TS 类型并修复错误,之后的几天主要是忙构建、测试相关的工作。

对此,外国推友也表示很震惊:

“你简直是个机器”:

“他生活的宇宙中,1 小时可以顶我们 24 小时,或者也可能他是用光速在敲代码”

CamiloR:“太棒了,很高兴核心团队之外,也有人付出如此多的努力”

Carlos:“我就是核心团队的成员 ????”

总结

不得不感叹,十倍工程师是真实存在的……这样一次巨型代码库迁移只花了短短几天时间,其实也体现出作者在 TS 生态、构建以及测试相关方面的熟悉程度。

感谢 Vue 核心团队成员们夸张的战斗力,给前端界带来这么优秀的框架而且持续迭代和优化。

Vue 3 虽然是未来,但是 Vue 2 也不会被放弃,迁移到 TS 以后的 Vue 2 具有更强的代码可移植性,一定会绽放出更多精彩。

参考资料

[1]

chore: move to typescript 这个 PR: https://github.com/vuejs/vue/pull/12001/commits

[2]

Carlos Rodrigues: https://twitter.com/pikax_dev

[3]

Vue 2.0 为什么选用 Flow 进行静态代码检查而不是直接使用 TypeScript?: https://www.zhihu.com/question/46397274/answer/101193678

[4]

@vue/composition-api plugin: https://github.com/vuejs/composition-api

[5]

script setup: https://github.com/vuejs/rfcs/pull/227

[6]

非官方插件: https://github.com/underfin/vite-plugin-vue2


最近组建了一个江西人的前端交流群,如果你也是江西人可以加我微信 ruochuan12 拉你进群。


················· 若川出品 ·················

今日话题

今天分享一个chrome浏览器标签预览功能,打开chrome://flags,搜索tab hover Card Images,改成Enabled就开启啦,快试试吧。欢迎分享、收藏、点赞、在看我的公众号文章~

一个愿景是帮助5年内前端人走向前列的公众号

可加我个人微信 ruochuan12,长期交流学习

推荐阅读

我在阿里招前端,我该怎么帮你?(现在还能加我进模拟面试群)

如何拿下阿里巴巴 P6 的前端 Offer

点击方卡片关注我,或者查看源码等系列文章。
学习源码整体架构系列、年度总结、JS基础系列

Vue2 彻底从 Flow 重构为 TypeScript,焕然一新!相关推荐

  1. 如何将三万行代码从Flow移植到TypeScript?

    作者 | David Gomes 译者 | 弯月 责编 | 郭芮 来源 |  CSDN(ID:CSDNnews) [编者按]在内存安全中,类型安全是很重要的一个命题.为了确保JavaScript项目运 ...

  2. 押错宝!一次性将百万行代码从 Flow 迁移至 TypeScript

    作者 | Caleb Meredith,Andrew Wang 译者 | 弯月      责编 | 欧阳姝黎 出品 | CSDN(ID:CSDNnews) 以下为译文: 最近,为了紧跟时代发展的脚步, ...

  3. 将 30 万行代码从 Flow 迁移到 TypeScript 是一种怎样的体验?

    作者 | Roger Goldfinger 译者 | 弯月 责编 | 伍杏玲 出品 | CSDN(ID:CSDNnews) [CSDN 编者按]本文作者在当前正在使用 Flow 下,想一次性切换到Ty ...

  4. 如何将三万行代码从 Flow 移植到 TypeScript?

    [CSDN编者按]在内存安全中,类型安全是很重要的一个命题.为了确保JavaScript项目运行的类型安全,本文的作者介绍了2016年时使用Flow的经历:由Facebook支持的Flow方案,不仅拥 ...

  5. Yarn将用TypeScript重写,Flow惨遭亲爹抛弃!

    1月25日,Yarn官方团队在GitHub issue中宣布将对Yarn进行重大更改,主要包括:将代码库从Flow移植到TypeScript,不再支持Node 4和Node 6,并为Yarn新增了一些 ...

  6. TypeScript 2.5 发布,增加语言级重构

    在 TypeScript 2.5 版本中,Microsoft 专注于提高开发人员的生产力,其范围已经超出了代码编辑器所提供的常见功能. 习惯于类型语言(如 C#)的开发人员喜欢使用那些可以轻松执行常见 ...

  7. docwizard c++程序文档自动生成工具_如何开发一个基于 TypeScript 的工具库并自动生成文档

    为什么用 TypeScript? TypeScript is a typed superset of JavaScript that compiles to plain JavaScript. Any ...

  8. 作为前端开发,如何高效学习 TypeScript

    大家好,我是若川.有朋友跟我说最近面试前端候选人,问到关于 JavaScript 的一些少见误区问题,候选人很多都没回答上来,他很诧异,一个从国际大厂出来的面试者,竟然对 JavaScript 的一些 ...

  9. Typescript 学习笔记一:介绍、安装、编译

    前言 整理了一下 Typescript 的学习笔记,方便后期遗忘某个知识点的时候,快速回忆. 为了避免凌乱,用 gitbook 结合 marketdown 整理的. github地址是:ts-gitb ...

最新文章

  1. 雷林鹏分享:CSS 链接
  2. 如何找到在SAP社区上经过SAP官方认可比较有影响力的SAP从业者
  3. oracle编写备份数据库代码,oracle_oracle数据库创建备份与恢复脚本整理,1:创建用户 复制代码 代码如 - phpStudy...
  4. gulp 和npm_为什么我离开Gulp和Grunt去看npm脚本
  5. WaitForSingleObject 和 EnterCriticalSection 效率比较
  6. 【白皮书分享】2020中国房地产白皮书.pdf(附下载链接)
  7. 简单几步把Spring Boot 项目部署到 K8S,步骤来了!
  8. 元旦快乐代码html,好看的元旦节祝福留言代码:元旦快乐,踩个顶个走人
  9. RTL8762DW手环烧录方法
  10. 创新创业孵化知识体系-创业实践导论之-技术专栏
  11. 电脑版微信打开内置浏览器
  12. comsol 计算机配置,[转]我需要一台什么样的电脑运行我的COMSOL Multiphysics - 仿真模拟 - 小木虫 - 学术 科研 互动社区...
  13. 如鹏网.Net三层架构 第四章代码生成器
  14. c语言程序设计杨明莉刘磊答案,清华大学出版社-图书详情-《C/C++程序设计基础与实践教程(第2版)》...
  15. 芬兰建筑师帕特里克•艾瑞克森先生一行再次到访云创
  16. SM2 加解密注意事项
  17. 域名授权验证系统v1.0.6开源版本网站源码
  18. 如何实现360度的手游安全防护?网易云易盾专家分享最新实践
  19. 天猫双十一狂抢优惠券?机智的程序猿这么玩
  20. bitmap的六种压缩方式,Android图片压缩

热门文章

  1. docker 打包_Springboot2.0学习11 使用maven插件打包docker部署应用
  2. android 智能指针的学习先看邓凡平的书扫盲 再看前面两片博客提升
  3. Python基础—06-函数基础
  4. 【服务器】一次对Close_Wait 状态故障的排查经历
  5. Windows下OpenSSL创建CA证书以及客户端和服务器端证书
  6. PowerDesigner的文章
  7. 浅谈优化SQLServer数据库服务器内存配置的策略
  8. http1.0和http1.1和http2.0有什么区别
  9. jvm堆空间的常用参数设置
  10. commons-httpclient 和 httpclient 区别