Skip to content

Commit d76b9e9

Browse files
committed
chore: replace kuizuo.cn with kuizuo.me
1 parent 1a73982 commit d76b9e9

File tree

80 files changed

+522
-522
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+522
-522
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
- 🌈 **资源导航** - 收集并分享有用、有意思的资源
3030
- 📦 **项目展示** - 展示你的项目,可用作于作品集
3131

32-
我的主题魔改实现:[Docusaurus 主题魔改](https://kuizuo.cn/docs/docusaurus-guides)
32+
我的主题魔改实现:[Docusaurus 主题魔改](https://kuizuo.me/docs/docusaurus-guides)
3333

3434
## :wrench: 技术栈
3535

blog/authors.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ kuizuo:
22
name: 愧怍
33
title: 全栈 typescripter / 刚毕业的学生
44
url: https://github.com/kuizuo
5-
image_url: https://kuizuo.cn/img/logo.png
6-
email: hi@kuizuo.cn
5+
image_url: https://kuizuo.me/img/logo.png
6+
email: hi@kuizuo.me
77
socials:
88
x: kuizuo
99
github: kuizuo

blog/develop/HTTP请求之Content-Type.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ keywords: [http]
1414
先看一条 HTTP 请求
1515

1616
```http
17-
POST https://xxx.kuizuo.cn/v2/login HTTP/1.1
18-
Host: xxx.kuizuo.cn
17+
POST https://xxx.kuizuo.me/v2/login HTTP/1.1
18+
Host: xxx.kuizuo.me
1919
Connection: keep-alive
2020
Content-Length: 121
2121
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36

blog/develop/HTTP请求配置客户端SSL证书.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ APP 例子:隐约
2525

2626
贴上下载地址及密码
2727

28-
证书: https://img.kuizuo.cn/cert.p12
28+
证书: https://img.kuizuo.me/cert.p12
2929

3030
密码: `xinghekeji888.x`
3131

blog/develop/JS代码之混淆.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ keywords: [javascript, ast, reverse, project]
99

1010
<!-- truncate -->
1111

12-
[JS deobfuscator](http://js-deobfuscator.kuizuo.cn/)
12+
[JS deobfuscator](http://js-deobfuscator.kuizuo.me/)
1313

1414
## 什么是 AST
1515

@@ -175,7 +175,7 @@ babel 的编译过程主要有三个阶段
175175

176176
同时 Babel 手册(中文版) [babel-handbook](https://github.com/jamiebuilds/babel-handbook/blob/master/translations/zh-Hans/plugin-handbook.md)强烈建议反复阅读,官方的例子远比我所描述来的详细。
177177

178-
![image-20211212151620278](https://img.kuizuo.cn/20211212151620278.png)
178+
![image-20211212151620278](https://img.kuizuo.me/20211212151620278.png)
179179

180180
### 例子
181181

@@ -207,7 +207,7 @@ function printTips() {
207207

208208
鼠标点击这个 tips 查看 tips 变量在树节点中的节点。
209209

210-
![image-20211212170832228](https://img.kuizuo.cn/20211212170832228.png)
210+
![image-20211212170832228](https://img.kuizuo.me/20211212170832228.png)
211211

212212
这边可以看到有两个蓝色标记的节点,分别是`VariableDeclaration``VariabelDeclarator`,翻译过来便是变量声明与变量说明符,很显然整个`let tips = [ ]``VariableDeclaration`,而`tips`则是`VariabelDeclarator`
213213

@@ -469,7 +469,7 @@ types 的主要用途还是构造节点,或者说写一个 Builders(构建
469469

470470
不过先别急着敲代码,把`let a = 100`代码进行 ast 解析,看看每个代码的节点对应的 type 都是什么,这样才有助于生成该代码。
471471

472-
![image-20211216131627955](https://img.kuizuo.cn/20211216131627955.png)
472+
![image-20211216131627955](https://img.kuizuo.me/20211216131627955.png)
473473

474474
body 内的第一个节点便是我们整条的代码,输入`t.variableDeclaration()`,鼠标悬停在 variableDeclaration 上,或者按 Ctrl 跳转只.d.ts 类型声明文件 查看该方法所需几个参数
475475

@@ -661,7 +661,7 @@ let code = generator(arr_c).code
661661

662662
一共有两种类型 `Node``NodePath`,记住有`Path`则是`path`,如`path`就属于`NodePath`,而`path.node` 属于`Node`
663663

664-
![image-20211213021420326](https://img.kuizuo.cn/20211213021420326.png)
664+
![image-20211213021420326](https://img.kuizuo.me/20211213021420326.png)
665665

666666
#### 将节点转为代码
667667

@@ -841,7 +841,7 @@ body
841841

842842
在 ast 树结构中框中所表示
843843

844-
![image-20211216200502122](https://img.kuizuo.cn/20211216200502122.png)
844+
![image-20211216200502122](https://img.kuizuo.me/20211216200502122.png)
845845

846846
也并不是说所有节点都有同级节点,也并不是所有的 container 都是一个数组,例如下面这个例子
847847

@@ -894,7 +894,7 @@ Node {
894894

895895
对应 AST 树结构中所框选
896896

897-
![image-20211216201242257](https://img.kuizuo.cn/20211216201242257.png)
897+
![image-20211216201242257](https://img.kuizuo.me/20211216201242257.png)
898898

899899
也就是说该节点并没有同级节点
900900

@@ -1092,7 +1092,7 @@ let a = 'kuizuo'
10921092
10931093
分析 AST 树结构
10941094
1095-
![image-20211217161958075](https://img.kuizuo.cn/20211217161958075.png)
1095+
![image-20211217161958075](https://img.kuizuo.me/20211217161958075.png)
10961096
10971097
不难观察出,parser 将其成两部分`expressions``quasis`。而所要转为的最终代码应该是`'' + a + 'nb' + 12 + '3' + '456'+ ''`,并且`quasis`成员个数始终比`expressions`多一位,所以只需要将`expressions`插入置`quasis`成员内,然后通过 binaryExpression 进行拼接即可。大致的思路有了,那么就开始用代码来进行拼接。
10981098

blog/develop/JS代码之还原.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ tags: [javascript, ast, reverse, project]
77
keywords: [javascript, ast, reverse, project]
88
---
99

10-
基于 Babel 对 JS 代码进行混淆与还原操作的网站 [JS 代码混淆与还原 (kuizuo.cn)](http://deobfuscator.kuizuo.cn/)
10+
基于 Babel 对 JS 代码进行混淆与还原操作的网站 [JS 代码混淆与还原 (kuizuo.me)](http://deobfuscator.kuizuo.me/)
1111

1212
![js-de-obfuscator](https://github.com/kuizuo/js-deobfuscator/blob/main/images/1.png)
1313

@@ -45,7 +45,7 @@ AST 能做为逆向分析的利器,可以将还原出来的代码替换原来
4545

4646
通过 AST 查看 node 节点,可以发现`value`正是我们想要的数据,但这里确显示的是`extra.raw`,实际上只需要遍历到相应的节点,然后 extra 属性给删除即可,同样的 Unicode 编码也是按上述方式显示。
4747

48-
![image-20211224202108279](https://img.kuizuo.cn/20211224202108279.png)
48+
![image-20211224202108279](https://img.kuizuo.me/20211224202108279.png)
4949

5050
具体遍历的代码如下
5151

@@ -764,6 +764,6 @@ for (
764764
765765
## JS 混淆与还原的网站
766766
767-
针对上述还原操作其实还不够明显,于是就编写了一个在线对 JS 代码混淆与还原的网站(主要针对还原)– [JS 代码混淆与还原 (kuizuo.cn)](https://deobfuscator.kuizuo.cn/)
767+
针对上述还原操作其实还不够明显,于是就编写了一个在线对 JS 代码混淆与还原的网站(主要针对还原)– [JS 代码混淆与还原 (kuizuo.me)](https://deobfuscator.kuizuo.me/)
768768
769769
其实也就是对上述的还原代码进行封装成工具使用。

blog/develop/MongoDB按时间分组.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ keywords: [mongodb]
1313

1414
需求是这样的,要统计每一周的各个商品的销售记录,使用 echarts 图表呈现,如下图
1515

16-
![image-20210830214556262](https://img.kuizuo.cn/20210830214556262.png)
16+
![image-20210830214556262](https://img.kuizuo.me/20210830214556262.png)
1717

1818
说实话,一开始听到这个需求的时候,我是有点慌的,因为 MongoDB 的分组玩的比较少(Mysql 也差不多),又要按照对应的星期来进行分组,这在之前学习 MongoDB 的时候还没接触过,于是就准备写了这篇文章,来记录下我是如何进行分组的
1919

blog/develop/Next js 使用 Hono 接管 API.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ authors: kuizuo
66
tags: [nextjs, honojs]
77
keywords: [nextjs, honojs]
88
description: 这篇文章详细介绍了如何在 Next.js 项目中使用 Hono 框架来接管 API 路由,以解决 Next.js 自带 API Routes 功能的限制。并探讨了集成步骤、数据验证、错误处理、RPC功能等方面,并提供了实用的代码示例和优化建议。
9-
image: https://img.kuizuo.cn/2024/1002213046-nextjs-with-hono.png
9+
image: https://img.kuizuo.me/2024/1002213046-nextjs-with-hono.png
1010
---
1111

1212
直入正题,Next.js 自带的 API Routes (现已改名为 [**Route Handlers**](https://nextjs.org/docs/app/building-your-application/routing/route-handlers)) 异常难用,例如当你需要编写一个 RESTful API 时,尤为痛苦
1313

1414
<!-- truncate -->
1515

16-
![image.png](https://img.kuizuo.cn/2024%2F0930171329-image.png)
16+
![image.png](https://img.kuizuo.me/2024%2F0930171329-image.png)
1717

1818
这还没完,当你需要数据验证、错误处理、中间件等等功能,又得花费不小的功夫,所以 Next.js 的 API Route 更多是为你的全栈项目编写一些简易的 API 供外部服务,这也可能是为什么 Next.js 宁可设计 [Server Action](https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations) 也不愿为 API Route 提供传统后端的能力。
1919

@@ -47,7 +47,7 @@ export const DELETE = handle(app)
4747

4848
一开始的 User CRUD 例子,则可以将其**归属到一个文件内**下,这里我不建议将后端业务代码放在 app/api 下,因为 Next.js 会自动扫描 app 下的文件夹,这可能会导致不必要的热更新,并且也不易于服务相关代码的拆分。而是在根目录下创建名为 server 的目录,并将有关后端服务的工具库(如 db、redis、zod)放置该目录下以便调用。
4949

50-
![image.png](https://img.kuizuo.cn/2024%2F0930171342-imageundefined1.png)
50+
![image.png](https://img.kuizuo.me/2024%2F0930171342-imageundefined1.png)
5151

5252
至此 next.js 的 api 接口都将由 hono.js 来接管,接下来只需要按照 Hono 的开发形态便可。
5353

@@ -89,7 +89,7 @@ export default app
8989

9090
但此时触发数据验证失败,响应的结果令人不是很满意。下图为访问 `/api/todo/xxx` 的响应结果(其中 xxx 不为 cuid 格式,因此抛出数据验证异常)
9191

92-
![image.png](https://img.kuizuo.cn/2024%2F0930171510-imageundefined2.png)
92+
![image.png](https://img.kuizuo.me/2024%2F0930171510-imageundefined2.png)
9393

9494
所返回的响应体是完整的 zodError 内容,并且状态码为 400
9595

@@ -162,7 +162,7 @@ app.onError(handleError)
162162

163163
这样就将错误统一处理,响应体也自定义,且后续自定义业务错误也同样如此。
164164

165-
![](https://img.kuizuo.cn/2024%2F1003095801-20241003095800.png)
165+
![](https://img.kuizuo.me/2024%2F1003095801-20241003095800.png)
166166

167167
:::note 顺带一提
168168

@@ -174,13 +174,13 @@ app.onError(handleError)
174174

175175
Hono 有个特性我很喜欢也很好用,可以像 [TRPC](https://trpc.io/) 那样,导出一个 [client](https://hono.dev/docs/guides/rpc#client) 供前端直接调用,省去编写前端 api 调用代码以及对应的类型。
176176

177-
这里我不想在过多叙述 RPC(可见我之前所写有关 [TRPC 的使用](https://kuizuo.cn/blog/typescript-full-stack-technology-trpc#end-to-end-typesafe-apis%E7%AB%AF%E5%88%B0%E7%AB%AF%E7%B1%BB%E5%9E%8B%E5%AE%89%E5%85%A8)),直接来说说有哪些注意点。
177+
这里我不想在过多叙述 RPC(可见我之前所写有关 [TRPC 的使用](https://kuizuo.me/blog/typescript-full-stack-technology-trpc#end-to-end-typesafe-apis%E7%AB%AF%E5%88%B0%E7%AB%AF%E7%B1%BB%E5%9E%8B%E5%AE%89%E5%85%A8)),直接来说说有哪些注意点。
178178

179179
### 链式调用
180180

181181
还是以 User CRUD 的代码为例,不难发现 `.get` `.post` `.put` 都是以链式调用的写法来写的,一旦拆分后,此时接口还是能够调用,但这将会丢失此时路由对应的类型,导致 client 无法使用获取正常类型,使用链式调用的 app 实例化对象则正常。
182182

183-
![image.png](https://img.kuizuo.cn/2024%2F0930171730-imageundefined3.png)
183+
![image.png](https://img.kuizuo.me/2024%2F0930171730-imageundefined3.png)
184184

185185
### 替换原生 Fetch 库
186186

@@ -375,7 +375,7 @@ app.doc('/api/doc', {
375375
app.get('/api/ui', swaggerUI({ url: '/api/doc' }))
376376
```
377377

378-
![image.png](https://img.kuizuo.cn/2024%2F0930171730-imageundefined4.png)
378+
![image.png](https://img.kuizuo.me/2024%2F0930171730-imageundefined4.png)
379379

380380
从目前来看,OpenAPI 文档的生成仍面临挑战。我们期待 Hono 未来能推出一个功能,可以根据 app 下的路由自动生成接口文档(相关[Issue](https://github.com/honojs/hono/issues/2970)已存在)。
381381

blog/develop/RPC远程调用浏览器函数.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ keywords: [javascript, rpc, browser]
1717

1818
通过关键词`password:` 便可找到对应的加密地点,找到加密调用的函数所出现的位置(loginv5.js 8944 行),发现通过调用`e.RSA.encrypt(s)`(其中 s 为明文 `a123456`),便可得到加密后的结果。
1919

20-
![image-20211008042148653](https://img.kuizuo.cn/20211008042148653.png)
20+
![image-20211008042148653](https://img.kuizuo.me/20211008042148653.png)
2121

22-
![image-20211008041300534](https://img.kuizuo.cn/20211008041300534.png)
22+
![image-20211008041300534](https://img.kuizuo.me/20211008041300534.png)
2323

2424
```
2525
e.RSA.encrypt(s)
@@ -68,7 +68,7 @@ ws.on('connection', socket => {
6868

6969
测试结果如下
7070

71-
![image-20211008043925753](https://img.kuizuo.cn/20211008043925753.png)
71+
![image-20211008043925753](https://img.kuizuo.me/20211008043925753.png)
7272

7373
上面代码写的很简陋,尤其是数据交互的地方,这里可以使用 json 来改进一下。像这样,至于为啥用 try 是防止 json 数据不对导致解析错误(具体代码就不解读了)
7474

@@ -111,11 +111,11 @@ ws.on('connection', socket => {
111111

112112
既然要实现我们的代码,那么就需要将我们的代码注入到原来的代码上,这里我使用的是 Chrome 的开发者工具中的覆盖功能,选择一个本地文件夹,并允许权限。
113113

114-
![image-20211008054918531](https://img.kuizuo.cn/20211008054918531.png)
114+
![image-20211008054918531](https://img.kuizuo.me/20211008054918531.png)
115115

116116
选择要替换代码的文件,选择保存以备替换(前提得开启覆盖)
117117

118-
![image-20211008055032125](https://img.kuizuo.cn/20211008055032125.png)
118+
![image-20211008055032125](https://img.kuizuo.me/20211008055032125.png)
119119

120120
接着在覆盖中找到文件,找到加密的代码块,添加如下代码
121121

@@ -147,13 +147,13 @@ ws.on('connection', socket => {
147147
})()
148148
```
149149

150-
![image-20211008201809446](https://img.kuizuo.cn/20211008201809446.png)
150+
![image-20211008201809446](https://img.kuizuo.me/20211008201809446.png)
151151

152152
然后就是最关键的地方了,触发加密函数,并将结果返回。触发加密函数只需要向浏览器发送指定数据`{"type":"getPasswordEnc","value":"a123456"}`,浏览器接受到对应的类型与数据,便调用相应的函数,并将结果`{"type":"callbackPasswordEnc","value":"FM6SK3XiL5X0RF9NZi7qhIsu7Pd46mfKnn6YkWUNSGrJO+XXhiXyoG8huaqQW4BnmYuo0JVVQj28C+BK/r6NTNbLcV4gMSREB2hYU/oIYedCJsZ9sbZQ89p1aI9kVcDeRlXBhjNUxkcS9Rh+vKzyNApwpbPcAuGTCSZhKst8vVo="}`返回即可。
153153

154154
服务端的效果如下图
155155

156-
![image-20211008204247104](https://img.kuizuo.cn/20211008204247104.png)
156+
![image-20211008204247104](https://img.kuizuo.me/20211008204247104.png)
157157

158158
## 优化执行流程
159159

@@ -283,7 +283,7 @@ ws.on('connection', socket => {
283283
最终演示效果如下视频(浏览器代码是提前注入进去的)
284284

285285
<video width="800px" height="450px" controls="controls" >
286-
<source id="mp4" src="https://img.kuizuo.cn/rpc.mp4" type="video/mp4" />
286+
<source id="mp4" src="https://img.kuizuo.me/rpc.mp4" type="video/mp4" />
287287
</video >
288288

289289
其实还是一些是要完善的,这里的 Websocket 只是实现了连接,还有心跳包异常断开,浏览器异常关闭导致 websocket 断开无法调用函数等等,以及浏览器的代码还需要手动注入很不优化,后续如果使用 Chrome 插件开发一个实现注入 js 代码的功能也许会好一些。(正准备编写 Chrome 插件)
@@ -337,7 +337,7 @@ app.listen(8000, () => {
337337

338338
发送 GET 请求 URL 为 [http://127.0.0.1:8000/getPasswordEnc?password=a123456](http://127.0.0.1:8000/getPasswordEnc?password=a123456) 实现效果如图
339339

340-
![image-20211009040704534](https://img.kuizuo.cn/20211009040704534.png)
340+
![image-20211009040704534](https://img.kuizuo.me/20211009040704534.png)
341341

342342
对于用户调用来说相对友好了不少(其实是很好),不用在创建 websocket 客户端,只需要发送 HTTP 请求(GET 或 POST),不过我这边使用的是 Node 自带的 http 模块来搭建的一个 http 服务器,实际使用中将会采用 express 来编写路由提高开发效率和代码可读性,这里只是作为演示。
343343

blog/develop/React Native 开发心得分享.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ date: 2024-05-14
55
authors: kuizuo
66
tags: [react native, 原生, 心得分享]
77
keywords: [react native, 原生, 心得分享]
8-
image: https://img.kuizuo.cn/2024/0514121158-react-native.png
8+
image: https://img.kuizuo.me/2024/0514121158-react-native.png
99
---
1010

1111
最近研究了一下 React Native(简称RN),并用它作为毕设项目(一个仿小红书的校园社交应用)。经过一段时间的折腾,对 RN 生态有了一些了解,是时候可以分享一些心得了。
@@ -46,7 +46,7 @@ Expo 是基于 React Native 并整合大量常用的 native module([Expo SDK](ht
4646

4747
此外 Expo 还提供了 [Expo Go App](https://docs.expo.dev/get-started/expo-go/#want-to-understand-how-expo-go-works),只需要在你的移动端设备中安装它,启动开发服务器并生成 QR 码。在浏览器打开 [snack.expo.dev](https://snack.expo.dev/) ,点击 MyDevice,扫码并在 Expo app 中查看。
4848

49-
![Untitled](https://img.kuizuo.cn/2024/0514104918-Untitled.png)
49+
![Untitled](https://img.kuizuo.me/2024/0514104918-Untitled.png)
5050

5151
会自动将该程序实时运行在你的移动端设备,意味着你更改代码也将会同步到Expo go 中。极大程度上提升 RN 的开发体验,尤其是在真机测试阶段。
5252

@@ -87,7 +87,7 @@ node-linker=hoisted
8787

8888
如果不怎么做的话,会报错,如果只是这样倒还没什么。重点是错误提示并没有堆栈信息!就如下图所示
8989

90-
![Untitled](https://img.kuizuo.cn/2024/0514104918-Untitled%201.png)
90+
![Untitled](https://img.kuizuo.me/2024/0514104918-Untitled%201.png)
9191

9292
这点对于开发体验而言并不友好。
9393

@@ -233,19 +233,19 @@ const { top } = useSafeAreaInsets();
233233

234234
并且他的主题系统使用极其的怪,采用 $number 的形式来定义尺寸(官方称 token),重点是宽高和边距采用相同的 token 效果还不一样,贴个图。
235235

236-
![Untitled](https://img.kuizuo.cn/2024/0514104918-Untitled%202.png)
236+
![Untitled](https://img.kuizuo.me/2024/0514104918-Untitled%202.png)
237237

238238
但他的颜色更是一言难尽了,从 color0 到 color11 的效果就如下图
239239

240-
![Untitled](https://img.kuizuo.cn/2024/0514104918-Untitled%203.png)
240+
![Untitled](https://img.kuizuo.me/2024/0514104918-Untitled%203.png)
241241

242242
可能是因为我用惯了 Tailwindcss 那套颜色系统,所以很不能理解这套颜色系统,并且在我实际编写组件的过程也是异常的奇怪。
243243

244244
但最让我想吐槽的是官方还为此提供了一个主题系统配置的生成器网站,但只有 tamagui 的赞助者才能够使用,如果想要自己定义一个主题,就需要配置特别多的文件,总之就是很难用就对了。
245245

246246
顺带在贴一张 Provider 嵌套
247247

248-
![provider](https://img.kuizuo.cn/2024/0514171536-0514092451-202405140924689.png)
248+
![provider](https://img.kuizuo.me/2024/0514171536-0514092451-202405140924689.png)
249249

250250
这里我就不得不提到我为啥一开始选用 tamagui 了(现已迁移到 gluestack-ui),说实话我是有点后悔的,在一开始选定 UI 库的时候,我是选择 NativeWind 的,但后面无意刷到了 [T4-stack](https://t4stack.com/) (算是被他坑了),而它所用的便是 tamagui,并且一套代码跑 expo 与 next.js。于是便采用相同的项目结构以及 UI 库了。但事实上在我编写的过程中,想要一套代码就能实现跨三端(web,android,ios) 效果并不佳了,这在下一章便会说到。
251251

@@ -328,7 +328,7 @@ packages/app 存放主要的公共业务代码,在 next 和 expo 中则直接
328328

329329
一个高性能的列表,可替代 RN 的 [FlatList](https://reactnative.dev/docs/flatlist),其中它还支持如下图布局。
330330

331-
![Untitled](https://img.kuizuo.cn/2024/0514104918-Untitled%204.png)
331+
![Untitled](https://img.kuizuo.me/2024/0514104918-Untitled%204.png)
332332

333333
[react-native-toast-message](https://github.com/calintamas/react-native-toast-message)
334334

@@ -460,7 +460,7 @@ export default function RootLayout() {
460460

461461
先看一张图,很多 app 都有这种类似的效果。
462462

463-
![](https://img.kuizuo.cn/2024/0514171652-Untitled.mp4)
463+
![](https://img.kuizuo.me/2024/0514171652-Untitled.mp4)
464464

465465
这种效果可以使用监听 ScrollY 配合 [react-native-reanimated](https://github.com/software-mansion/react-native-reanimated) 动画来实现,如果你不想自己实现也可以看看 [@codeherence/react-native-header](https://react-native-header.codeherence.com/docs/showcase),上图便来自此库。
466466

0 commit comments

Comments
 (0)