前言

上一回我介绍了 Alpine.js。作为我开发企业网站 draft 版本的 render engine。

用了一阵子后,我觉得它真的非常不好用。所以打算换一个。

前端有好几个 framework / library / compiler 都可以用来做 MVVM render engine。比如 Angular、React、Vue、Lit、Solid、Qwik、Svelte。

Angular 太重

React、Solid、Qwik 我不爱 JSX

Vue 半吊子

Lit 我不能接受 html`` 语法

所以最后选了 Svelte。

安装

它有 2 个用法,第一个是搭配 SvelteKit,类似于 Angular CLI,官方出的脚手架。

另一个方法是搭配 Vite,我是要轻巧的,自然是不想引入多一个 SvelteKit 概念,用 Vite 足也。

Vite 我之前介绍过了,没用过的人可以先看这篇

更新:17-11-2023,新版本只需要一行 command 就可以创建给予 vite 的 svelte 了。

下面是以前的安装方式,留作纪念。

yarn create vite

然后填写 project name 选择 Svelte 模板和 TypeScript

进入 folder 安装 node_modules 就可以了

cd play-svelte
yarn install
yarn dev --open

效果

vite config with svelte

我们看看是怎样 config svelte to vite 的

首先 vite.config.ts 多了一个 svelte plugin

多了一个 svelte.config.js 里面是 vite plugin

这样一来一往,两家就连上了。

还有一个重要的是 tsconfig.json

大致上是这样。

Svelte 的基本使用概念

我的目的是用它来替代 Razor。所以我只关心一些小功能而已。

index.html 作为 page 的入口

导入 main.ts 这个和一般的 Vite 使用是一样的。

然后 main.ts 长这样

关键就在那个 App.svelte。

.svelte 类似于 Blazor 的 .razor file。它是 Script (JS / TS) + HTML + Style (CSS / Scss) 的合体。

一个 .svelte file 等于一个组件。它也有 isolated css 的概念哦,但不关我的事,我用不上。

Svelte 的基本语法

binding text

<script lang="ts">
const name = 'Derrick';
</script> <main>
<h1>{name}</h1>
</main>

非常简单直接

binding html raw text

<script lang="ts">
const rawHtml = '<h1>Hello World</h1>';
</script> <main>
{ @html rawHtml }
</main>

click event and change binded text

<script lang="ts">
let name = 'Derrick';
</script> <main>
<h1>{name}</h1>
<button on:click={() => name = 'new name'}>change name</button>
</main>

效果

简单到爆,不需要像 Solid、Angular 那样去搞什么 Signal / Reactive 做追踪,逼迫开发者写出恶心代码。直接了当就是 Svelte 的风格。

当然这种黑箱有时候也很恐怖。类似重新定义 HTML、CSS、JS 了,但是这种事后端经常干,见怪不怪。

binding property / attribute

<h1 class="{ 'abc ' + (true ? 'xyz' : 'kknd') }">Hello World</h1>
<input type="text" required={true}>
<h1 class:active={true} >Hello World</h1>

直接写 JS 拼接 class 也是可以的。简单直接

if else

{#if Math.random() > 0.1}
<h1>Hello World</h1>
{:else if Math.random() > 0.4}
<p>too cold!</p>
{:else}
<h1>false value</h1>
{/if}

Angular 也正在考虑用上面这个写法。比起 Razor 确实有点丑。

for loop

{#each values as value, index}
<h1 class="item">{value}</h1>
{/each}

component

counter.svelte

一个 .svelte 代表一个组件

<script lang="ts">
export let startNumber;
let count = startNumber;
</script> <main>
<h1>{count}</h1>
<button on:click={() => count++}>increase</button>
</main> <style>
h1 {
color: red;
}
</style>

script 里面的 export let startNumber 组件的 property,外部通过修改这个影响组件内部。类似 Angular 的 @Input

app.svelte

<script lang="ts">
import Counter from './Counter.svelte';
let name = 'Derrick';
</script> <main>
<h1>{name}</h1>
<button on:click={() => name = 'new name'}>change name</button>
<Counter startNumber="5" />
</main>

使用组件的方式是 import 组件,然后写入 HTML。

component slot

外面传进去

<Counter startNumber="5">
<div class="header" slot="header">header</div>
<div slot="footer">footer</div>
</Counter>

里面接收

<main>
<slot name="header">
No header was provided
</slot> <h1>{count}</h1>
<button on:click={() => count++}>increase</button> <slot name="footer"></slot>
</main>

简单直接。题外话: <slot> 在 HTML 规范里不是 self-closing tag 哦,但 Svelte 依然可以正确解释的。

component slot 和 fragment slot

<HeaderComponent slot="header" />

组件和 element 一样可以直接写 slot property。

fragment slot 长这样,有点类似 Angular 的 ng-container

<svelte:fragment slot="footer">
<p>All rights reserved.</p>
<p>Copyright (c) 2019 Svelte Industries</p>
</svelte:fragment>

component pass multiple properties

<MyComponent {...props} />

Svelte 其它知识点

获取 DOM 的时机

new Component 后,DOM 就渲染好了。

总结

目前我就用到这些而已。感觉无论如何都比 Alpine.js 合适。我喜欢他的简单直接,希望他越来越火,有朝一日我可以用它于 production 场景。

JavaScript Library – Svelte的更多相关文章

  1. A javascript library providing cross-browser, cross-site messaging/method invocation. http://easyxdm.net

    easyXDM - easy Cross-Domain Messaging easyXDM is a Javascript library that enables you as a develope ...

  2. Dynamices CRM JS 类库 神器 XrmServiceToolkit - A Microsoft Dynamics CRM 2011 & CRM 2013 JavaScript Library

    XrmServiceToolkit - A Microsoft Dynamics CRM 2011 & CRM 2013 JavaScript Library http://xrmservic ...

  3. Raphaël—JavaScript Library

    Raphaël-JavaScript Library What is it? Raphaël is a small JavaScript library that should simplify yo ...

  4. a Javascript library for training Deep Learning models

    w强化算法和数学,来迎接机器学习.神经网络. http://cs.stanford.edu/people/karpathy/convnetjs/ ConvNetJS is a Javascript l ...

  5. JavaScript 工具库:Cloudgamer JavaScript Library v0.1 发布

    JavaScript 工具库:Cloudgamer JavaScript Library v0.1 发布   研究了一年多的js,也差不多写一个自己的js库了.我写这个不算框架,只是一个小型的js工具 ...

  6. jQuery JavaScript Library v3.2.1

    /*! * jQuery JavaScript Library v3.2.1 * https://jquery.com/ * * Includes Sizzle.js * https://sizzle ...

  7. A JavaScript library for reading EXIF meta data from image files.

    exif-js/exif-js: JavaScript library for reading EXIF image metadata https://github.com/exif-js/exif- ...

  8. javascript library

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  9. 转:Build Your First JavaScript Library

    http://net.tutsplus.com/tutorials/javascript-ajax/build-your-first-javascript-library/ Step 1: Creat ...

  10. [React] 01 - Intro: javaScript library for building user interfaces

    教学视频: http://www.php.cn/code/8217.html React 教程: http://www.runoob.com/react/react-tutorial.html 本篇是 ...

随机推荐

  1. 简单万能队列状态机——WTYKAMC@2023

    WTYKAMC@2023框架 [简介] 这是一个基于队列的灵活状态机,可以满足队列元素先进先出,先进后出,后进后出,后进先出,可以清除队列中未执行完的状态,且有一个默认超时执行状态:通过超时时间可以改 ...

  2. 基于Docker安装项目管理工具禅道

    禅道是通用的项目管理软件 完整支持敏捷项目模型.瀑布项目模型.看板模型 内置项目集.产品.项目和执行四个管理框架 支持CMMI标准的落地实施 下载镜像 docker pull easysoft/zen ...

  3. 解决方案 | 使用python中的os模块准确获取不带后缀的文件名和扩展名

    1. 问题 如何使用python获取不带后缀的文件名? 2. 解决方法 如下图 import os file_name = "examp.le.pdf" file_name1_wi ...

  4. 玄机-第二章日志分析-apache日志分析

    前言 出息了,这回0元玩玄机了,因为只是日志分析,赶紧导出来就关掉(五分钟内不扣金币) 日志分析只要会点正则然后配合Linux的命令很快就完成这题目了,非应急响应. 简介 账号密码 root apac ...

  5. 30K Star,最全面的PDF处理开源项目,你也可以拥有一个本地的PDF处理大全

    大家好,我是程序猿DD 今天给大家推荐一个日常大概率能用上的开源项目:Stirling PDF 开源地址:https://github.com/Stirling-Tools/Stirling-PDF ...

  6. ddddocr验证码图片识别YYDS

    纯数字 数字+字母 python代码: import ddddocr def main(imgpath): # imgpath='E:\yam_0.png' ocr = ddddocr.DdddOcr ...

  7. 【Mybatis】06 Session获取 & 配置参数总结

    会话获取 SqlSessionFactory 最佳的获取方式就是使用Mybatis提供的资源类加载配置文件 调用会话工厂建造者实例的建造方法注入读取流 要注意的是建造者生成了了实例就可以不需要了 这里 ...

  8. 【Windows】XP系统安装TIM/QQ 数字签名过期问题

    需要手动安装数字签名 右键安装包 -> 属性 但是我的TIM没有用,对QQ是有效的 参考自视频: https://www.bilibili.com/video/av413122971/

  9. 如果美国断供中国所有的Intel和AMD芯片,国内各行各业会不会崩溃

    说一个我个人观点,我认为如果国内完全没有X86芯片的供应,那么各行各业的发展会明显进入发展迟缓阶段,首先受影响的就是软件开发领域,因为没有新的芯片也就意味着袋电脑性能停滞或者倒退,那么开发出新的更耗资 ...

  10. "基础模型时代的机器人技术" —— Robotics in the Era of Foundation Models

    翻译: 2023年是智能机器人规模化的重要一年!对于机器人领域之外的人来说,要传达事物变化的速度和程度是有些棘手的.与仅仅12个月前的情况相比,如今人工智能+机器人领域的大部分景观似乎完全不可识别.从 ...