svelteup -- 实现 web component 的最佳实践

背景

svelte是新晋的前端框架。在打包体积和页面显示性能上有着不可磨灭的意义。现在越来越多网站上都已经能看到它的身影。之前我也对它的源码有了深入的解读,《Svelte笔记三:runtime源码解读》和《Svelte笔记四:compile源码解析》两篇文章可以作为参考。 svelte的优势很明显, 主要在体积极小和预编译组件逻辑。没有virtual dom,让业务代码更加纯粹地集中在页面显示上。

web component 一直是大家很想落地的一个浏览器新技术,但是实际应用上我们却很难看到。即使是在微前端方面它都非常难落地。web component和Server Side Rendering(SSR)的两个概念是不搭的,它更多一切从浏览器出发,在不考虑ie的兼容性的情况下,已经达到了可用的情况。它的使用方式很简单,直接在页面中写入自定义的标签即可,例如 <my-element />,但是 native web component 的开发语法确实让开发者难以适应。

custom elements 兼容性

svelte 和 web component 的概念一拍即合。由于 native web component 现在还不成熟,用它去实现一些页面的难度(学习成本和心智负担)会较大,不太适合新手学习。你可能会问使用像lit-element这样的框架写 web component 是否合适?《A Comparison Of Web Component Solutions》、《All the Ways to Make a Web Component》这两篇文章很好地对比了第三方框架 svelte、stencil、lit-element、Lightning Web Components 的各个优缺点,证明了svelte在体整体体积和它的易用性有着独特的优势。《Custom Elements Everywhere》一文横向对比了18款框架转 web component,svelte的支持度非常好。

什么是 svelteup

svelteup 是一个开源项目,欢迎持续关注,并为点star。

svelteup 的诞生,目标更多是为了满足独立的小工具页面和已有页面的插入小组件。这些页面就非常适合用svelte进行实现,正是因为它“小运行时”的特点,很贴近浏览器,用最原生最底层的方式去实现网页的组件库。

svelteup是由三个概念混合而成,svelte是前端框架,esbuild是编译工具,web component是输出产物。在浏览器中使用就是以web component的方式。它的优势就是“快,轻量,直接,好用、客户端渲染”。

svelteup = svelte + esbuild + web component

svelteup = client rendering + light weight + extremely fast

svelteup的使用非常简单,初始约定了 component 文件夹作为组件代码的位置,而 public 文件夹则是托管静态资源的目录。这些都可以通过cli、配置文件或者js api进行配置,详情参考文档。借助于svelteup可以实现组件打包和页面开发调试等工作。

# 组件打包
svelteup
# 页面开发调试
svelteup -s public

什么样的项目需要svelteup

我承认svelteup并不完美,没有一个工具是完美,没有一个工具能够覆盖所有项目。它更适合:

  • “客户端渲染页面”
  • “对包体积要求极高的小工具”
  • “插入已有页面的组件”

svelte打包产物极小,所以性能和react、vue比就是天然优势。如果你想用它去写个简单页面,svelteup-starter是一个最简单的初始化模版,值得你去尝试。

svelteup的最佳实践

实践一:基于 reveal.jskeynote-svelte 模版

reveal.js 是一款完成度很高、历史悠久的在线ppt库,著名的slides网站就是基于它。它能够让你的分享有很好的传播力。我一直使用它的 markdown 扩展工具 "webpro/reveal-md" 来写一些技术分享。其使用很简单,只需要以markdown的形式来写ppt的内容,利用reveal-md运行和打包即可,“brandonxiang的分享” 值得参考一下。

reveal.js

它可以实现 markdown 和 html 混写,有较高的灵活度。但是,如果html要考虑复用,你只能复制粘贴,怎么能够将html组件插入到已有的ppt页面?很直接的一个想法就是利用svelteup来实现插入式的组件。

举个例子,如果你想几个页面能够显示一个同样的标签。你可以用svelte的语法简单写一个组件,打包一个web component。你可以在 markdown 中直接使用<name-corner></name-corner>。这里注意 svelte:options 的语法可以定义web component的名字。这里没有使用黑魔法,只是用天然的浏览器特性给你的ppt如虎添翼。

<svelte:options tag="name-corner" />
<div class="box">
    <slot>
        <em>Created by Brandonxiang</em>
    </slot>
</div>

<style>
    .box {
        width: 300px;
        border: 1px solid #aaa;
        border-radius: 2px;
        box-shadow: 2px 2px 8px rgba(0,0,0,0.1);
        padding: 1em;
        margin: 0 0 1em 0;
    }
</style>

keynote-svelte 就是这个基于svelteup和reveal-md的在线ppt初始化模版,欢迎尝鲜。

实践二:chrome-extension-svelte

chrome的插件已经是非常成熟的工具载体,聪明的开发者可以利用它开发提高效率的工具。它的实现是通过html的页面渲染和插件线程之间的通讯。在开发的过程当中,不可避免的是组件化。chrome插件和SSR无关,但是和 svelteup 则是相辅相成。chrome-extension-svelte 就是基于svelteup的chrome插件的初始化开发模版。借助svelte的轻量,该模版可以大大提高你的开发效率和插件显示效率。

实践三:版本切换小工具

在业务需求迭代的过程中,我们会考虑按需求分支来虚拟环境。而Version-Tool是一个虚拟多环境的版本切换小工具,它的主要工作只是为了给页面设置cookie带上版本参数。它的第一个版本是采用 react + ant desgin + axios + webpack 这样的技术栈,在没有gzip的情况下,结果打包体积在2.1M左右,体积太大到了不能接受的地步。

该工具采用svelteup工具进行重构,通过自定义组件替换ant design,利用fetch来替换axios。既能够保证功能的统一和组件的拓展性,也能够有效减少产物体积。在没有gzip的情况下,体积有效减少到13kb,是以前的165分之一,小了超过一百倍。这时候你可以看到svelte的应用价值。

总结

以上三个实践,从易用性、产物体积和拓展性等方面,展示了svelteup的用途和定位。在现代前端发展的过程当中,我们的目标是为了把页面做得更贴近浏览器,更贴近高性能。svelte的体积小和web原生组件不谋而合,希望这个工具可以打造很多原生组件在其他项目中直接使用。

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

推荐阅读更多精彩内容