Qwik开发使用入门

前言

前面我们介绍了一下 Qwik 这个新的框架,如果没有看过的童鞋可以移步这里(追求极致性能!Qwik 1.0版本发布)。

本文结合官方的教学文档,翻译整理,原文链接在文末。

安装Qwik的前提条件

  1. 本地安装 Node.js v16.8 或更高版本
  2. 有一个开发工具,例如:Visual Studio Code

第一步 使用CLI安装应用

首先,使用 Qwik CLI 创建一个 Qwik 应用程序,它会生成一个空白的启动程序。Qwik 支持 NPM、yarn 和 pnpm。选择你喜欢的软件包管理器,然后运行以下命令(选其一):

npm create qwik@latest
pnpm create qwik@latest
yarn create qwik
bun create qwik@latest

安装过程中会提示一些安装依赖项等相关问题,大家根据自己需求选择。将黑窗口切换到下载的目录下,运行下面的命令(选其一),即可启动本地服务:

npm start
pnpm start
yarn start
bun start

第二步 创建一个笑话应用程序

Qwik 教程将指导您使用 Qwik 创建一个笑话应用程序,同时涵盖最重要的 Qwik 概念。该应用程序从 https://icanhazdadjoke.com 中随机显示一个笑话,并设有一个按钮,点击后即可获得一个新笑话。

1 创建一个路由

首先在特定路由上提供一个页面。这个基本应用程序在 /joke/ 路由上随机提供一个爸爸笑话应用程序。本教程依赖 Qwik 的元框架 Qwikcity,它使用基于目录的路由。开始使用

在你的项目中,在 /src/routes/ 中创建一个 /joke/ 目录,其中包含一个 index.tsx 文件。每个路由的 index.tsx 文件都必须有export default component$(...),以便 Qwikcity 知道要提供哪些内容。将以下内容粘贴到 src/routes/joke/index.tsx

import { component$ } from '@builder.io/qwik';export default component$(() => {return <section class="section bright">A Joke!</section>;
});

浏览器打开 http://127.0.0.1:5173/joke/ 这个链接,查看是否可以正常工作。

注意:
您的笑话路由默认组件已被现有布局包围。请参阅 “布局”,了解有关什么是布局以及如何使用布局的更多详情。有关如何编写组件的更多详情,请参阅组件 API 部分。

2 加载数据

我们将使用 https://icanhazdadjoke.com 上的外部 JSON API 来加载随机笑话。我们将使用路由加载器在服务器中加载这些数据,然后在组件中渲染。

打开 src/routes/joke/index.tsx,添加以下代码:

import { component$ } from '@builder.io/qwik';
import { routeLoader$ } from '@builder.io/qwik-city';export const useDadJoke = routeLoader$(async () => {const response = await fetch('https://icanhazdadjoke.com/', {headers: { Accept: 'application/json' },});return (await response.json()) as {id: string;status: number;joke: string;};
});export default component$(() => {// Calling our `useDadJoke` hook, will return a reactive signal to the loaded data.const dadJokeSignal = useDadJoke();return (<section class="section bright"><p>{dadJokeSignal.value.joke}</p></section>);
});

现在查看浏览器,会随机显示一个笑话。

代码解释:
传递给 routeLoader$ 的函数会在任何组件渲染之前在服务器上紧急调用,并负责加载数据。routeLoader$ 返回一个使用挂钩 useDadJoke(),可在组件中用于检索服务器数据。

注意:

  • 在渲染任何组件之前,服务器都会急切地调用 routeLoader$,即使在任何组件中都未调用其使用钩子。
  • RouteLoader$ 的返回类型会在组件中推断,无需任何额外的类型信息。

3 向服务器发送数据

之前,我们使用 routeLoader$ 将数据从服务器发送到客户端。要将数据从客户端发回服务器,我们使用 routeAction$

注意:routeAction$ 是向服务器发送数据的首选方式,因为它使用的是浏览器本地表单 API,即使禁用 JavaScript 也能正常工作。

要声明一个动作,请添加以下代码:

import { routeLoader$, Form, routeAction$ } from '@builder.io/qwik-city';export const useJokeVoteAction = routeAction$((props) => {// Leave it as an exercise for the reader to implement this.console.log('VOTE', props);
});

更新 export default 组件,以便在 <Form> 中使用 useJokeVoteAction 挂钩。

export default component$(() => {const dadJokeSignal = useDadJoke();const favoriteJokeAction = useJokeVoteAction();return (<section class="section bright"><p>{dadJokeSignal.value.joke}</p><Form action={favoriteJokeAction}><input type="hidden" name="jokeID" value={dadJokeSignal.value.id} /><button name="vote" value="up">👍</button><button name="vote" value="down">👎</button></Form></section>);
});

现在,在 http://localhost:5173/joke/ 上显示按钮,如果点击按钮,其值就会记录到控制台。

代码解释:

  • routeAction$ 接收数据。
  • 每当张贴表单时,服务器就会调用传递给 routeAction$ 的函数。
  • routeAction$ 返回一个使用挂钩,即 useJokeVoteAction,你可以在组件中使用它来发布表单数据。
  • Form 是一个方便的组件,它封装了浏览器的本地 <form> 元素。

需要注意的事项:

  • 有关验证,请参阅 zod validation
  • 即使禁用了 JavaScriptrouteAction$ 也能正常工作。
  • 如果启用了 JavaScriptForm 组件将阻止浏览器发布表单,而是使用 JavaScript 发布数据,并在不完全刷新的情况下模拟浏览器的本地表单行为。

4 修改状态

跟踪状态和更新用户界面是应用程序的核心工作。Qwik 提供了一个 useSignal 钩子来跟踪应用程序的状态。要了解更多信息,请参阅状态管理。

qwik 引入 useSignal

import { component$, useSignal } from "@builder.io/qwik";

使用 useSignal() 声明组件的状态

const isFavoriteSignal = useSignal(false);

为组件添加一个按钮,以修改状态

<buttononClick$={() => {isFavoriteSignal.value = !isFavoriteSignal.value;}}>{isFavoriteSignal.value ? '❤️' : '🤍'}
</button>

5 任务和调用服务器代码

Qwik 中,任务是指当状态发生变化时需要进行的工作(类似于其他框架中的 effect)。在本例中,我们使用任务来调用服务器上的代码。

qwik 引入 useTask$

import { component$, useSignal, useTask$ } from "@builder.io/qwik";

创建跟踪 isFavoriteSignal 状态的新任务

useTask$(({ track }) => {});

添加 track 调用,以便在 isFavoriteSignal 状态改变时重新执行任务。

useTask$(({ track }) => {track(() => isFavoriteSignal.value);
});

添加要在状态变化时执行的工作

useTask$(({ track }) => {track(() => isFavoriteSignal.value);console.log('FAVORITE (isomorphic)', isFavoriteSignal.value);
});

如果只想让工作在服务器上进行,则用 server$() 进行封装

useTask$(({ track }) => {track(() => isFavoriteSignal.value);console.log('FAVORITE (isomorphic)', isFavoriteSignal.value);server$(() => {console.log('FAVORITE (server)', isFavoriteSignal.value);})();
});

注意:

  • useTask$ 的主体在服务器和客户端上都会执行(同构)。
  • SSR 上,服务器会打印 FAVORITE (isomorphic) falseFAVORITE (server) false
  • 当用户与 favorite 交互时,客户端会打印 FAVORITE (isomorphic) true,服务器会打印 FAVORITE (server) true

6 样式

样式是任何应用程序的重要组成部分。Qwik 提供了一种将样式与组件关联起来并设定其范围的方法。

创建文件 src/routes/joke/index.css

p {font-weight: bold;
}
form {float: right;
}

在文件 src/routes/joke/index.tsx 中引入样式文件

import styles from "./index.css?inline";

qwik 导入 useStylesScoped$

import { component$, useSignal, useStylesScoped$, useTask$ } from "@builder.io/qwik";

告诉组件加载样式

useStylesScoped$(styles);

代码解释:

  • ?inline 参数告诉 Vite 将样式内联到组件中。
  • useStylesScoped$ 调用告诉 Qwik 仅将样式与组件关联(范围)。
  • 只有当样式尚未作为 SSR 的一部分内联时,才会被加载,而且只针对第一个组件。

本节的完整代码片段如下,以供参考:

import { component$, useSignal, useStylesScoped$, useTask$ } from '@builder.io/qwik';
import { routeLoader$, Form, routeAction$, server$ } from '@builder.io/qwik-city';
import styles from './index.css?inline';export const useDadJoke = routeLoader$(async () => {const response = await fetch('https://icanhazdadjoke.com/', {headers: { Accept: 'application/json' },});return (await response.json()) as {id: string;status: number;joke: string;};
});export const useJokeVoteAction = routeAction$((props) => {console.log('VOTE', props);
});export default component$(() => {useStylesScoped$(styles);const isFavoriteSignal = useSignal(false);// Calling our `useDadJoke` hook, will return a reactive signal to the loaded data.const dadJokeSignal = useDadJoke();const favoriteJokeAction = useJokeVoteAction();useTask$(({ track }) => {track(() => isFavoriteSignal.value);console.log('FAVORITE (isomorphic)', isFavoriteSignal.value);server$(() => {console.log('FAVORITE (server)', isFavoriteSignal.value);})();});return (<section class="section bright"><p>{dadJokeSignal.value.joke}</p><Form action={favoriteJokeAction}><input type="hidden" name="jokeID" value={dadJokeSignal.value.id} /><button name="vote" value="up">👍</button><button name="vote" value="down">👎</button></Form><buttononClick$={() => (isFavoriteSignal.value = !isFavoriteSignal.value)}>{isFavoriteSignal.value ? '❤️' : '🤍'}</button></section>);
});

7 预览

我们创建了一个最小的应用程序,让您对 Qwik 的关键概念和 API 有一个大致的了解。该应用程序运行在开发模式下,使用热模块重载(HMR)在更改代码的同时持续更新应用程序。

在开发模式下:

  • 每个文件都是单独加载的,这可能会导致网络选项卡中出现瀑布流。
  • 捆绑包没有投机加载,因此第一次交互时可能会有延迟。

让我们创建一个能消除这些问题的生产构建。

创建预览版

运行 npm run preview 创建生产构建。

注意:

  • 您的应用程序现在应已完成生产构建,并在不同的端口上运行。
  • 如果您现在与应用程序交互,开发工具的网络选项卡应显示捆绑包已从 ServiceWorker 缓存中即时交付。

总结

恭喜!你已经完成了 Qwik 的基础入门教学!希望这篇文章对你有所帮助,更多的 Qwik 知识,需要在实战中学习掌握。

下面是 Qwik 中各个 API 功能列表和解释:

  1. component$ —— 每个组件导出时,必须使用这个函数
  2. routeLoader$ —— 任何组件渲染之前在服务器上紧急调用,并负责加载数据。并返回一个挂钩函数,可在组件中用于检索服务器数据。
  3. routeAction$ —— 将数据从客户端发回服务器。routeAction$ 是向服务器发送数据的首选方式,因为它使用的是浏览器本地表单 API,即使禁用 JavaScript 也能正常工作。
  4. useSignal —— 跟踪应用程序的状态。
  5. useTask$ —— 类似 effect。当状态发生变化时需要执行某些工作时,可以使用该 API,并且该 API 还提供了:状态变化时,服务器执行某些动作的功能(配合 server$ 使用)。
  6. useStylesScoped$ —— 引入样式文件时使用

参考链接:
qwik 官方教程:https://qwik.builder.io/docs/getting-started/

文章首发地址:
Qwik开发使用入门 - Cikayo

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

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

相关文章

【论文解读】The Power of Scale for Parameter-Efficient Prompt Tuning

一.介绍 1.1 promote tuning 和 prefix tuning 的关系 “前缀调优”的简化版 1.2 大致实现 冻结了整个预训练模型&#xff0c;并且只允许每个下游任务附加k个可调令牌到输入文本。这种“软提示”是端到端训练的&#xff0c;可以压缩来自完整标记数据集的信号&#xff0c;使…

ssrf漏洞学习

目录 ssrf漏洞 相关函数 相关协议 file协议 dict协议 gopher协议 ctfshow ssrf web351 web352 web353 web354过滤01 web355五位长度 web356 三位长度 web357 DNS重定向 web358 正则 ssrf漏洞 SSRF&#xff08;Server-Side Request Forgery&#xff0c;服务器端请…

位操作符^以及正负数在计算机中的存储

(数据是怎么在计算机中存储的)​ 正数和负数在内存中都是以补码的形式存储的&#xff0c;但不同的是正数的原码&#xff0c;补码&#xff0c;反码都是相同的&#xff0c;而负数的原码&#xff0c;补码和反码是不同的。 负数的原码&#xff0c;补码&#xff0c;反码之间存在什么…

人大金仓与哪吒科技达成战略合作,加快推动智慧港口建设

近日&#xff0c;人大金仓与哪吒港航智慧科技&#xff08;上海&#xff09;有限公司&#xff08;以下简称“哪吒科技”&#xff09;达成战略合作。双方旨在共享优势资源&#xff0c;联合为港口企业转型升级提供完备的技术支撑与行业解决方案。人大金仓总裁杜胜、哪吒科技总经理…

elementui中el-select和el-tree实现下拉树形多选功能

实现效果如下&#xff1a; 代码如下&#xff1a; html中 <el-col :lg"12"><el-form-item label"可用单位" prop"useOrgListTemp"><div class"departAll"><el-selectref"selectTree"v-model"valu…

英语——分享篇——每日200词——2601-2800

2601——resistant——[rɪzɪstənt]——adj.抵抗的——resistant——resi热死(拼音)st石头(拼音)ant蚂蚁(熟词)——热死了石头上的蚂蚁还在抵抗——The body may be less resistant if it is cold. ——天冷时&#xff0c;身体的抵抗力会下降。 2602——prospect——[prɒspe…

42911-2023 碳纤维增强复合材料 密封压力容器加速吸湿和过饱和调节方法

1 范围 本文件描述了碳纤维增强复合材料加速吸湿和过饱和调节的方法&#xff0c;该方法在温度高于100 ℃但低 于试验材料玻璃化转变温度(T) 的饱和水蒸气密封压力容器中进行。 本文件适用于玻璃化转变温度大于150℃的热固性碳纤维增强复合材料。热塑性碳纤维增强复合 材料也…

神经网络和AI的关系

神经网络&#xff08;Neural Networks&#xff09;和人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;之间存在紧密的关系&#xff0c;可以概括为以下几点&#xff1a; 神经网络是AI的子领域&#xff1a;神经网络是人工智能的一个子领域&#xff0c;它是…

html中公用css、js提取、使用

前言 开发中&#xff0c;页面会有引用相同的css、js的情况&#xff0c;如需更改则每个页面都需要调整&#xff0c;重复性工作较多&#xff0c;另外在更改内容之后上传至服务器中会有缓存问题&#xff0c;特针对该情况对公用css、js进行了提取并对引用时增加了版本号 一、提取…

Linux:权限是什么

本篇文章来简单介绍一下Linux操作系统中权限的基本概念和一些操作方法&#xff0c;对Linux权限有一个基本的了解&#xff0c;希望对大家学习Linux有所帮助。 目录 1.权限的概念 2.Linux权限管理 2.1 文件访问者的分类 2.2 文件类型与访问权限&#xff08;事物属性&#xff…

019-第三代软件开发-Git提交规范

第三代软件开发-Git提交规范 文章目录 第三代软件开发-Git提交规范项目介绍Git提交规范分支规范Commit Message FormatHeaderBodyFooterRevert 总结一下 关键字&#xff1a; Qt、 Qml、 git、 Commit、 release 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个…

【广州华锐互动】全屋智能家电VR虚拟仿真演示系统

在过去的几年中&#xff0c;智能家居的概念已经逐渐进入人们的生活。然而&#xff0c;它的真正潜力和最终形态可能还未被完全发掘。一种新兴的技术&#xff0c;虚拟现实&#xff08;VR&#xff09;&#xff0c;为我们提供了一种全新的方式来理解和体验智能家居。VR公司广州华锐…

Golang:反射机制reflect

目录 反射 基本概念 变量的内在机制 Go的反射三定律 反射的使用 空接口与反射 结构体与反射 函数与反射 反射的实际运用场景 反射

Paper Reading:《Consistent-Teacher: 减少半监督目标检测中不一致的伪目标》

目录 简介工作重点方法ASA, adaptive anchor assignmentFAM-3D, 3D feature alignment moduleGMM, Gaussian Mixture Model实施细节 实验与SOTA的比较消融实验 总结 简介 题目&#xff1a;《Consistent-Teacher: Towards Reducing Inconsistent Pseudo-targets in Semi-supervi…

系统设计 - 我们如何通俗的理解那些技术的运行原理 - 第三部分:缓存

本心、输入输出、结果 文章目录 系统设计 - 我们如何通俗的理解那些技术的运行原理 - 第三部分&#xff1a;缓存前言缓存数据存储在什么地方图层说明 为什么 Redis 这么快&#xff1f;如何使用 Redis顶级缓存策略弘扬爱国精神 系统设计 - 我们如何通俗的理解那些技术的运行原理…

SystemVerilog学习(4)——自定义结构

一、 通过typedef来创建用户自定义类型 typedef语句可以用来创建新的类型。例如,你要求一个算术逻辑单元(ALU)在编译时可配置,以适应8比特、16比特,24比特或32比特等不同位宽的操作数。在Verilog中,你可以为操作数的位宽和类型分别定义一个宏(macro),如例2.32所示。 SV则提供了…

运行stable-diffusion-xl-refiner-1.0遇到version `GLIBCXX_3.4.29‘ not found的问题

一、问题背景 https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0 在运行示例程序时候遇到GLIBCXX_3.4.29‘ not found diffusers to > 0.18.0 import torch from diffusers import StableDiffusionXLImg2ImgPipeline from diffusers.utils import loa…

sqlmap --os-shell选项原理解析

文章目录 sqlmap --os-shell选项原理解析原理解析总结 sqlmap --os-shell选项原理解析 以sqli第一关为例。 --os-shell 是 SQLMap 工具的一个参数&#xff0c;用于在成功注入数据库后&#xff0c;执行操作系统命令并获取其输出。 sqlmap -u "http://192.168.188.199/sq…

100天掌握网络安全知识点!

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…

数据库基础(二)【MySQL】

文章目录 什么是数据库数据库是运行在操作系统中的软件 为什么需要数据库有哪些数据库MySQL 的体系架构网络连接层/API 层数据库服务层存储引擎层系统文件层 什么是 SQL参考资料 阅读前导&#xff1a;理论上数据库可以在操作系统和网络之前学习&#xff0c;但是这样会让学习层次…