SvelteKit 最新中文文档教程(17)—— 仅服务端模块和快照

前言

Svelte,一个语法简洁、入门容易,面向未来的前端框架。

从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1

image.png

Svelte 以其独特的编译时优化机制著称,具有轻量级高性能易上手等特性,非常适合构建轻量级 Web 项目

为了帮助大家学习 Svelte,我同时搭建了 Svelte 最新的中文文档站点。

如果需要进阶学习,也可以入手我的小册《Svelte 开发指南》,语法篇、实战篇、原理篇三大篇章带你系统掌握 Svelte!

欢迎围观我的“网页版朋友圈”、加入“冴羽·成长陪伴社群”,踏上“前端大佬成长之路”。

仅服务端模块

SvelteKit 会像一个好朋友一样,保守您的秘密。在同一个代码仓库中编写后端和前端代码时,很容易不小心将敏感数据(例如包含 API 密钥的环境变量)导入到前端代码中。SvelteKit 提供了一种完全防止这种情况发生的方法:仅服务端模块(server-only modules)。

私有环境变量

$env/static/private$env/dynamic/private 模块只能导入到仅在服务端上运行的模块中,例如 hooks.server.js+page.server.js

仅服务端工具

$app/server 模块包含一个 read 函数,用于从文件系统读取资源,同样只能被服务端运行的代码导入。

您的模块

您可以通过两种方式使您的模块成为仅服务端模块:

  • 在文件名中添加 .server,例如 secrets.server.js
  • 将它们放在 $lib/server 中,例如 $lib/server/secrets.js

工作原理

任何时候,当您有公开的代码,导入仅服务端代码时(无论是直接还是间接)…

// @errors: 7005
/// file: $lib/server/secrets.js
export const atlantisCoordinates = [/* 已编辑 */
];
// @errors: 2307 7006 7005
/// file: src/routes/utils.js
export { atlantisCoordinates } from '$lib/server/secrets.js';export const add = (a, b) => a + b;
/// file: src/routes/+page.svelte
<script>import { add } from './utils.js';
</script>

…SvelteKit 将报错:

Cannot import $lib/server/secrets.js into public-facing code:
- src/routes/+page.svelte- src/routes/utils.js- $lib/server/secrets.js

尽管公开代码 — src/routes/+page.svelte — 只使用了 add 导出而没有使用秘密的 atlantisCoordinates 导出,秘密代码也可能最终出现在浏览器下载的 JavaScript 中,因此这个导入链被认为是不安全的。

此功能也适用于动态导入,甚至是像 await import(`./${foo}.js`) 这样的插值导入,只有一个小注意点:在开发过程中,如果公开代码和仅服务端模块之间存在两个或更多的动态导入,则在第一次加载代码时不会检测到非法导入。

[!NOTE] 像 Vitest 这样的单元测试框架不区分仅服务端代码和公开代码。因此,当运行测试时,非法导入检测会被禁用,这由 process.env.TEST === 'true' 决定。

进一步阅读

  • 教程:环境变量

快照

临时的 DOM 状态 — 比如侧边栏的滚动位置、<input> 元素的内容等 — 在从一个页面导航到另一个页面时会被丢弃。

例如,如果用户填写了一个表单但在提交之前离开并返回,或者用户刷新页面,他们填写的值将会丢失。在需要保留这些输入的情况下,您可以创建一个 DOM 状态的快照,当用户返回时可以恢复这个状态。

要实现这一点,从 +page.svelte+layout.svelte 中导出一个带有 capturerestore 方法的 snapshot 对象:

<!--- file: +page.svelte --->
<script>let comment = $state('');/** @type {import('./$types').Snapshot<string>} */export const snapshot = {capture: () => comment,restore: (value) => comment = value};
</script><form method="POST"><label for="comment">评论</label><textarea id="comment" bind:value={comment} /><button>发表评论</button>
</form>

当您离开这个页面时,capture 函数会在页面更新之前立即被调用,返回的值会与浏览器历史栈中的当前记录关联。如果您返回此页面,restore 函数会在页面更新后立即被调用,并传入存储的值。

数据必须是可以序列化为 JSON 的,这样它才能被保存到 sessionStorage 中。这样就可以在页面重新加载时,或者用户从其他网站返回时恢复状态。

[!NOTE] 避免从 capture 返回非常大的对象 — 一旦被捕获,对象将在会话期间保留在内存中,在极端情况下可能会因太大而无法保存到 sessionStorage 中。

Svelte 中文文档

点击查看中文文档:

  1. SvelteKit 仅服务端模块
  2. SvelteKit 快照

系统学习 Svelte,欢迎入手小册《Svelte 开发指南》。语法篇、实战篇、原理篇三大篇章带你系统掌握 Svelte!

此外我还写过 JavaScript 系列、TypeScript 系列、React 系列、Next.js 系列、冴羽答读者问等 14 个系列文章, 全系列文章目录:https://github.com/mqyqingfeng/Blog

欢迎围观我的“网页版朋友圈”、加入“冴羽·成长陪伴社群”,踏上“前端大佬成长之路”。

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

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

相关文章

CMake 中的置变量

在 CMake 中&#xff0c;变量是存储和传递信息的重要方式。以下是一些常用的 CMake 变量&#xff0c;以表格形式列出&#xff0c;包括它们的名称、含义和常见用途&#xff1a; 变量名称含义常见用途CMAKE_CURRENT_SOURCE_DIR当前处理的 CMakeLists.txt 文件所在的源代码目录的…

深入解析C++类:面向对象编程的核心基石

一、类的本质与核心概念 1.1 类的基本定义 类是将**数据&#xff08;属性&#xff09;与操作&#xff08;方法&#xff09;**封装在一起的用户自定义类型&#xff0c;是面向对象编程的核心单元。 // 基础类示例 class BankAccount { private: // 访问控制string owner; …

介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用及数组讲解

Docker 是一种轻量级的容器化技术&#xff0c;能够让开发者将应用程序和其所有依赖项打包成一个独立的容器&#xff0c;实现快速部署和运行。以下是 Docker 的基本概念和优势&#xff1a; 基本概念&#xff1a; 镜像&#xff08;Image&#xff09;&#xff1a;镜像是一个只读的…

在msys2里面的mingw64下面编译quickjs

其实非常的简单&#xff0c;就是正常的make 和make install就行了&#xff0c;这里只是简单的做个编译过程记录。 打开开始--程序--里面的msys64里面的mingw64控制台窗口&#xff0c;切换到quickjs下载解压缩后的目录&#xff0c;执行make和make install ndyHP66G5 MINGW64 ~…

el-table实现表头带筛选功能,并支持分页查询

最开始尝试了下面方法&#xff0c;发现这种方法仅支持筛选当前页的数据&#xff0c;不符合产品要求 于是通过查询资料发现可以结合filter-change事件&#xff0c;当表格的筛选条件发生变化的时候会触发该事件&#xff0c;调接口获取符合条件的数据&#xff0c;实现如下 1、表格…

OpenCV 从入门到精通(day_03)

1. ROI切割 ROI&#xff1a;Region of Interest&#xff0c;翻译过来就是感兴趣的区域。什么意思呢&#xff1f;比如对于一个人的照片&#xff0c;假如我们要检测眼睛&#xff0c;因为眼睛肯定在脸上&#xff0c;所以我们感兴趣的只有脸这部分&#xff0c;其他都不care&#xf…

OpenGL进阶系列20 - OpenGL SuperBible - bindlesstex 例子学习

目录 一:概述: 二:相关API介绍 三:代码完整注释 一: 概述: 什么是无绑定纹理(bindless texture)?无绑定纹理是OpenGL的一项技术,旨在消除传统的纹理绑定操作。这项技术允许着色器直接访问纹理而不需要显式地将纹理绑定到某个纹理单元,从而减少了渲染管线中的开销…

Spring Security认证授权深度解析

一 Spring Security简介 Spring Security是Spring生态系统中的一个安全框架&#xff0c;主要用于处理认证(Authentication)和授权(Authorization)。它提供了一套完整的安全解决方案&#xff0c;可以轻松集成到Spring应用中。 二 核心概念 1. 认证(Authentication) 验证用户…

[学成在线]10-课程审核

课程审核 需求分析 根据模块需求分析&#xff0c;课程发布前要先审核&#xff0c;审核通过方可发布。下图是课程审核及发布的流程图&#xff1a; 为什么课程审核通过才可以发布呢&#xff1f; 这样做为了防止课程信息有违规情况&#xff0c;课程信息不完善对网站用户体验也不…

【SpringBoot + MyBatis + MySQL + Thymeleaf 的使用】

目录&#xff1a; 一&#xff1a;创建项目二&#xff1a;修改目录三&#xff1a;添加配置四&#xff1a;创建数据表五&#xff1a;创建实体类六&#xff1a;创建数据接口七&#xff1a;编写xml文件八&#xff1a;单元测试九&#xff1a;编写服务层十&#xff1a;编写控制层十一…

Elasticsearch索引的字段映射

目录 type String类型 text和keyword的区别 数值类型 日期类型 index doc_values fields analyzer store index_options ElasticSearch索引映射示例 Elasticsearch中的字段设置直接影响数据的存储、索引和查询行为。结合索引查询场景合理设置mapping信息可以起到提…

【已解决】实际参数列表和形式参数列表长度不同、java: 无法将类xxx中的构造器xxx应用到给定类型| lombok相关

idea运行maven项目时&#xff0c;报错这个&#xff08;如标题&#xff09; 解决方案记录&#xff1a; 找到了之前的、能运行成功不报错的 maven项目。参考其pom.xml文件中lombok相关部分&#xff0c;将<path>标签下的lombok加个版本号&#xff0c;就运行成功了&#xff1…

4. 学习网站:学习新的技能或培养兴趣爱好

文章目录 前言英文网站&#xff1a;培养兴趣爱好的应用总结 前言 学习网站以及具体提供的内容。 英文网站&#xff1a; Coursera&#xff1a;提供来自全球顶尖大学和机构的在线课程&#xff0c;涵盖广泛的学科&#xff0c;包括编程、数据科学、商业和艺术等。Udemy&#xff1…

LabVIEW 开发中 TCP 与 UDP 协议的差异

在 LabVIEW 开发的网络通信场景中&#xff0c;TCP 和 UDP 是常用的两种传输层协议&#xff0c;它们各自具有独特的特点&#xff0c;适用于不同的应用需求。理解它们之间的差异&#xff0c;有助于开发者根据具体项目需求选择合适的协议&#xff0c;以实现高效、稳定的网络通信。…

04-深入解析 Spring 事务管理原理及源码

深入解析 Spring 事务管理原理及源码 Spring 事务管理&#xff08;Transaction Management&#xff09;是企业级应用开发中至关重要的功能之一&#xff0c;它确保数据操作的 原子性、一致性、隔离性、持久性&#xff08;ACID&#xff09;。 本篇博客将从 Spring 事务的基本概…

【Linux】用户向硬件寄存器写入值过程理解

思考一下&#xff0c;当我们咋用户态向寄存器写入一个值&#xff0c;这个过程是怎么样的呢&#xff1f;以下是应用程序通过标准库函数&#xff08;如 write()、ioctl() 或 mmap()&#xff09;向硬件寄存器写入值的详细过程&#xff0c;从用户空间到内核再到硬件的完整流程&…

自动驾驶02:点云预处理——02(运动补偿篇LIO-SAM)

当激光雷达&#xff08;LiDAR&#xff09;在运动中采集点云时&#xff0c;每个点的时间戳不同&#xff0c;而车辆在移动&#xff0c;导致点云在不同时间点的坐标与实际情况不符&#xff0c;这种现象称为运动畸变&#xff08;Motion Distortion&#xff09;。为了得到无畸变的点…

基础算法篇(3)(蓝桥杯常考点)—图论

前言 这期是基础算法篇的第三节&#xff0c;其中的dijkstra算法更是蓝桥杯中的高频考点 图的基本相关概念 有向图和无向图 自环和重边 稠密图和稀疏图 对于不带权的图&#xff0c;一条路径的路径长度是指该路径上各边权值的总和 对于带权的图&#xff0c;一条路径长度时指该路…

Crawl4AI:专为AI设计的开源网页爬虫工具,释放大语言模型的潜能

在当今数据驱动的AI时代,高效获取结构化网页数据是模型训练和应用落地的关键。Crawl4AI作为一款专为大型语言模型(LLMs)设计的开源爬虫工具,凭借其极速性能、AI友好输出和模块化设计,正在成为开发者社区的热门选择。本文将深入解析其核心特性与技术优势。 一、Crawl4AI的核…

前后端数据序列化:从数组到字符串的旅程(附优化指南)

&#x1f310; 前后端数据序列化&#xff1a;从数组到字符串的旅程&#xff08;附优化指南&#xff09; &#x1f4dc; 背景&#xff1a;为何需要序列化&#xff1f; 在前后端分离架构中&#xff0c;复杂数据类型&#xff08;如数组、对象&#xff09;的传输常需序列化为字符…