Svelte框架入门
关键词
前端框架、编译器、响应式、模板
介绍
Svelte /svelt/ adj. 苗条的;线条清晰的;和蔼的
Svelte是一个前端组件框架,就像它的英文名字一样,Svelte的目标是打造一个更高性能的响应性前端框架。
Svelte类似于React和Vue框架,提供模板语法和响应式编程。但是有一个重要的区别:Svelte是一个编译时的框架,在编译的过程中生成组件运行时的代码并实现响应式,而React和Vue则是基于虚拟DOM及Diff实现运行时的响应式。
这正是Svelte宣传的提高性能的核心实现。我们知道,原生的性能肯定是最高的,没有中间多余的转换和对比等框架层的逻辑消耗性能。或许有同学就会问,那我们在JQuery时代写的代码性能不是更好吗?为什么感觉上却没有比react和Vue写的应用性能好呢。我想,这主要是以下几个原因:
-
现在的硬件和网络带宽等资源已经比以往有了大幅度的提升,所以就算应用的体积较以往比较大,相比硬件等资源的提升,反而会感觉上性能更好;
-
JQuery是基于原生的DOM API封装和扩展了统一的接口,屏蔽了浏览器底层的差异。但是很多开发人员在使用时并没有考虑DOM变更对性能带来的影响,只是简单的用JQuery对DOM进行粗暴的全局更新;
-
Vue和React虽然是引入虚拟DOM,需要Diff等逻辑维护和更新实际的DOM树,但是框架本身做了优化,Diff算法和更新策略也有很大的提升,所以性能上并没有感觉比原生的差很多。
虽然Vue和React如今已经满足了前端大部分的场景,Svelte的目标是追求更好的性能 (所以前端是真的卷,总有人乐此不疲的遭轮子,但也正是这些人在推动着前端的不断发展) 。Svelte提供类似Vue单文件组件的模板语法,然后编译成原生JavaScript,提供了一套相对于我们自己操作DOM,更优雅,更高效的更新方案。我们可以基于Svelte官网提供的REPL直观的了解一下编译的过程:
组件文件源码,App.svelte实现了一个简单的点击按钮统计点击次数的功能。
// App.svelte
<script>
let clickCount = 0;
function click() {
clickCount += 1;
}
</script>
<button on:click="{ click }">click me { clickCount } { clickCount > 1 ? 'times' : 'time' }</button>
<style>
button {
cursor: pointer;
}
</style>
通过Svelte编译之后的代码如下,可以具体查看我的注释进行了解:
/* App.svelte generated by Svelte v4.1.1 */
import {
SvelteComponent,
append,
append_styles,
attr,
detach,
element,
init,
insert,
listen,
noop,
safe_not_equal,
set_data,
space,
text
} from "svelte/internal";
import "svelte/internal/disclose-version";
// 插入组件样式,Svelte会自动生成一个全局唯一的类名
function add_css(target) {
append_styles(target, "svelte-1hvi0n4", "button.svelte-1hvi0n4{cursor:pointer}");
}
// 1、生成HTML片段
function create_fragment(ctx) {
let button;
let t0;
let t1;
let t2;
let t3_value = (/*clickCount*/ ctx[0] > 1 ? 'times' : 'time') + "";
let t3;
let mounted;
let dispose;
return {
// c --> create 创建
c() {
button = element("button");
t0 = text("click me ");
t1 = text(/*clickCount*/ ctx[0]);
t2 = space();
t3 = text(t3_value);
attr(button, "class", "svelte-1hvi0n4");
},
// m --> mount 挂载
m(target, anchor) {
insert(target, button, anchor);
append(button, t0);
append(button, t1);
append(button, t2);
append(button, t3);
// 绑定事件
if (!mounted) {
dispose = listen(button, "click", /*click*/ ctx[1]);
mounted = true;
}
},
// p --> update 更新
p(ctx, [dirty]) {
if (dirty & /*clickCount*/ 1) set_data(t1, /*clickCount*/ ctx[0]);
if (dirty & /*clickCount*/ 1 && t3_value !== (t3_value = (/*clickCount*/ ctx[0] > 1 ? 'times' : 'time') + "")) set_data(t3, t3_value);
},
i: noop,
o: noop,
// d --> destroy 销毁
d(detaching) {
if (detaching) {
detach(button);
}
mounted = false;
dispose();
}
};
}
// 实例,对应上面的ctx传参数
function instance($$self, $$props, $$invalidate) {
let clickCount = 0;
function click() {
$$invalidate(0, clickCount += 1);
}
return [clickCount, click];
}
class App extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance, create_fragment, safe_not_equal, {}, add_css);
}
}
export default App;
开始使用
官方推荐使用SvelteKit来创建Svelte应用项目,具体命令如下:
npm create svelte@latest svelte-demo
cd svelte-demo
npm install
npm run dev
Svelte会将.svelte组件文件编译成.js文件去创造真实的DOM和对应的.css样式文件,工具同时提供了开发服务器、路由、编译部署、SSR等支持。SvelteKit利用Vite去编译代码。
如果你不想使用SvelteKit,你还可以通过Vite来创建Svelte应用项目,具体命令如下:
# 选择svelte模板
npm init vite
# 生成HTML,JS,CSS文件到dist文件夹
npm run build
编辑器支持
Svelte团队维护了一个VsCode的插件Svelte for VS Code,支持语法提示、高亮、格式化等功能。
总结
-
Svelte是一个编译时的响应式前端组件框架,目标是减少React,Vue等框架引入虚拟DOM和Diff实现响应式的性能损耗。
-
Svelte的实现原理理论上比React和Vue等框架性能要好,但是考虑到虚拟DOM技术的成熟和优化,客户端的硬件和网络资源提升,这部分的性能提升带来的收益或许不明显。
-
当前要不要追求极致的性能而选择Svelte?我的答案是否定的。一是Svelte当前的成熟度和生态丰富度都没React和Vue好,开发体验和效率相对会没那么好;二是上面说了,Svelte带来的性能提升收益或许并不会那么明显。
-
那我们要不要关注和学习Svelte? 我的答案是肯定的。Svelte框架背后的实现原理、思路以及技术都是值得我们去了解和学习的。而且未来Svelte的生态丰富了,或许开发体验和效率会越来越好,我们也多一种选择。总之,保持热爱,保持好奇,保持学习吧~
参考
-
官方文档 -
Svelte 3: Rethinking reactivity -
deep-dive-into-svelte -
Svelte vs. React: A Comprehensive Comparison
联系我
-
E-mail -
个人博客
本文由 mdnice 多平台发布
相关文章:
Svelte框架入门
关键词 前端框架、编译器、响应式、模板 介绍 Svelte /svelt/ adj. 苗条的;线条清晰的;和蔼的 Svelte是一个前端组件框架,就像它的英文名字一样,Svelte的目标是打造一个更高性能的响应性前端框架。 Svelte类似于React和Vue框架&am…...
在linux中进行arm交叉编译体验tiny6410裸机程序开发流程
在某鱼上找了一个友善之臂的Tiny6410开发板用来体验一下嵌入式开发。这次先体验一下裸机程序的开发流程,由于这个开发板比较老旧了,官方文档有很多过期的内容,所以记录一下整个过程。 1. 交叉编译器安装 按照光盘A中的文档《04- Tiny6410 L…...
SpringBoot实战(二十三)集成 SkyWalking
目录 一、简介二、拉取镜像并部署1.拉取镜像2.运行skywalking-oap容器3.运行skywalking-ui容器4.访问页面 三、下载解压 agent1.下载2.解压 四、创建 skywalking-demo 项目1.Maven依赖2.application.yml3.DemoController.java 五、构建启动脚本1.startup.bat2.执行启动脚本3.发…...
深度学习实践——卷积神经网络实践:裂缝识别
深度学习实践——卷积神经网络实践:裂缝识别 系列实验 深度学习实践——卷积神经网络实践:裂缝识别 深度学习实践——循环神经网络实践 深度学习实践——模型部署优化实践 深度学习实践——模型推理优化练习 深度学习实践——卷积神经网络实践ÿ…...
linux | vscode | makefile | c++编译和调试
简单介绍环境: vscode 、centos、 gcc、g、makefile 简单来说就是,写好项目然后再自己写makefile脚本实现编译。所以看这篇博客的用户需要了解gcc编译的一些常用命令以及makefile语法。在网上看了很多教程,以及官网也看了很多次,最…...
Spring | Bean 作用域和生命周期
一、通过一个案例来看 Bean 作用域的问题 Spring 是用来读取和存储 Bean,因此在 Spring 中 Bean 是最核心的操作资源,所以接下来我们深入学习⼀下 Bean 对象 假设现在有⼀个公共的 Bean,提供给 A 用户和 B 用户使用,然而在使用的…...
培训(c++题解)
题目描述 某培训机构的学员有如下信息: 姓名(字符串)年龄(周岁,整数)去年 NOIP 成绩(整数,且保证是 5 的倍数) 经过为期一年的培训,所有同学的成绩都有所提…...
ansible-playbook编写 lnmp 剧本
ansible-playbook编写 lnmp 剧本 vim /opt/lnmp/lnmp.yaml执行剧本 ansible-playbook lnmp.yaml...
需求太多处理不过来?MoSCoW模型帮你
一、MoSCoW模型是什么 MoSCoW模型 是在项目管理、软件开发中使用的一种排序优先级的方法,以便开发人员、产品经理、客户对每个需求交付的重要性达成共识。 MoSCoW是一个首字母缩略词,代表: M(Must have):…...
Vue 3:玩一下web前端技术(六)
前言 本章内容为VUE请求后端技术与相关技术讨论。 上一篇文章地址: Vue 3:玩一下web前端技术(五)_Lion King的博客-CSDN博客 下一篇文章地址: Vue 3:玩一下web前端技术(七)_Lio…...
【点云处理教程】00计算机视觉的Open3D简介
一、说明 Open3D 是一个开源库,使开发人员能够处理 3D 数据。它提供了一组用于 3D 数据处理、可视化和机器学习任务的工具。该库支持各种数据格式,例如 .ply、.obj、.stl 和 .xyz,并允许用户创建自定义数据结构并在程序中访问它们。 Open3D 广…...
Windows10系统还原操作
哈喽,大家好,我是雷工! 复制了下虚拟机的Win10系统,但其中有一些软件,想实现类似手机的格式化出厂操作,下面记录Windows10系统的还原操作。 一、系统环境: 虚拟机内的Windows10,64…...
Django学习笔记-模板(Template)基础
使用模块可以很方便的执行一些数据操作,然后根据传入的数据直接在模板html文件中进行处理。 1.Django中的模板配置 Django的模板引擎在sttings.py文件中: TEMPLATES [{# 模板引擎,默认为django模板BACKEND: django.template.backends.dja…...
使用 NVM(Node Version Manager)管理 Node.js 版本
使用 NVM(Node Version Manager)管理 Node.js 版本 步骤一:安装 NVM NVM 是一个用于安装和管理不同版本的 Node.js 的工具。首先,你需要确保你的系统上已经安装了 NVM。可以通过以下命令检查 NVM 是否已经安装: nvm …...
(文章复现)梯级水光互补系统最大化可消纳电量期望短期优化调度模型matlab代码
参考文献: [1]罗彬,陈永灿,刘昭伟等.梯级水光互补系统最大化可消纳电量期望短期优化调度模型[J].电力系统自动化,2023,47(10):66-75. 1.基本原理 1.1 目标函数 考虑光伏出力的不确定性,以梯级水光互补系统的可消纳电量期望最大为目标,函数…...
tinkerCAD案例:24. Ruler - Measuring Lengths 标尺 -量勺
tinkerCAD案例:24. Ruler - Measuring Lengths 标尺 - 测量长度 Project Overview: 项目概况: A machine shop, where any idea can become a reality, can cost millions and million of dollars. Still, the most important tool in the shop is the…...
linux系统编程重点复习--线程同步
目录 复习目标: 1 互斥锁 1.1互斥锁的使用步骤 1.2 练习 1.3 死锁 2 读写锁 3 条件变量 4 信号量 复习目标: 熟练掌握互斥量的使用说出什么叫死锁以及解决方案熟练掌握读写锁的使用熟练掌握条件变量的使用理解条件变量实现的生产消费者模型理解…...
【Docker 学习笔记】Windows Docker Desktop 安装
文章目录 一、前言二、Windows Docker 安装1. 基于Hyper-V后端和Windows容器的安装2. 基于WSL2后端的安装(推荐)3. 安装Docker Desktop on Windows4. 启动并验证Docker Desktop 一、前言 Docker并非是一个通用的容器工具,它依赖于已存在并运…...
getInputStream has already been called for this request 问题记录
问题背景 HttpServletRequest.getReader() HttpServletRequest.getInputStream() 不能在过滤器中读取一次二进制流(字符流),又在另外一个Servlet中读取一次,即一个InputSteam(BufferedReader)对象在被读取完成后,将无…...
日撸代码300行:第60天(小结)
1、自己对于这个专栏的代码抄写也是断断续续,由于种种原因上次在第54天没坚持下来,这次继续希望能抄完。 2、现在代码的阅读和理解能力明显比刚开始抄代码的时候强了不少。感觉坚持到现在收获还是不小。现在基本上来说仔细想一下都能够理清楚代码的意思。…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...
[特殊字符] 手撸 Redis 互斥锁那些坑
📖 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作,想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁,也顺便跟 Redisson 的 RLock 机制对比了下,记录一波,别踩我踩过…...
python打卡第47天
昨天代码中注意力热图的部分顺移至今天 知识点回顾: 热力图 作业:对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图,展示模…...
