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

如何在SolidJS中缓存服务器响应?现有方案存在局限

在SolidJS中实现服务器响应缓存

我需要在SolidJS中实现服务器响应缓存,当前切换/users与/users/:id页面时,每次都会重复发起服务器请求。

已尝试的方案:提取全局资源

我将资源提取至/api/users.api.ts文件,实现了仅在应用初始化时发起一次请求,还能在该文件中管理重新获取逻辑,相关代码如下:

/api/users.api.ts代码:

export const [usersResource, usersResourceAction] = createResource(getUsers);

修改后的/routes/users/index.tsx:

export default () => {
  return (
    <div>
      <h1>Users list</h1>

      <ul>
        <For each={usersResource()}>
          {(user) => <A href={`/users/${user.id}`}>{user.name}</A>}
        </For>
      </ul>
    </div>
  );
};

修改后的/routes/users/[id].tsx:

export default () => {
  const params = useParams();
  return (
    <div>
      <div>User {params.id}</div>

      <h2>See all users</h2>
      <ul>
        <For each={usersResource()}>{(user) => <li>{user.name}</li>}</For>
      </ul>
    </div>
  );
};

新增用户时的重新获取逻辑:

export async function addUser(name: string) {
  const body = JSON.stringify({
    name,
  });
  const req = await fetch("http://localhost:8080/users", {
    method: "POST",
    body,
    headers: {
      "Content-Type": "application/json",
    },
  });
  if (req.ok) {
    usersResourceAction.refetch()
  }
  return req.json();
}

方案局限

该方案存在局限:无法在/api/users.api.ts文件中创建带signal的资源,比如不能在组件外使用useParams:

const params = useParams(); // 错误:不能在组件外使用useParams
export const [getUserById, getUserByIdActions] = createResource(params.id, getOneUser);

替代库尝试

我还尝试过solid-cache库,但它不支持更新单个缓存键(比如新增用户时更新users键)。

原始页面代码

/routes/users/index.tsx原代码:

export default () => {
  const [users] = createResource(getUsers);
  return (
    <div>
      <h1>Users list</h1>

      <ul>
        <For each={users()}>
          {(user) => <A href={`/users/${user.id}`}>{user.name}</A>}
        </For>
      </ul>
    </div>
  );
}

/routes/users/[id].tsx原代码:

export default () => {
  const params = useParams();
  const [users] = createResource(getUsers);
  return (
    <div>
      <div>User {params.id}</div>

      <h2>See all users</h2>
      <ul>
        <For each={users()}>{(user) => <li>{user.name}</li>}</For>
      </ul>
    </div>
  );
};

内容的提问来源于stack exchange,提问作者Dmitry Lavrov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:45:22