成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Svelte 前端框架探索

Euphoria / 634人閱讀

摘要:苗條的框架正是作者的初始目的,苗條包括代碼編寫量打包大小等等。是已經(jīng)編譯后的組件有什么缺點(diǎn)是一個(gè)剛起步不久的前端框架,無(wú)論在維護(hù)人員還是社區(qū)上都是大大不如三大框架,這里列舉一下本人認(rèn)為的存在的缺點(diǎn)。

Svelte 的作者也是 rollup 的作者 Rich Harris,前端界的輪子哥。sevlte 項(xiàng)目首次提交于 2016 年 11 月 16 日,目前版本是 3.6.1(2019-06-27),v3 版本進(jìn)行了大改動(dòng),跟之前的版本有很大的差別(v1、v2 版本 API 用法跟 vue 很像,v3 完全屬于自己的風(fēng)格)。

看下 2016-12-02,尤雨溪大神對(duì)此框架的評(píng)價(jià)(當(dāng)然已經(jīng)過(guò)時(shí)了,但是核心的思想還是一致的):

這個(gè)框架的 API 設(shè)計(jì)是從 Ractive 那邊傳承過(guò)來(lái)的(自然跟 Vue 也非常像),但這不是重點(diǎn)。Svelte 的核心思想在于『通過(guò)靜態(tài)編譯減少框架運(yùn)行時(shí)的代碼量』。舉例來(lái)說(shuō),當(dāng)前的框架無(wú)論是 React Angular 還是 Vue,不管你怎么編譯,使用的時(shí)候必然需要『引入』框架本身,也就是所謂的運(yùn)行時(shí) (runtime)。但是用 Svelte 就不一樣,一個(gè) Svelte 組件編譯了以后,所有需要的運(yùn)行時(shí)代碼都包含在里面了,除了引入這個(gè)組件本身,你不需要再額外引入一個(gè)所謂的框架運(yùn)行時(shí)!
什么是 Svelte?

Svelte 跟 vue 和 react一樣,是一個(gè)數(shù)據(jù)驅(qū)動(dòng)組件框架。但是也有很大的不同,它是一個(gè)運(yùn)行時(shí)框架,無(wú)需引入框架本身,同時(shí)也沒(méi)用到虛擬 DOM(運(yùn)行時(shí)框架特性決定了這個(gè)框架跟虛擬 DOM 無(wú)緣)。

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.

雖然沒(méi)使用到虛擬 DOM,但一樣可以達(dá)到出色的性能,而且對(duì)開(kāi)發(fā)者編寫代碼是十分便捷。

與 React 和 Vue 有和不同?

那么我們先看下 svelte 的因?yàn)橐馑迹好鐥l的。苗條的框架正是作者的初始目的,苗條包括代碼編寫量、打包大小等等。

總結(jié)一下這個(gè)框架的優(yōu)勢(shì),即作者開(kāi)發(fā)新框架的目的。

靜態(tài)編譯,無(wú)需引入框架自身

一個(gè) Svelte 組件是靜態(tài)編譯,所有需要的運(yùn)行時(shí)代碼都包含在里面了,除了引入這個(gè)組件本身,你感覺(jué)不到框架存在。

編寫更少代碼

svelte 模板提供一些簡(jiǎn)便的用法,在維護(hù)和編寫上都變得更簡(jiǎn)單,代碼量更少(維護(hù)的代碼),這些模板會(huì)編譯為最終的js 代碼。

只會(huì)打包使用到的代碼

即 tree shaking,這個(gè)概念本來(lái)也是作者首先提出來(lái)的,webpack 是參考了 rollup。

無(wú)需虛擬 DOM 也可進(jìn)行響應(yīng)式數(shù)據(jù)驅(qū)動(dòng)

更便捷的響應(yīng)式綁定

既有響應(yīng)式數(shù)據(jù)的優(yōu)點(diǎn),v3 版本也解決了 vue 數(shù)據(jù)綁定缺點(diǎn),用起來(lái)十分方便。

簡(jiǎn)單用法對(duì)比

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} +  = {a + b}

); };

vue



svelte





{a} +  = {a + b}

都不用多說(shuō),一眼就看出來(lái),svelte 簡(jiǎn)單多了。

為什么不使用虛擬 DOM?

在 react 和 vue 盛行的時(shí)代,你會(huì)聽(tīng)說(shuō)虛擬 DOM 速度快,而且還可能被灌輸一個(gè)概念,虛擬 DOM 的速度比真實(shí) DOM 的速度要快。

所以如果你有這個(gè)想法,那么你肯定疑惑 svelte 沒(méi)用到虛擬 DOM,它的速度為什么會(huì)快?

其實(shí)虛擬 DOM 并不是什么時(shí)候都快,看下粗糙的對(duì)比例子。

對(duì)比例子

這里并沒(méi)有直接統(tǒng)計(jì)渲染的時(shí)間,通過(guò)很多條數(shù)據(jù)我們就可以感受出來(lái)他們直接的性能。特別是點(diǎn)擊每條數(shù)據(jù)的時(shí)候,明顯感覺(jué)出來(lái)(由于是在線上的例子,所以首次渲染速度不準(zhǔn)確,主要看點(diǎn)擊的響應(yīng)速度)。

當(dāng)然這僅僅是在 50000 條數(shù)據(jù)下的測(cè)試,對(duì)比一下框架所謂的速度,實(shí)際的情況下我們是不會(huì)一次性展示這么多數(shù)據(jù)的。所以在性能還可行的情況下,更多的選擇是框架所帶來(lái)的的便利,包括上手難度、維護(hù)難度、社區(qū)大小等等條件。

svelte

https://svelte.dev/repl/367a2...



{#each data as d, i}
  

Hello {name} {i} qoyqs8suu2u!

{/each}

vue

http://jsrun.net/kFyKp/edit

Hello {{name}} {{i}} {qoyqs8suu2u}!
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 (
      
{this.state.list.map((v,k)=>{ return(

Hello wolrd {k} {v}!

) })}
) } } function render() { ReactDOM.render( , document.getElementById("root") ); } render();
總結(jié)

首先虛擬 DOM 不是一個(gè)功能,它只是實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)的開(kāi)發(fā)的手段,沒(méi)有虛擬 DOM 我們也可以實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)的開(kāi)發(fā)方式,svelte 正是做了這個(gè)事情。

單純從上面的對(duì)比例子來(lái)看,svelte 的速度比虛擬 DOM 更快(不同框架虛擬 DOM 實(shí)現(xiàn)會(huì)有差別)。雖然沒(méi)有進(jìn)行更深層次的對(duì)比,但是如果認(rèn)為虛擬 DOM 速度快的觀點(diǎn)是不完全對(duì)的,應(yīng)該說(shuō)虛擬 DOM 可以構(gòu)建大部分速度還可以的 Web 應(yīng)用。

Svelte 有哪些好用的特性?

完全兼容原生 html 用法

編寫代碼是那么的自然,如下面就是一個(gè)組件。


{ test }

響應(yīng)式也是那么的自然



{ count }

表達(dá)式也可以是響應(yīng)式的

這個(gè)就牛逼了,更加的自然,這種特性只有靜態(tài)編譯才能做到,這個(gè)就是 svelte 目前獨(dú)有的優(yōu)勢(shì)。


{numbers.join(" + ")} = {sum}

自動(dòng)訂閱的 svelte store

這個(gè)其實(shí)就是訂閱發(fā)布模式,不過(guò) svelte 提供了自身特有的便捷的綁定方式(自動(dòng)訂閱),用起來(lái)是那么的自然,那么的爽。

這種特性只有靜態(tài)編譯才能做到,這個(gè)就是 svelte 目前獨(dú)有的優(yōu)勢(shì)。

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 有什么缺點(diǎn)?

svelte 是一個(gè)剛起步不久的前端框架,無(wú)論在維護(hù)人員還是社區(qū)上都是大大不如三大框架,這里列舉一下本人認(rèn)為的 svelte 存在的缺點(diǎn)。

props 是可變的

當(dāng)然這也是這個(gè)框架故意這樣設(shè)計(jì)的,這樣 props 也是可以響應(yīng)式的。


{ title }

props 目前無(wú)法驗(yàn)證類型

無(wú)法通過(guò)自定義組件本身直接訪問(wèn)原生 DOM

需要利用 props 的雙向綁定特性,這就可能導(dǎo)致深層次組件的需要層層傳遞 DOM 對(duì)象(是子父?jìng)鬟f,不是父子傳遞)。

App.svelte



A.svelte



test

只有組件才支持 svelte 的靜態(tài)模板特性

js 文件是不支持 sevelte 靜態(tài)模板特性的,像下面這樣是會(huì)報(bào)錯(cuò)的。

import { count } from "./stores.js";
function increment() {
  $count += 1;
}

組件不支持 ts 用法

找了一下,沒(méi)找到可以支持 ts 的解決方案,如果有解決方案可以評(píng)論下。

學(xué)習(xí)和總結(jié)文章同步發(fā)布于 https://github.com/xianshanna...,有興趣可以關(guān)注一下,一起學(xué)習(xí)和進(jìn)步。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/105291.html

相關(guān)文章

  • 2016年最具潛力前端開(kāi)源項(xiàng)目Top20

    摘要:作為年最具潛力,乃至最具影響力的前端開(kāi)源項(xiàng)目真的不為過(guò)。通過(guò)上的介紹,這個(gè)項(xiàng)目是偏右阿里的前端大牛和阿里的前端大牛主導(dǎo),而且從中也不難看出有些部分是來(lái)自參與過(guò)的項(xiàng)目。 showImg(https://segmentfault.com/img/bVH8b2?w=900&h=500); 在2016年,前端的開(kāi)源世界越發(fā)精彩,Vue的不斷壯大,Angular 2的發(fā)布,Amaze UI 3....

    winterdawn 評(píng)論0 收藏0
  • 2016年最具潛力前端開(kāi)源項(xiàng)目Top20

    摘要:作為年最具潛力,乃至最具影響力的前端開(kāi)源項(xiàng)目真的不為過(guò)。通過(guò)上的介紹,這個(gè)項(xiàng)目是偏右阿里的前端大牛和阿里的前端大牛主導(dǎo),而且從中也不難看出有些部分是來(lái)自參與過(guò)的項(xiàng)目。 showImg(https://segmentfault.com/img/bVH8b2?w=900&h=500); 在2016年,前端的開(kāi)源世界越發(fā)精彩,Vue的不斷壯大,Angular 2的發(fā)布,Amaze UI 3....

    xiguadada 評(píng)論0 收藏0
  • 2016年最具潛力前端開(kāi)源項(xiàng)目Top20

    摘要:作為年最具潛力,乃至最具影響力的前端開(kāi)源項(xiàng)目真的不為過(guò)。通過(guò)上的介紹,這個(gè)項(xiàng)目是偏右阿里的前端大牛和阿里的前端大牛主導(dǎo),而且從中也不難看出有些部分是來(lái)自參與過(guò)的項(xiàng)目。 showImg(https://segmentfault.com/img/bVH8b2?w=900&h=500); 在2016年,前端的開(kāi)源世界越發(fā)精彩,Vue的不斷壯大,Angular 2的發(fā)布,Amaze UI 3....

    Caizhenhao 評(píng)論0 收藏0
  • JavaScript主流框架3月趨勢(shì)總結(jié)

    摘要:每個(gè)月我們都會(huì)對(duì)前端框架進(jìn)行總結(jié)和分析,包括使用情況性能相關(guān)會(huì)議訓(xùn)練課程等等。框架使用情況我們首先來(lái)看看主流框架的使用趨勢(shì)。下圖顯示了前四大框架和最近一個(gè)月的下載量趨勢(shì)??蚣茉鲩L(zhǎng)率上個(gè)月增長(zhǎng)率去年有幾點(diǎn)值得注意。 譯者按: React依舊獨(dú)領(lǐng)風(fēng)騷! 原文: What’s New in JavaScript Frameworks-March 2018 譯者: Fundebug 為...

    2shou 評(píng)論0 收藏0
  • OneAPM大講堂 | 誰(shuí)更快?JavaScript 框架性能評(píng)測(cè)

    摘要:表格底部的減速幾何平均是一項(xiàng)總的性能指標(biāo),從左至右,依次表明了各個(gè)框架的評(píng)級(jí)。最左端是,表示無(wú)框架的實(shí)現(xiàn),做為一個(gè)參考點(diǎn)。和都是顯著偏慢的框架,兩者給出的性能數(shù)據(jù)也相差無(wú)幾。 文章系國(guó)內(nèi)領(lǐng)先的 ITOM 管理平臺(tái)供應(yīng)商 OneAPM 編譯呈現(xiàn)。 網(wǎng)頁(yè)性能是一個(gè)豐富且又復(fù)雜的話題。在本帖中,我們會(huì)將討論的范圍局限在前端 JavaScript 框架上,探究相對(duì)于另外一種框架而言,使用當(dāng)前的...

    BDEEFE 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<