為何我們前端從Vue 2遷移到Svelte?
在使用 Vue 2 作為我們的前端框架將近兩年之後,宣佈不再維護此支援,因此我們決定遷移到一個新的框架。但是選擇哪一個:Vue 3 還是 Svelte?
請注意,我們遷移後的目標也是為了改善我們的開發者體驗,特別是型別檢查、效能和構建時間。我們沒有考慮React,因為它需要花費太多時間來學習,而且與Vue和Svelte相比,它沒有提供一個開箱即用的解決方案。
Vue和Svelte兩者都有相同的單檔案元件的概念:邏輯(JavaScript)、結構(HTML)和樣式(CSS)在同一個檔案中。
因此,我們進行了一些研究,最終選擇了Svelte。下面是對原因和方法的解釋。
Svelte與Vue 3的比較
Svelte的保留率更好。對於我們的新前端,我們不得不從市場上的兩個框架中選擇,即Svelte和Vue 3。下面是過去五年中不同框架的保留率(會再次使用/(會再次使用+不會再次使用))的說明。資料是在JS調查領域的開發者中收集的,我們可以看到,Svelte排在第二位,而Vue 3只排在第四位。
這表明,過去使用過Svelte的開發者中,願意再次使用它的人要比不願意的人多。
Better typing for Svelte.
Vue2 Vue3 Svelte Component-level typing Yes Yes Yes Cross-component typing No Yes Yes Typed events No No Yes |
Svelte提供了更好的型別體驗,更簡單的元件設計過程和內建的型別事件,使其對我們非常友好。
限制性的全域性訪問。在Svelte中,可以從其他檔案中匯入列舉,並在模板中使用它們,而Vue 3則沒有這樣的功能。
語法
就個人而言,我覺得Svelte的語法比Vue更優雅,更方便使用者。你可以檢視下面的程式碼塊,自己看一下。
Svelte:
<script> let firstName = ""; let town = ""; $: fullName = "Full name: " + firstName + ' ' + lastName; const reset = () => { firstName = ""; lastName = ""; } </script> <main> <div> <label>First name</label> <input type="text" bind:value={firstName}> <label>Last name</label> <input type="text" bind:value={lastName}> <button on:click={reset}>Reset</button> </div> <div> {fullName} </div> </main> <style> main{ background-color: white; } </style> |
Vue:
<template> <main> <label>First name </label> <input type="text" v-model="firstName"/> <label>Last name </label> <input type="text" v-model="lastName"/> <div> Full name: {{fullName}} </div> <button @click="handleReset">Reset</button> </main> </template> <script setup> import { ref, computed } from 'vue' const firstName = ref('') const lastName = ref('') const fullName = computed(() => { return firstName.value + " " + lastName.value; }) function handleReset() { firstName.value = "" lastName.value = "" } </script> <style scoped> main{ background-color: white; } </style> |
沒有額外的HTML div <template>。在Svelte中,你可以直接編寫你自己的HTML。
樣式在Svelte中是自動作用域化的,這對維護性來說是個好點,有助於避免CSS的副作用。每個元件的樣式都是孤立的,隻影響該元件,不影響其父級或子級。
不需要計算屬性來更新資料,在Svelte中,感覺更像是用純javascript編碼,你只需要專注於編寫一個箭頭函式。
const reset = () => {firstName = "";lastName = "";} |
在Svelte中,只有單括號是必要的:
//Svelte {fullName} //Vue {{fullName}} |
請注意,這個分析是基於上述具體的程式碼模板,並不打算對框架的差異進行詳細解釋。如需進一步資訊,請隨時上網查詢。
新增純js外掛更簡單。下面是一個使用Svelte和Prism.js的語法高亮整合用例。
// Prism.svelte <script> import Prism from 'prismjs'; export let code; export let lang = 'javascript'; </script> <pre><code class="language-{lang}">{@html Prism.highlight(code, Prism.languages[lang], lang) }</code></pre> // App.svelte <script> import Prism from './Prism.svelte'; let code = 'export const hello =\n\t(name) => {console.log(`Hello ${name}!`)};'; </script> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.28.0/themes/prism-dark.min.css" integrity="sha512-Njdz7T/p6Ud1FiTMqH87bzDxaZBsVNebOWmacBjMdgWyeIhUSFU4V52oGwo3sT+ud+lyIE98sS291/zxBfozKw==" crossorigin="anonymous" referrerpolicy="no-referrer" /> <Prism {code} /> |
編譯程式碼時沒有虛擬DOM。Svelte和Vue的主要區別在於減少了瀏覽器和應用程式之間的層數,這使得任務的完成更加最佳化和快速。
自動更新。在宣告變數的幫助下,Svelte可以自動更新你的資料。這樣一來,你就不需要等待變化反映在你的虛擬結構中,從而獲得更好的使用者體驗。
Svelte也有其缺點
當然,Svelte也有缺點,比如說社群相對較小,因為它是在2019年才出現的。但是,隨著越來越多的開發者可能會接受它的品質和使用者友好的內容,支援以及社群在未來可能會發展和壯大。在Github上已經有定期的和非常好的解釋的更新,可以很容易地訪問。
因此,在回顧了這一分析結果後,我們決定繼續使用Svelte和Svelte Kit,儘管在遷移時SvelteKit仍在積極開發中。(見下文)
我們選擇哪種方法來處理遷移?
時間:我們選擇在8月進行遷移,當時使用該應用程式的人較少。
時間長度:我們花了兩週時間將所有檔案從Vue遷移到Svelte。
開發人員的數量:兩名前端開發者全職工作了兩週,另一名開發者全職工作了一週,所以有三名開發者參與。
工作流程:首先,我們使用Notion工具將我們的票據歸屬給團隊的開發人員。然後,我們開始在Storybook中建立我們的新元件,最後,每個開發人員被賦予一些頁面,在Svelte中重寫。
作為一家初創公司,遷移比較簡單,因為我們沒有一千多份檔案需要重寫,所以我們可以快速執行。然而,我們冒著風險,在SvelteKit還在積極開發的時候就開始遷移,這導致我們在遷移後一個月才不得不做出重大的改變。但是SvelteKit專業的知識團隊為我們提供了一個命令(npx svelte-migrate routes)和一個解釋得非常清楚的遷移指南,真正幫助我們快速適應新的更新。
此外,在9月份,SvelteKit團隊宣佈,該框架終於進入了候選釋出階段,這意味著它的穩定性得到了保證。
相關文章
- 我們為什麼以及是如何從Angular.js遷移到Vue.js?AngularVue.js
- 從入門到放棄,我們為何從 Blazor 回到 VueBlazorVue
- 從eclipse遷移到idea(2 使用習慣篇)EclipseIdea
- 如何從 vue-element-admin 遷移到 Fantastic-adminVueAST
- 團隊解散,我們該何去何從?
- 我們為何去玩“動森”?
- 如何從阿里雲ECS遷移到AWS EC2?阿里
- 從 golang flag 遷移到 cmdrGolang
- 從 Nginx 遷移到 Envoy ProxyNginx
- 我們為什麼選擇VUE來構建前端Vue前端
- 深度學習的困境,我們該何去何從?深度學習
- EF Core從TPH遷移到TPT
- 使用DynamoShake從dynamodb遷移到mongodbMongoDB
- 從mpvue遷移到uni-appVueAPP
- [譯]從 SQLite 逐步遷移到 RoomSQLiteOOM
- [譯] 從 SQLite 逐步遷移到 RoomSQLiteOOM
- 系列好文 | Kubernetes 棄用 Docker,我們該何去何從?Docker
- 從 webpack v1 遷移到 webpack v2 新特性Web
- 【譯】為何我們要寫super(props)?
- Gradle指南之從Groovy遷移到KotlinGradleKotlin
- 從Helm2遷移到 Helm v3 的最佳實踐
- 我如何將部落格遷移到 Kubernetes(上)
- 我如何將部落格遷移到 Kubernetes(下)
- 為什麼把 dig 遷移到 wire
- 如何從 AWS CodeCommit 遷移到極狐GitLab?MITGitlab
- 案例:微服務從Java/SpringBoot遷移到Golang微服務JavaSpring BootGolang
- 從Firebase+Redis遷移到PlanetScale+MySQLRedisMySql
- Spring Boot 從1.5遷移到2.0.5 - DZone JavaSpring BootJava
- 從eclipse遷移到idea(1 安裝篇)EclipseIdea
- 三年 React 開發經驗的我,遷移到 Vue 的心路歷程ReactVue
- “下棋”風靡,為何我們都成了“雲”玩家
- 從本地MySQL遷移到雲資料庫,為什麼是Amazon Aurora?MySql資料庫
- React、Vue和Angular之後的Svelte前端框架 - OliverReactVueAngular前端框架
- 基於Vue2.x的前端架構,我們是這麼做的Vue前端架構
- 環信 uni-app Demo升級改造計劃——Vue2遷移到Vue3(一)APPVue
- 從 Newtonsoft.Json 遷移到 System.Text.JsonJSON
- 記錄從vuecli打包庫遷移到rollup打包Vue
- 從RabbitMQ平滑遷移到RocketMQ技術實戰MQ