應該有很多人學習了Svelte.js
技術, 但大部分文章與視頻仍是停留在羅列用法, 以及演示官網的示例而已, 咱們此次就不侷限在介紹用法, 咱們還會討論Svelte.js
的一些有啓發的思想, 以及會與你們一塊兒分析它是如何實現這些功能的, 雖然不會深刻源碼分析, 但咱們會認真分析它打包後的代碼。
看慣了vue與react這類框架, 咱們要學點不一樣的啦, 還等什麼快上車。vue
居然敢說本身是苗條的
, 看來它對自身的性能頗有自信啊。node
先貼一段官網說的話:react
Svelte 在 _構建/編譯階段_ 將你的應用程序轉換爲理想的 JavaScript 應用,而不是在 _運行階段_ 解釋應用程序的代碼。這意味着你不須要爲框架所消耗的性能付出成本,而且在應用程序首次加載時沒有額外損失。
好比說vue
它是有一套監聽系統由deep
與watch
組成, 某個對象的某個值的變化會觸發一系列的操做, 好比常說的虛擬dom的生成, 可是Svelte
反其道而行之, 他直接在編譯階段就把某個值變化時須要觸發什麼操做這類邏輯, 寫入到了打包後的代碼裏面, 能夠簡單理解爲不對值作監聽了, 而是迴歸最本質的js寫法, 用函數直接觸發, 這樣說可能仍是不夠直接, 下面咱們就會有對Svelte
打包後的代碼進行分析的部分, 咱們這就開始吧。git
官方推薦方式:框架
npx degit sveltejs/template 項目名 cd 項目名 yarn yarn dev
這裏我用於演示, 直接叫demo了, 咱們的故事就從這個App.svelte
文件開始。 dom
請使用vscode
並安裝插件函數
我來演示一下它是如何使用變量的。源碼分析
<script> let name = 'name'; const path = 'favicon'; const src = '/favicon.png' </script> <p>name: {name}</p> <div> <img src="/favicon.png" alt="寫法1" /> <img src="/{path1}.png" alt="寫法2" /> <img {src} alt="寫法3" /> </div>
效果以下:性能
使用變量就是一對括號, 比較讓人驚喜的是他能夠與字符串隨意的拼接, 還有一個不錯的點就是不用只有一個根元素了, 寫代碼的幸福感都提高力。學習
每次點擊n++
<script> let n = 0; function addn() { n++; } </script> <div> <button on:click={addn} >點了{n}次</button> </div>
<script> let n = 0; function addn() { n++; console.log('觸發了:addn'); } function handlClick1() { console.log('觸發了:handlClick1'); } function handlClick2() { console.log('觸發了:handlClick2'); } </script> <div> <button on:click={addn} on:click={handlClick1} on:click={handlClick2} >點了{n}次</button > </div>
當咱們觸發點擊事件的時候, 他會按綁定事件的前後順序來觸發事件。
它的寫法並非像vue同樣的dom指令。
<script> let n = 0; function addn() { n++; } </script> <div> <button on:click={addn}>點了{n}次</button> {#if n % 2} <p>n是奇數</p> {/if} {#if !(n % 2)} <p>n是偶數</p> {/if} {#if n % 2} <p>n 竟然是: 是奇數</p> {:else} <p>n 竟然是: 是偶數</p> {/if} </div>
寫到這裏你會發現, Svelte.js
的語法真的有趣, 實際上是不太符合咱們js與dom的傳統語法的, 說到這裏其實咱們已經對這個技術有了基本的認知, 下面開始結合打包後的文件聊一聊。
使用最基礎的代碼:
<script> let n = 0; function addn() { n++; console.log('觸發了:addn'); } </script> <button on:click={addn}>點了{n}次</button>
先直接打包看一下
yarn build
根本無法看:
去掉混淆, 改變打包模式 (順便了解一下rollup
)
這個也關了省點性能:
獲得了清晰的代碼:
官網提供的例子都是到這裏就結束了, 但咱們能夠經過打包文件進行詳細的研究, 好比追蹤init
事件來到了如圖所示的位置:
$$
裏面都是一些掛載目標以及生命週期函數, 這些不是咱們今天的重點咱們往下看。
還記得instance
返回了個 return [n, addn];
。
可能會出現 NAN !== NAN
這種尷尬的場景, 而咱們平時寫代碼有沒有注意到那?
function safe_not_equal(a, b) { // a爲 NAN 則 返回 b是否爲nan, // a不爲NAN 則 返回 a等於b或者a是個對象或者a是個函數 return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function'); }
綁定事件的同時把刪除事件操做給了出去, 這個寫法不錯。
function listen(node, event, handler, options) { node.addEventListener(event, handler, options); return () => node.removeEventListener(event, handler, options); }
咱們改一下代碼再打包
<script> let n = 1; let y = 1; let n1 = 1; let n2 = 1; let n3 = 1; let n11 = 1; let n21 = 1; let n31 = 1; function addY() { n += 1; y += 1; n1 += 1; n2 += 1; n3 += 1; n11 += 1; n21 += 1; n31 += 1; } </script> <button on:click={addY}> {n}{y}{n1}{n2}{n3}{n11}{n21}{n31} </button>
Svelte
更像一個編譯器, 他只是把咱們寫的代碼翻譯成了可執行的'MVC'的模式, 因此咱們不用像在vue與react
裏面全是this.
的這種寫法, 咱們能夠按原生js的方式去設計代碼。
篇幅有限更多有趣的用法咱們下一篇再討論啦, ,此次就是這樣, 但願和你一塊兒進步。