You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Astro项目中两种数据获取方式的行为差异原因

两种数据加载方式的行为差异解析

代码场景回顾

方式一:每次调用函数获取数据

api.js 代码:

//api.js
export const fetchKnowledgeBases = async () => {
    const response = await fetch(`${API_BASE_URL}/accounts/${accountId}/knowledge-bases/${kbId}`)
    if (!response.ok) {
        throw new Error('Failed to fetch knowledge bases')
    }
    await sleep(7000)
    const data = await response.json()
    return data
}

const knowledgeBase = await fetchKnowledgeBases()

export {knowledgeBase}

index.astro 代码:

---
import {fetchKnowledgeBases} from '../../../services/api'

const a = await fetchKnowledgeBases()
console.log(a)
---

<Homepage />

这种方式下,页面刷新时数据获取耗时7秒。

方式二:直接导入预获取的缓存数据

修改后的 index.astro 代码:

---
import {knowledgeBase} from '../../../services/api'

console.log(knowledgeBase)
---

<Homepage />

这种方式下,页面刷新瞬间加载数据,仅在执行npm run dev时获取一次数据,后续刷新用缓存。

行为差异原因

  • 方式一:每次页面刷新都会重新执行数据请求
    Astro组件的前置代码块(---包裹的部分)在每次页面请求/刷新时都会重新执行。当你导入fetchKnowledgeBases函数并调用它时,每次刷新都会触发新的fetch请求,加上强制的7秒sleep等待,自然每次都要等7秒才能拿到数据。

  • 方式二:模块级别的数据预获取,结果被缓存
    在api.js中,const knowledgeBase = await fetchKnowledgeBases()属于模块顶层的异步代码。Node.js(Astro的开发/构建环境基于Node.js)会在模块第一次被导入时执行这段代码,然后将导出的knowledgeBase结果缓存起来。后续任何地方再次导入这个模块时,都会直接复用已缓存的结果,不会重新执行数据请求和等待逻辑——这就是为什么你只有在启动npm run dev时会触发一次请求,之后刷新页面都是瞬间加载缓存好的数据。

内容的提问来源于stack exchange,提问作者Nghĩa Phạm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 02:57:06