Svelte笔记一:入门脚手架

源码github地址在此,记得点星:brandonxiang/svelte-webpack-mpa

背景

svelte是来自rollup的作者Rich Harris,它主打的就是轻量和高效开发效率。如今开发的项目除了后台系统外,其他前端项目基本都是基于移动端页面,资讯页面,博客为主。一个轻量级的框架能解决非常多的问题。

一项调查统计了现实世界中 Web 应用使用多种 Web 框架构建的相关数据。统计显示,使用一些流行框架的应用经过 gzip 压缩后的大小(KB)分别为:
Angular + ngrx:134
React + Redux:193
Vue:41.8
Svelte:9.7

前端框架给我们提供什么

在做了那么多的前端项目之后,前端框架到底带给我们什么样的开发体验。毫无疑问的是效率的提高,但是如果要考虑到极致的用户体验,极小的项目构建体积是每一个前端项目必须考虑的一个问题,尤其是移动端的项目。减少20kb js大小,给用户带来的用户体验优化是非常大的,特别在弱网环境。svelte应该是如今最轻量级的前端框架之一。它的轻量是建立于没有多余的运行时,没有virtual dom的基础上。类似vue的构思,所有的逻辑会集中于模版处理本身。

在web component还未成熟的时代下,一个标准的前端框架是非常有必要的,有助于提高我们项目的开发效率。我总结为以下两个点:

  • 数据流的处理
  • 组件化以及代码复用

然而svelte给予开发者的东西不多不少,刚好是这些内容。

virtual-dom的价值

svelte的优势站在损失掉virtual-dom的基础之上,但是缺少了virtual dom页面就会慢很多吗?还是变得更快。这样,给予我们一个思考题。前端框架到底需不需要一个virtual dom?

Rich Harris大佬的virtual-dom-is-pure-overhead一文中,指出virtual dom并非免费的午餐,它也会带来性能和内存上的消耗。例如一个HelloWorld的组件,要把props的值进行修改,需要三个步骤:

  1. 先后两次virtual dom要记录下来,对相同的节点进行比较
  2. 需要把该节点上所有的属性进行对比,记录下变动的内容
  3. 更新真实dom

svelte则是省去前面两步,直接更新dom,它是一个compiler,对已有的组件进行预编译,最终实现的代码。关键的步骤都已经在编译过程中完成了。

if (changed.name) {
  text.data = name;
}

尤大大发推说vue3能够比svelte更加快。具体的情况现在还无从考证。而且有时候benchmark不能说明所有的问题,因为现实的开发情况往往和benchmark不太一样。但是有一点我是能确认的就是越贴近原生性能越好,除了后台页面外,其他的页面svelte有着天然的优势,因为它的体积小,作用纯粹。

Twitter

多页面开发模版

由于svelte的轻量化的特性,我会将它和多页面打包联想在一起。与SPA的统一集成性不同,每个页面往往都是独立运作,项目中各种活动页面,运营页面都是如此。由于打包后的js包很小,所以ssr的效果也不再明显。对于首屏显示要求不高的业务场景,完全可以考虑CSR或者静态直出即可。

brandonxiang/svelte-webpack-mpa是一个多页面开发模版,基于以往多页面的开发经验。

里面自带了svelte-preprocessPostcssAutoprefixer插件有助于处理浏览器的兼容问题,你也可以自行配置scss或者less。

使用方法

npx degit brandonxiang/svelte-webpack-mpa svelte-app
yarn
# or
npm i

开发

dev是起服务的命令。http://localhost:9000/page1.html是第一个页面。http://localhost:9000/page2.html则是第二个页面,build则是构建命令。

yarn dev
# or
npm run dev

配置scss

svelte的官方源码把所有代码预编译都会经过preprocess,是为了让开发者自行调整,而svelte-preprocess帮你完成了99%的工作,只需要装上相关依赖,写好配置即可。

  module: {
    rules: [
      ...
      {
        test: /\.(html|svelte)$/,
        exclude: /node_modules/,
        use: {
          loader: 'svelte-loader',
          options: {
            preprocess: require('svelte-preprocess')({
                pug({ /* pug options */ }),
                scss({ /* scss options */ }),
                coffeescript({ /* coffeescript options */ })
            })
          },
        },
      },
      ...
    ]
  }
  ...

吐槽

svelte对于typescript的支持不是特别友好,因为它是以模版语言为基础的。这一点和vue类似,如果以模版为SFC的开发形式,vue的组件属性类型判断并不如react友好。期待一下vue3和svelte的后续ts支持。

语法

svelte进入3.0后,语法借鉴了vue的SFC语法,非常简单。官网上有很多栗子,这里只提及一个循环渲染的栗子,语法类似模版语言,数值的插值使用{},大家感受一下,熟悉vue的童鞋应该很熟悉。由于框架中没有virtual-dom,所以不需要像vue和react一样需要dom根节点。

<script>
    let cats = [
        { id: 'J---aiyznGQ', name: 'Keyboard Cat' },
        { id: 'z_AbfPXTKms', name: 'Maru' },
        { id: 'OUtn3pvWmpg', name: 'Henri The Existential Cat' }
    ];
</script>

<h1>The Famous Cats of YouTube</h1>

<ul>
    {#each cats as { id, name }, i}
        <li><a target="_blank" href="https://www.youtube.com/watch?v={id}">
            {i + 1}: {name}
        </a></li>
    {/each}
</ul>

参考资料

题外话

shopee,又称虾皮,是一家腾讯投资的跨境电商平台。这里加班少,技术氛围好。如果想和我并肩作战一起学习,可以找我内推。邮箱weiping.xiang@shopee.com,非诚勿扰。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容