Skip to content

Svelte

2 posts with the tag “Svelte”

Svelte With JSDoc and Typescript

在一些情况下(如小项目等),我更喜欢用 Javascript ,同时也不介意使用 Typescript, 特别在一些较大的项目,特别是在使用 Svelte 进行表单验证的时候。 在使用 Svelte 不涉及表单验证等复杂场景的时候, 直接使用 Javascript 和 JSDoc 也可以获得不错的类型提示体验也很方便。 但在更复杂的场景如使用SuperformsZod 进行表单验证的时候, Typescript 会有更友好的编码体验(类型提示和类型检查)。

类型注释和使用可以在同一个文件,如:

/**
* @typedef Invoice
* @type {Object}
* @property {string} invoice
* @property {string} paymentStatus
* @property {string} totalAmount
* @property {string} paymentMethod - payment method
*/
/** @type {Array<Invoice>} */
export const invoices = [
{
invoice: "INV001",
paymentStatus: "Paid",
totalAmount: "$250.00",
paymentMethod: "Credit Card"
}
]

也可以在跨文件共享使用类型注释:

types.js
/**
* @typedef Invoice
* @type {Object}
* @property {string} invoice
* @property {string} paymentStatus
* @property {string} totalAmount
* @property {string} paymentMethod - payment method
*/
// file: invoice.js
/** @type { import('./types.js').Invoice[] } */
export const invoices = [
{
invoice: "INV001",
paymentStatus: "Paid",
totalAmount: "$250.00",
paymentMethod: "Credit Card",
},
];

在 Svelte components、Props、Slots、Events、Bindings 时,使用 Typescript 只需要将 lang="ts 添加到 script 标签:

  • components
<script lang="ts">
let name: string = 'world';
function greet(name: string) {
alert(`Hello, ${name}!`);
}
</script>
  • Props
<script lang="ts">
export let name: string;
</script>
  • Slots
<script lang="ts">
export let name: string;
</script>
<slot {name} />
<!-- Later -->
<Comp let:name>
<!-- ^ Inferred as string -->
{name}
</Comp>
  • Events
<script lang="ts">
import { createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher<{
event: null; // does not accept a payload
click: string; // has a required string payload
type: string | null; // has an optional string payload
}>();
function handleClick() {
dispatch('event');
dispatch('click', 'hello');
}
function handleType() {
dispatch('event');
dispatch('type', Math.random() > 0.5 ? 'world' : null);
}
</script>
<button on:click={handleClick} on:keydown={handleType}>Click</button>

使用 zod validation library 时使用 Typescript 会更方便:

const accountSchema = z.object({
name: z
.string({ required_error: 'Required.' })
.min(2, 'Name must be at least 2 characters.')
.max(30, 'Name must not be longer than 30 characters.'),
language: z.enum(languages.map(lang => lang.value) as [Language, ...Language[]]),
dob: z
.string()
.datetime()
.optional()
.refine((date) => (date === undefined ? false : true), 'Please select a valid date.')
});
type AccountSchema = typeof accountSchema

此时如果不是在.ts文件使用zod, 而是有JSDoc注释 的常规.js文件,可以使用下面的方式,在JSDoc 中推断Zod类型:

export const _formSchema = z.object({
username: z.string().min(2, '最少两个字符').max(50, '最多50个字符'),
email: z.string().email('无效邮箱地址'),
bio: z.string().min(4).max(160).default("I own a computer."),
urls: z
.array(z.string().url())
.default(["https://shadcn.com", "https://twitter.com/shadcn"]),
})
// Extract the inferred type as a JSDoc type
/** @typedef { z.infer<typeof _formSchema>} _form */

Svelte UI Components

Svelte 有 React 模块化,但程序体积更小,也有Vue 的简单,但我觉得Svelte 更新简洁。Svelte 是一种编译型框架,构建时将组件的逻辑转换为高效的原生JavaScript代码。 由于不使用虚拟DOM,Svelte具有卓越的性能表现,这点和React 、 Svelte 有非常大的不同,也是尝试它的一个原因之一。

React、Svelte 和 Vue 都是用于构建用户界面的流行 JavaScript 框架。它们都提供了声明式编程范式,可让您轻松创建和维护复杂的 UI。但是,这三个框架之间也存在一些关键差异。

  • React

React 是由 Facebook 于 2015 年创建的,是目前最受欢迎的前端框架之一。它使用虚拟 DOM 来有效地更新 UI,并提供广泛的功能和组件库。React 以其灵活性和可扩展性而闻名,但其学习曲线可能有点陡峭。

  • Svelte

Svelte 是 2016 年由 Rich Harris 创建的,是一个相对较新的框架。它使用编译器方法来将您的代码转换为高效的底层代码,从而提供卓越的性能。Svelte 还具有响应式系统,可确保您的 UI 始终保持最新状态。Svelte 以其易用性和简洁性而闻名,但它还没有 React 那么大的社区或生态系统。

  • Vue

Vue 是 2014 年由 Evan You 创建的,是一个渐进式框架。它旨在易于学习和使用,同时仍提供构建复杂应用程序所需的功能。Vue 提供了模板语法,可让您轻松创建 UI,以及用于路由和状态管理的强大工具。Vue 以其平衡性易用性和功能性而闻名。

  • 比较
特性ReactSvelteVue
创建者FacebookRich HarrisEvan You
发布日期201520162014
范式声明式声明式声明式
视图更新虚拟DOM编译器响应式系统
学习曲线中等容易容易
功能 广相对较少平衡
社区和生态系统大型中型中型

Component Library:

Headless UI Svelte

Tailwind CSS Components:

CSS only: