Vue2 徹底從 Flow 重構為 TypeScript,煥然一新!

大家好,我是若川。歡迎加我微信?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基礎系列

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/276014.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276014.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276014.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

紅米note5linux刷機包__最新最全的紅米Note5ROM刷機包下載、刷機教程_紅米Note5論壇_移動叔叔...

本帖最后由 壓力山大大叔 于 2018-5-15 00:52 編輯20180513跟新全屏手勢。看最后一張載圖。1:先解鎖,刷第三方,都是這個流程。2非常干凈,只有670兆,刷完沒有找到瀏覽器,刷前下載一個瀏覽器在手機里備用。3電…

每個網頁設計者都自以為是

(一)垃圾還是經典網頁技術更新很快,一個網站的界面設計壽命僅僅2-3年而已。不管是垃圾還是精品,都沒有所謂的經典。經典只存在于是哪個首次成功創新性的應用。網頁設計 者不管自己的學識、技術和經驗如何,都自以為自己…

文件夾的拷貝

文件夾用來把文件包裹起來,褪去這些外衣,說到底拷貝文件夾也就是拷貝文件 模擬實例:將F:/Picture/test 文件夾 拷貝到 F:/Picture/dir文件夾 該實例中test文件夾下只包含了test.txt文件 步驟分析: 1.通過路徑得到File對象 2.遞歸查…

【抽獎】若川誠邀你加前端群,長期交流學習~

最近有許多讀者朋友關注了我,加我好友沒有來得及拉群交流。另外偷偷告訴你:公眾號回復 411,參與抽獎,送極客時間100元以內的課程,今晚八點開獎,必須開獎前加了我的微信&&像是前端&&關注了我…

帝國cms重置管理員_重新設計《紐約時報》 CMS飛行員

帝國cms重置管理員1.什么是飛行員? (1. What Is Pilot?) For 10 weeks, I joined The New York Times’s Story Formats team as a Product Design Intern. Partnered with technology intern Shormie Faruque, we were tasked with redesigning Pilot.大約十個星期…

微信小程序開發 Request Headers: Provisional headers are shown

在微信小程序開發的時候,寫了兩個API請求: 請求A://請求Awx.request({url: https://wx.baidu.com/api/wx/getBallByDate,method: POST,dataType: json,data: {date: that.data.curDate},header: {content-type: application/json},success: function(dt…

昆山萬象匯機器人_昆山十鎮,在售新盤匯總

陸家建偉國際汽車城,均價 7500 元/㎡美吉特家居廣場,均價 17000 元/㎡美吉特燈都,均價 17000 元/㎡花橋綠地象嶼蘇河公園,均價 22950 元/㎡凱德都會新峰,均價 21500 元/㎡越洋國際,均價 18000 元/㎡浦西玫瑰…

Mini 容器學習筆記6——組件的獲取(應用)

1. 通過組件Id獲取組件實例&#xff1a; [Test]public void GetByIdTest(){ServiceRegistry.Register<Person>("person");var person ServiceLocator.Get<IPerson>("person");Assert.IsTrue(person ! null);var person2 ServiceLocator.Get&…

JavaScript ES2021 最值得期待的 5 個新特性解析

大家好&#xff0c;我是若川。歡迎加我微信 ruochuan12&#xff0c;長期交流學習。今天分享一篇關于ES2021的5個新特性。點擊下方卡片關注我&#xff0c;或者查看源碼等系列文章。學習源碼整體架構系列、年度總結、JS基礎系列在寫本文時&#xff0c;本文提到的新的 JavaScript …

uniapp延遲執行_uniapp微信小程序真機調試點擊按鈕有1秒延遲

詳細問題描述(DCloud產品不會有明顯的bug&#xff0c;所以你遇到的問題大都是在特定環境下才能重現的問題&#xff0c;請仔細描述你的環境和重現方式&#xff0c;否則DCloud很難排查解決你的問題)[內容]開發uniapp小程序項目時,在頁面中點擊按鈕后, 數據即時更新, 視圖層延遲1秒…

latex排版基礎_排版基礎分類

latex排版基礎重點 (Top highlight)There are many parts to creating a beautiful, functional, memorizing design. That’s what all User Experience designers set out to do. You need to consider your users, strategy, features, content, color, and so much more. A…

AS3 CookBook學習整理(一)

1. 我要改變swf的尺寸和顏色 在flex builder 3里&#xff0c;默認會生成一個全屏、背景色為#869CA7、幀數為24/秒的swf文件&#xff0c;要修改這些參數&#xff0c;只需要在類文件中定義 [SWF(width"800", height"600", backgroundColor"#ffffff"…

微信小程序研發問題梳理:翻頁:下拉:緩存:canvas:富文本:分享

微信小程序研發問題梳理 最近鼓搗小程序的時候&#xff0c;著實遇到了一些問題&#xff0c;盡管有些再翻看文檔幾遍&#xff0c;就能找到答案&#xff0c;但還是要發揮下爛筆頭的功效&#xff0c;順便梳理下。 問題列表 登錄流程小程序標簽頁地址無法跳轉問題頁面翻頁內容加…

Nginx重啟方式

2019獨角獸企業重金招聘Python工程師標準>>> 重啟方式有三種&#xff1a; 1.簡單型&#xff0c;先關閉進程&#xff0c;修改你的配置后&#xff0c;重啟進程。 2.重新加載配置文件&#xff0c;不重啟進程&#xff0c;不會停止處理請求 3.平滑更新nginx二進制&#x…

axure如何頁面滑動時廣告位上移_新手APP運營如何做廣告位投放

運營是什么&#xff1f;這種問題在各種論壇、貼吧、百度知道、問答百科類中都會出現。上面也有各種大神各式各樣的回答&#xff0c;從不同角度向我們闡述了什么是運營。用 戶運營、內容運營、社區運營、活動運營、市場運營、等等&#xff0c;各種各樣的文章對它們有非常多的分類…

常見的8個前端防御性編程方案

大家好&#xff0c;我是若川。歡迎加我微信 ruochuan12&#xff0c;長期交流學習。今天分享幾個常見的前端防御性編程方案。點擊下方卡片關注我&#xff0c;或者查看源碼等系列文章。學習源碼整體架構系列、年度總結、JS基礎系列關于前端防御性編程我們大多數情況可能遇到過&am…

比特平面分層_平面設計中的分層

比特平面分層One of the first windows to pop up automatically, when I first started using Adobe Photoshop back in 2013, was the Layers one. Albeit I was dabbling around with it for making memes, it was one of the first things I played around with.2013年&…

微軟中國推校園先鋒計劃,保障學生低價獲取正版軟件

2010年7月13日&#xff0c;人人網 Lucky 7 率先向同學們宣布了"微軟校園先鋒計劃"上線的消息&#xff0c;該計劃現在接受學生預購正版 Windows 7 專業版和 Office 2010 專業版&#xff0c;正式銷售的日期為7月19日。該計劃的官網是&#xff1a;http://ms.shop.edu.cn…

Nginx laraval-admin 頁面小圖標不顯示 問題處理

laraval-admin 頁面小圖標不顯示 類似問題 nginx下加載eot|otf|ttf|woff|svg等404 錯誤問題 瀏覽器console控制臺報錯 GET http://admin.xxx.com/vendor/laravel-admin/google-fonts/fonts/Source-Sans-Pro.woff2 net::ERR_ABORTED 404 (Not Found)CSS 樣式引用字體 font-face …

Ajax完整資料加代碼

什么是Ajax&#xff1f;答&#xff1a;Ajax是一種無需加載整個網頁&#xff0c;就能夠更新部分網頁&#xff0c;與后臺交互的技術。Ajax的優點&#xff1f;答&#xff1a;能夠在不更新整個頁面的前提下&#xff0c;維護數據。這使得Web程序可以更快速的回應用戶的動作&#xff…