摘要:苗條的框架正是作者的初始目的,苗條包括代碼編寫量打包大小等等。是已經(jīng)編譯后的組件有什么缺點是一個剛起步不久的前端框架,無論在維護人員還是社區(qū)上都是大大不如三大框架,這里列舉一下本人認為的存在的缺點。
Svelte 的作者也是 rollup 的作者 Rich Harris,前端界的輪子哥。sevlte 項目首次提交于 2016 年 11 月 16 日,目前版本是 3.6.1(2019-06-27),v3 版本進行了大改動,跟之前的版本有很大的差別(v1、v2 版本 API 用法跟 vue 很像,v3 完全屬于自己的風格)。
看下 2016-12-02,尤雨溪大神對此框架的評價(當然已經(jīng)過時了,但是核心的思想還是一致的):
這個框架的 API 設計是從 Ractive 那邊傳承過來的(自然跟 Vue 也非常像),但這不是重點。Svelte 的核心思想在于『通過靜態(tài)編譯減少框架運行時的代碼量』。舉例來說,當前的框架無論是 React Angular 還是 Vue,不管你怎么編譯,使用的時候必然需要『引入』框架本身,也就是所謂的運行時 (runtime)。但是用 Svelte 就不一樣,一個 Svelte 組件編譯了以后,所有需要的運行時代碼都包含在里面了,除了引入這個組件本身,你不需要再額外引入一個所謂的框架運行時!什么是 Svelte?
Svelte 跟 vue 和 react一樣,是一個數(shù)據(jù)驅(qū)動組件框架。但是也有很大的不同,它是一個運行時框架,無需引入框架本身,同時也沒用到虛擬 DOM(運行時框架特性決定了這個框架跟虛擬 DOM 無緣)。
Svelte runs at build time, converting your components into highly efficient imperative code that surgically updates the DOM. As a result, you"re able to write ambitious applications with excellent performance characteristics.
雖然沒使用到虛擬 DOM,但一樣可以達到出色的性能,而且對開發(fā)者編寫代碼是十分便捷。
與 React 和 Vue 有和不同?那么我們先看下 svelte 的因為意思:苗條的。苗條的框架正是作者的初始目的,苗條包括代碼編寫量、打包大小等等。
總結(jié)一下這個框架的優(yōu)勢,即作者開發(fā)新框架的目的。
靜態(tài)編譯,無需引入框架自身
一個 Svelte 組件是靜態(tài)編譯,所有需要的運行時代碼都包含在里面了,除了引入這個組件本身,你感覺不到框架存在。
編寫更少代碼
svelte 模板提供一些簡便的用法,在維護和編寫上都變得更簡單,代碼量更少(維護的代碼),這些模板會編譯為最終的js 代碼。
只會打包使用到的代碼
即 tree shaking,這個概念本來也是作者首先提出來的,webpack 是參考了 rollup。
無需虛擬 DOM 也可進行響應式數(shù)據(jù)驅(qū)動
更便捷的響應式綁定
既有響應式數(shù)據(jù)的優(yōu)點,v3 版本也解決了 vue 數(shù)據(jù)綁定缺點,用起來十分方便。
簡單用法對比react hook
import React, { useState } from "react"; export default () => { const [a, setA] = useState(1); const [b, setB] = useState(2); function handleChangeA(event) { setA(+event.target.value); } function handleChangeB(event) { setB(+event.target.value); } return (); };{a} + {b} = {a + b}
vue
{{a}} + {{b}} = {{a + b}}
svelte
{a} + {b} = {a + b}
都不用多說,一眼就看出來,svelte 簡單多了。
為什么不使用虛擬 DOM?在 react 和 vue 盛行的時代,你會聽說虛擬 DOM 速度快,而且還可能被灌輸一個概念,虛擬 DOM 的速度比真實 DOM 的速度要快。
所以如果你有這個想法,那么你肯定疑惑 svelte 沒用到虛擬 DOM,它的速度為什么會快?
其實虛擬 DOM 并不是什么時候都快,看下粗糙的對比例子。
對比例子這里并沒有直接統(tǒng)計渲染的時間,通過很多條數(shù)據(jù)我們就可以感受出來他們直接的性能。特別是點擊每條數(shù)據(jù)的時候,明顯感覺出來(由于是在線上的例子,所以首次渲染速度不準確,主要看點擊的響應速度)。
當然這僅僅是在 50000 條數(shù)據(jù)下的測試,對比一下框架所謂的速度,實際的情況下我們是不會一次性展示這么多數(shù)據(jù)的。所以在性能還可行的情況下,更多的選擇是框架所帶來的的便利,包括上手難度、維護難度、社區(qū)大小等等條件。
svelte
https://svelte.dev/repl/367a2...
{#each data as d, i}Hello {name} {i} s2umqgg!
{/each}
vue
http://jsrun.net/kFyKp/edit
Hello {{name}} {{i}} {ua0es0s}!
const list = [] for(let i = 0; i < 50000; i++) { list.push(i); } const beginTime = +new Date(); new Vue({ el: "#component-demo", data: { list: list, name: "Hello" }, methods:{ click(index){ const list = new Array(50000); list[index] = "test" this.list = list } }, mounted(){ const endTime = +new Date(); console.log((endTime - beginTime) / 1000,1); } })
react
http://jsrun.net/TFyKp/edit
const list = [] for(let i = 0; i < 50000; i++) { list.push(i); } class App extends React.Component { constructor(props){ super(props); this.state = { list } } click(i) { return ()=>{ list[i] = "test" this.setState({ list, }) } } render() { return (總結(jié){this.state.list.map((v,k)=>{ return() } } function render() { ReactDOM.render(Hello wolrd {k} {v}!
) })}, document.getElementById("root") ); } render();
首先虛擬 DOM 不是一個功能,它只是實現(xiàn)數(shù)據(jù)驅(qū)動的開發(fā)的手段,沒有虛擬 DOM 我們也可以實現(xiàn)數(shù)據(jù)驅(qū)動的開發(fā)方式,svelte 正是做了這個事情。
單純從上面的對比例子來看,svelte 的速度比虛擬 DOM 更快(不同框架虛擬 DOM 實現(xiàn)會有差別)。雖然沒有進行更深層次的對比,但是如果認為虛擬 DOM 速度快的觀點是不完全對的,應該說虛擬 DOM 可以構(gòu)建大部分速度還可以的 Web 應用。
Svelte 有哪些好用的特性?
完全兼容原生 html 用法
編寫代碼是那么的自然,如下面就是一個組件。
{ test }
響應式也是那么的自然
{ count }
表達式也可以是響應式的
這個就牛逼了,更加的自然,這種特性只有靜態(tài)編譯才能做到,這個就是 svelte 目前獨有的優(yōu)勢。
{numbers.join(" + ")} = {sum}
自動訂閱的 svelte store
這個其實就是訂閱發(fā)布模式,不過 svelte 提供了自身特有的便捷的綁定方式(自動訂閱),用起來是那么的自然,那么的爽。
這種特性只有靜態(tài)編譯才能做到,這個就是 svelte 目前獨有的優(yōu)勢。
stores.js
import { writable } from "svelte/store"; export const count = writable(0);
A.svelte
The count is {$count}
B.svelte
所有組件都可以多帶帶使用
可以直接在 react、vue、angular 等框架中使用。
// SvelteComponent.js 是已經(jīng)編譯后的組件 import SvelteComponent from "./SvelteComponent"; const app = new SvelteComponent({ target: document.body, props: { answer: 42 } });Svelte 有什么缺點?
svelte 是一個剛起步不久的前端框架,無論在維護人員還是社區(qū)上都是大大不如三大框架,這里列舉一下本人認為的 svelte 存在的缺點。
props 是可變的
當然這也是這個框架故意這樣設計的,這樣 props 也是可以響應式的。
{ title }
props 目前無法驗證類型
無法通過自定義組件本身直接訪問原生 DOM
需要利用 props 的雙向綁定特性,這就可能導致深層次組件的需要層層傳遞 DOM 對象(是子父傳遞,不是父子傳遞)。
App.svelte
A.svelte
test
只有組件才支持 svelte 的靜態(tài)模板特性
js 文件是不支持 sevelte 靜態(tài)模板特性的,像下面這樣是會報錯的。
import { count } from "./stores.js"; function increment() { $count += 1; }
組件不支持 ts 用法
找了一下,沒找到可以支持 ts 的解決方案,如果有解決方案可以評論下。
學習和總結(jié)文章同步發(fā)布于 https://github.com/xianshanna...,有興趣可以關注一下,一起學習和進步。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/105291.html
摘要:作為年最具潛力,乃至最具影響力的前端開源項目真的不為過。通過上的介紹,這個項目是偏右阿里的前端大牛和阿里的前端大牛主導,而且從中也不難看出有些部分是來自參與過的項目。 showImg(https://segmentfault.com/img/bVH8b2?w=900&h=500); 在2016年,前端的開源世界越發(fā)精彩,Vue的不斷壯大,Angular 2的發(fā)布,Amaze UI 3....
摘要:作為年最具潛力,乃至最具影響力的前端開源項目真的不為過。通過上的介紹,這個項目是偏右阿里的前端大牛和阿里的前端大牛主導,而且從中也不難看出有些部分是來自參與過的項目。 showImg(https://segmentfault.com/img/bVH8b2?w=900&h=500); 在2016年,前端的開源世界越發(fā)精彩,Vue的不斷壯大,Angular 2的發(fā)布,Amaze UI 3....
摘要:作為年最具潛力,乃至最具影響力的前端開源項目真的不為過。通過上的介紹,這個項目是偏右阿里的前端大牛和阿里的前端大牛主導,而且從中也不難看出有些部分是來自參與過的項目。 showImg(https://segmentfault.com/img/bVH8b2?w=900&h=500); 在2016年,前端的開源世界越發(fā)精彩,Vue的不斷壯大,Angular 2的發(fā)布,Amaze UI 3....
摘要:每個月我們都會對前端框架進行總結(jié)和分析,包括使用情況性能相關會議訓練課程等等。框架使用情況我們首先來看看主流框架的使用趨勢。下圖顯示了前四大框架和最近一個月的下載量趨勢。框架增長率上個月增長率去年有幾點值得注意。 譯者按: React依舊獨領風騷! 原文: What’s New in JavaScript Frameworks-March 2018 譯者: Fundebug 為...
摘要:表格底部的減速幾何平均是一項總的性能指標,從左至右,依次表明了各個框架的評級。最左端是,表示無框架的實現(xiàn),做為一個參考點。和都是顯著偏慢的框架,兩者給出的性能數(shù)據(jù)也相差無幾。 文章系國內(nèi)領先的 ITOM 管理平臺供應商 OneAPM 編譯呈現(xiàn)。 網(wǎng)頁性能是一個豐富且又復雜的話題。在本帖中,我們會將討論的范圍局限在前端 JavaScript 框架上,探究相對于另外一種框架而言,使用當前的...
閱讀 1635·2021-10-27 14:13
閱讀 1876·2021-10-11 10:59
閱讀 3375·2021-09-24 10:26
閱讀 1932·2019-08-30 12:48
閱讀 3044·2019-08-30 12:46
閱讀 2038·2019-08-30 11:16
閱讀 1422·2019-08-30 10:48
閱讀 2746·2019-08-29 16:54