应该有很多人学习了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的方式去设计代码。
篇幅有限更多有趣的用法咱们下一篇再讨论啦, ,此次就是这样, 但愿和你一块儿进步。