SvelteKit:构建高性能SSR应用的新框架

SvelteKit 是基于 Svelte 的下一代框架,用于构建服务器端渲染(SSR)和静态站点生成(SSG)的应用。Svelte 是一个轻量级的前端框架,以其极高的性能和简洁的代码著称。SvelteKit 扩展了 Svelte 的能力,提供了完整的开发流程,包括路由、数据获取、API 调用和服务器端渲染等功能。

Svelte 组件:

SvelteKit 应用的基础是 Svelte 组件,它们是可复用的 UI 块。一个简单的 Svelte 组件如下所示:

文件结构:

一个 Svelte 组件文件通常包含三个主要部分,用三个不同的区块来区分:

  • <script> 标签:用于定义组件的状态、逻辑和导入其他模块。
  • <style> 标签:用于定义组件的样式,这部分样式是私有的,不会影响到其他组件。
  • HTML 或 Svelte 语法:用于定义组件的模板,即组件实际渲染的内容。

例如,一个简单的 Svelte 组件 Hello.svelte 可能看起来像这样:

<script>// 定义组件的内部状态let name = 'World';// 可以导出变量作为组件的属性export let greeting = 'Hello';
</script><!-- HTML/Svelte 模板 -->
<h1>{greeting}, {name}!</h1><style>/* 组件的私有样式 */h1 {color: blue;}
</style>
声明响应式变量:

<script> 标签中,你可以声明变量,Svelte 会自动跟踪这些变量的更改,并在它们发生变化时更新视图。例如,上面的 name 和 greeting 变量都是响应式的。

导出属性(Props):

使用 export 关键字,你可以将变量暴露为组件的属性,这样在父组件中使用该组件时,可以传入值。在上面的例子中,greeting 就是一个可导出的属性。

计算属性和方法:

Svelte 允许在 <script> 标签中定义计算属性和方法,这些可以基于其他响应式变量进行计算。例如:

<script>let count = 0;let doubledCount = computed(() => count * 2);function increment() {count += 1;}
</script><button on:click={increment}>{count} or {doubledCount}</button>
条件渲染和循环:

Svelte 支持条件渲染(if 和 else)以及循环(each)来动态地决定哪些内容应该被渲染。例如:

{#if showing}<p>Visible content</p>
{:else}<p>Hidden content</p>
{/if}{#each items as item}<div>{item.name}</div>
{/each}
事件处理:

Svelte 使用 on: 前缀来监听和处理DOM事件。例如,监听点击事件:

<button on:click={handleClick}>Click me</button>
自定义指令:

Svelte 提供了自定义指令(如 bind: 和 use:),它们可以扩展组件的行为。例如,bind: 可以用来双向绑定组件属性和DOM元素的值。

生命周期钩子:

虽然Svelte不像某些框架那样有明确的生命周期钩子,但它有 onMount、beforeUpdate 和 onDestroy 函数,可以在组件特定的时刻执行代码。

<script>import { onMount } from 'svelte';let mounted = false;onMount(() => {console.log('Component has been mounted');mounted = true;});function cleanup() {console.log('Component is being destroyed');}// 在组件销毁前调用onDestroy(cleanup);
</script>

路由:

1. 路由结构:

SvelteKit 的路由结构与文件系统的目录结构紧密关联。在 src/routes 目录下,每个目录和文件对应一个路由。例如:

  • src/routes/index.svelte 对应应用的主页面。
  • src/routes/blog/[slug].svelte 对应博客文章页面,其中 [slug] 是动态参数。
2. 静态路由:

静态路由是固定的URL,对应一个Svelte组件。例如,src/routes/about.svelte 将匹配 /about 路径。

3. 动态路由:

动态路由允许你捕获URL中的部分,并将其作为参数传递给组件。动态参数用方括号表示,例如 [id]。在上面的博客示例中,[slug] 将捕获URL中的字符串,如 /blog/my-first-post,并将 my-first-post 作为 slug 参数传递给组件。

load 函数:

每个路由组件可以有一个 load 函数,用于在服务器端或客户端获取数据。这个函数返回一个Promise,其结果将作为组件的 props。例如:

<script context="module">export async function load({ params }) {const response = await fetch(`/api/posts/${params.slug}`);const post = await response.json();return { props: { post } };}
</script><script>export let post;
</script><h1>{post.title}</h1>
<p>{post.content}</p>
4. API 路由:

SvelteKit 也支持创建API端点。在 src/routes 目录下创建一个 .js 或 .ts 文件,而不是 .svelte 文件,SvelteKit 将处理HTTP请求。例如,src/routes/api/posts.js 可以处理 /api/posts 路径的请求。

export async function get({ params }) {const response = await fetch(`https://api.example.com/posts/${params.id}`);return {body: await response.json(),};
}
5. 中间件:

SvelteKit 允许在 src/routes 下创建中间件文件,如 _middleware.js,来处理所有路由请求。中间件可以用来执行通用逻辑,如认证、日志记录或缓存控制。

export async function handle({ request, resolve }) {// 中间件逻辑const token = request.headers.get('Authorization');if (validateToken(token)) {return resolve(request);} else {throw new Error('Unauthorized');}
}
6. 路由导航:

在 SvelteKit 应用中,你可以使用 goto 函数进行客户端导航,或者在 <a> 标签上使用 use:link 动作来创建链接。

<script>import { goto } from '$app/navigation';
</script><button on:click={() => goto('/about')}>Go to About Page
</button><a href="/about" use:link>Go to About Page</a>
7. 路由参数和查询字符串:

在 goto 函数中,你可以传递路由参数和查询字符串:

<script>import { goto } from '$app/navigation';
</script><button on:click={() => goto('/blog/some-post', { id: 123 })}>View Post
</button>

数据获取:

SvelteKit 提供了简单而灵活的数据获取机制,允许你在组件的生命周期中获取和处理数据。这主要通过 load 函数实现,它可以用于服务器端渲染(SSR)、客户端初始化以及导航时的数据获取。以下是 load 函数的工作原理和使用方法:

1. load 函数:

在 SvelteKit 的路由组件中,你可以定义一个 load 函数,它在页面加载时运行,通常用于获取数据。load 函数返回一个Promise,其结果将作为组件的 props 传递给组件。

<script context="module">// Server-side codeexport async function load({ page, session }) {// 获取数据,例如从APIconst response = await fetch('https://api.example.com/data');const data = await response.json();// 返回propsreturn { props: { data } };}
</script><script>// Client-side codeexport let data;
</script><ul>{#each data as item}<li>{item.name}</li>{/each}
</ul>
2. load 函数的参数:
  • page 对象包含有关当前路由的信息,如 page.params(用于动态路由的参数)和 page.query(查询字符串参数)。
  • session 对象可用于存储和访问用户的会话信息,如果启用了身份验证。
3. 分离的客户端和服务器端逻辑:

load 函数可以返回一个对象,其中包含 clientserver 属性,以便为客户端和服务器端提供不同的数据获取逻辑。

<script context="module">export async function load({ page, session }) {let data;if (import.meta.env.SSR) {// 服务器端逻辑// ...} else {// 客户端逻辑// ...}return { props: { data } };}
</script>
4. 缓存和重定向:

load 函数还可以返回 statusheadersredirect 属性,用于控制HTTP响应。例如,你可以设置状态码、添加HTTP头或重定向到另一个URL。

export async function load({ page }) {const response = await fetch('https://api.example.com/data');if (response.status === 401) {return {status: 401,redirect: '/login',};}const data = await response.json();return { props: { data } };
}
5. 客户端数据更新:

除了在组件首次加载时获取数据,load 函数也可以在导航或组件更新时重新运行,以便动态更新数据。这可以通过 load 函数的 page 参数中的 changed 属性实现。

export async function load({ page }) {if (page.changed.query) {// 查询字符串参数已更改,重新获取数据}// ...
}

服务器端渲染(SSR):

SvelteKit 默认支持 SSR,这意味着在首次加载时,页面是完整的 HTML,提高了SEO和首屏加载速度。在服务器端,load 函数会执行,然后返回的数据会被渲染成 HTML。

静态站点生成(SSG):

SvelteKit 也支持 SSG,可以预渲染静态HTML页面。在生产环境中,使用 svelte-kit build 命令,SvelteKit 会生成一个静态站点,可以部署到任何静态托管服务。

API 路由:

除了页面路由,SvelteKit 还支持 API 路由。在 src/routes 目录下创建 .js 或 .ts 文件,它们将处理 API 请求。例如,src/routes/api/data.js 可以处理 /api/data 路径的请求。

export async function get(request) {const response = await fetch('https://api.example.com/data');return {body: await response.json(),};
}

身份验证和中间件:

SvelteKit 允许在 src/lib 目录下编写可复用的中间件,这些中间件可以在请求生命周期的不同阶段运行。例如,你可以创建一个身份验证中间件:

// src/lib/auth.js
export function authenticate(req, res, next) {const token = req.headers.authorization || '';if (validateToken(token)) {next();} else {res.status(401).end();}
}

然后在 src/routes/_middleware.js 中使用它:

import { authenticate } from '../lib/auth.js';export function handle({ request, resolve }) {authenticate(request);return resolve(request);
}

部署和配置:

SvelteKit 提供了一种灵活的部署方式,可以部署到 Vercel、Netlify、AWS Amplify 等平台。通过 adapter 配置,你可以选择适合的部署目标。

// svelte.config.js
import adapter from '@sveltejs/adapter-node';export default {kit: {adapter: adapter(),},
};

页面过渡(Page Transitions)

SvelteKit 提供了简洁的页面过渡效果支持,让你可以在用户导航时添加平滑的视觉过渡。这通过在 <svelte:head> 标签内使用 <transition><route> 组件实现。

<svelte:head><script>import { crossfade } from 'svelte/transition';export let data;export let component;let transition;$: transition = component ? crossfade : null;</script>{#if transition}<transitionbind:this={transition}duration={300}outDuration={200}in={component !== data.component}out={component === data.component}><slot /></transition>{:else}<slot />{/if}
</svelte:head>

这段代码定义了一个页面过渡效果,使用了 crossfade 过渡动画,当页面组件改变时,它会在两个页面之间平滑地淡入淡出。

客户端路由和导航

SvelteKit 使用 goto 函数来进行客户端导航。在组件内部,你可以直接使用 $navigate 存储来改变当前路径,或者使用<a>标签结合 use:link 动作来创建导航链接。

<script>import { navigate } from '$app/navigation';function handleClick() {navigate('/another-page');}
</script><button on:click={handleClick}>Go to Another Page</button><!-- 或者使用a标签 -->
<a href="/another-page" use:link>Another Page</a>

适配器(Adapters)

SvelteKit 提供了适配器的概念,使得应用可以轻松部署到不同的平台。适配器是一组配置和脚本,用于将你的应用打包成特定平台所需的格式。例如,使用 @sveltejs/adapter-node 部署到Node.js服务器,或使用 @sveltejs/adapter-static 生成纯静态网站。

服务工作者(Service Workers)和离线支持

SvelteKit 支持通过 @sveltejs/adapter-workbox 适配器轻松地添加PWA(Progressive Web App)功能,包括离线支持和服务工作者。这允许你的应用在无网络连接的情况下也能提供基本功能。

静态资产处理

SvelteKit 自动处理静态资产,如图片、CSS 和 JavaScript 文件。你只需将这些文件放在 static 目录下,SvelteKit 就会在构建时正确地复制和引用它们。例如,放置在 static/images/logo.png 的图片可以通过 /images/logo.png 访问。

环境变量和配置

SvelteKit 支持环境变量,允许你根据不同的环境(如开发、生产)配置应用。你可以通过 .env 文件或在 svelte.config.js 中直接定义环境变量,然后在应用中通过 import.meta.env 访问它们。

// svelte.config.js
export default {kit: {vite: {define: {'process.env.API_KEY': process.env.API_KEY,},},},
};
svelte
<script>console.log(import.meta.env.VITE_API_KEY);
</script>

类型安全与TypeScript支持

SvelteKit 全面支持 TypeScript,可以为你的应用提供类型安全。只需将 .svelte 文件改为 .svelte.ts,并在项目中配置 TypeScript,就可以享受类型提示和错误检查的好处。

SvelteKit 不仅为开发者提供了构建高性能SSR应用的工具,还兼顾了开发体验、灵活性和易用性,是现代Web开发的强大选择。

2500G计算机入门到高级架构师开发资料超级大礼包免费送!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/17021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Maven】Maven主要知识点目录整理

1. Maven的基本概念 作者相关文章链接&#xff1a; 1、【Maven】简介_下载安装-CSDN博客 定义&#xff1a;Maven是Apache的一个开源项目&#xff0c;是Java开发环境中用于管理和构建项目&#xff0c;以及维护依赖关系的强大软件项目管理工具。作用&#xff1a;简化了项目依赖…

文件夹类型异常成文件:原因解析与恢复策略

在数字时代&#xff0c;数据的安全与完整性对于个人和企业都至关重要。然而&#xff0c;有时我们可能会遇到一种令人困惑的情况&#xff1a;原本应该是文件夹的图标&#xff0c;却突然变成了文件的图标&#xff0c;这就是所谓的“文件夹类型成文件”问题。本文将深入探讨这一现…

Swagger测试接口,请求头添加token

概述Swagger 1、概述 在日常开发中&#xff0c;我们的业务需要用户登录&#xff0c;权限控制。但是在某些情况下我们使用Swagger测试接口&#xff0c;部分接口需要携带token&#xff0c;才能访问&#xff0c;就需要在swagger添加token窗口。 效果图&#xff1a; 由 右上角 A…

如何判断一个对象是否已经被回收?

在Java中&#xff0c;无法直接判断一个对象是否已经被垃圾回收&#xff08;GC&#xff09;。Java的设计理念是让垃圾回收机制完全由JVM管理&#xff0c;程序员不应该也不能直接干预或查询垃圾回收的状态。然而&#xff0c;有一种间接的方法可以帮助我们了解对象是否已被回收&am…

数据库查询以及修改方法 aspx ashx

main.aspx页面 <% Page Language"C#" AutoEventWireup"true" %> <% Import Namespace"MysqlHelpers" %> <!DOCTYPE html> <script runat"server"> public string RecId, userid, LOGIN, Token, ORG_…

Python计算回归拟合各项指标

0、各项回归指标简介 Relative Root Mean Squared Error&#xff08;RRMSE&#xff09;&#xff1a;The RRMSE normalizes the Root Mean Squared Error (RMSE) by the mean of observations. It goes from 0 to infinity. The lower the better the prediction performance.T…

一千题,No.0031(A除以B)

本题要求计算 A/B&#xff0c;其中 A 是不超过 1000 位的正整数&#xff0c;B 是 1 位正整数。你需要输出商数 Q 和余数 R&#xff0c;使得 ABQR 成立。 输入格式&#xff1a; 输入在一行中依次给出 A 和 B&#xff0c;中间以 1 空格分隔。 输出格式&#xff1a; 在一行中依…

衍生品赛道的 UniSwap:SynFutures 或将成为行业领军者

经过一个周期的发展&#xff0c;DeFi 已经成为基于区块链构建的最成功的去中心化应用&#xff0c;并彻底改变了加密市场的格局。加密货币交易开始逐步从链下转移到链上&#xff0c;并从最初简单的 Swap 到涵盖借贷、Staking、衍生品交易等广泛的生态系统。 在 DeFi 领域&#x…

小红书图片生成

先找一找有没有直接生成小红书图片的项目。这个项目和图片生成项目还是有一点区别的,小红书的图片不仅关注图片上的商品,可能一篇文章中,有商品的图片可能就一张,更多还是带有文字的图片,那么就是对文字进行替换,目前的图片生成,很少有这块的能力。1.目前的图像生成在电…

从普通神经网络到transformer

1.单隐藏层的多层感知机 2. 循环神经网络 3.现代循环神经网络。 GRU 门控循环单元 LSTM 长短期记忆网络 候选记忆元&#xff1a; ˜C t ∈ R &#xff08;nh&#xff09; 记忆元

超详细的前后端实战项目(Spring系列加上vue3)前后端篇(四)(一步步实现+源码)

兄弟们&#xff0c;继昨天的代码之后&#xff0c;继续完成最后的用户模块开发&#xff0c; 昨天已经完成了关于用户的信息编辑页面这些&#xff0c;今天再完善一下&#xff0c; 从后端这边开始吧&#xff0c;做一个拦截器&#xff0c;对用户做身份校验&#xff0c; 拦截器 这…

OrangePi AIpro 性能测试以及使用体验

OrangePi AIpro 性能测试以及使用体验 1. 介绍 OrangePi AIpro(8T)采用昇腾AI技术路线。 具体为4核64位处理器AI处理器&#xff0c;集成图形处理器&#xff0c;支持8TOPS AI算力拥有8GB/16GB LPDDR4X&#xff0c;可以外接32GB/64GB/128GB/256GB eMMC模块&#xff0c;支持双4…

输出相关命令

什么是输入输出重定向&#xff0c;就是用另外一个位置来代替它&#xff0c;默认输入为键盘&#xff0c;默认输出为终端窗口 管道能把一系列的命令连起来&#xff0c;&#xff5c;为命令符 cat file 历史查询 history 回车可以查到用过的命令。上下左右键可以回到之前命令或…

Openharmony的usb从框架到hdf驱动流程梳理

​ HDF框架实现了用户层与内核层进行通信的管理框架,关于其简易通信示例在以下两篇博文中有所介绍, 一个例子了解通过Openharmony的HDF框架实现简易驱动的流程https://blog.csdn.net/procedurecode/article/details/128906246 Openharmony的用户态应用通过HDF框架驱动消息机制…

记mapboxGL实现鼠标经过高亮时的一个问题

概述 mapboxGL实现鼠标经过高亮可通过注册图层的mousemove和moveout事件来实现&#xff0c;在mousemove事件中可以拿到当前经过的要素&#xff0c;但是当使用该要素时&#xff0c;发现在某个地图级别下会有线和面数据展示不全的情况。究其原因&#xff0c;发现是mapboxGL在绘图…

【多线程】线程安全

目录 1.观察线程不安全 2.线程不安全的原因 2.1 随机调度 2.2 修改共享数据 2.3 原子性 2.4 内存可见性 2.5 指令重排序 3.synchronized 加锁操作 3.1 synchronized是什么&#xff1f; 3.2 synchronized的特性 1) 互斥 2) 可重入 3.3 synchronized使用示例 3.3.1 针…

“二叉堆:不是,啊?”

目录 前言一、堆的概念及结构堆的性质&#xff1a;堆的结构:最大堆最小堆堆顶注意 二、堆的实现1.初始化堆2. 堆的插入什么是堆的向上调整算法&#xff1f; 3.堆的删除什么是堆的向下调整算法&#xff1f; 4.获取堆顶的数据5.获取堆的数据个数6.堆的判空7.堆的销毁 三、建堆的时…

【ES6】ECMAS6新特性概览(一):变量声明let与const、箭头函数、模板字面量全面解析

&#x1f525; 个人主页&#xff1a;空白诗 &#x1f525; 热门专栏&#xff1a;【JavaScript】 文章目录 &#x1f33f; 引言一、 let 和 const - 变量声明的新方式 &#x1f31f;&#x1f4cc; var的问题回顾&#x1f4cc; let的革新&#x1f4cc; const的不变之美 二、 Arro…

第六十六节 Java设计模式 -责任链模式

Java设计模式 -责任链模式 责任链模式为请求创建一个接收者对象列表。 这种模式是行为模式。 当使用责任链模式时&#xff0c;通常每个接收器包含对另一个接收器的引用。 如果一个对象不能处理请求&#xff0c;则它将相同的对象传递给下一个接收者&#xff0c;等等。 例子 …