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

如何解决Storyblok+Next.js15中‘Component page不存在’错误

问题

按照Storyblok React SDK v4官方文档编写代码,已在storyblokInit的components对象中配置了page组件,但始终触发服务器错误:Component page doesn't exist.。已尝试查阅多份文档、重启开发服务器、重装相关依赖包,问题仍未解决。

以下是项目相关文件代码:

src/lib/storyblok.ts

import Page from '@/components/Page'
import { apiPlugin, storyblokInit, getStoryblokApi } from '@storyblok/react'

storyblokInit({
  accessToken: process.env.NEXT_PUBLIC_STORYBLOK_API_KEY,
  use: [apiPlugin],
  apiOptions: {
    region: 'us',
  },
  components: {
    page: Page,
  },
})

export { getStoryblokApi }

src/app/layout.tsx

import StoryblokProvider from "@/components/StoryblokProvider";
import "./globals.css";

export default function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode;
}>) {
  return (
    <StoryblokProvider>
      <html lang="en">
        <body>
          {children}
        </body>
      </html>
    </StoryblokProvider>
  );
}

src/components/StoryblokProvider.jsx

'use client';

import { getStoryblokApi } from '@/lib/storyblok';

export default function StoryblokProvider({ children }) {
  getStoryblokApi();
  return children;
}

src/app/page.tsx

import { getStoryblokApi } from '@/lib/storyblok';
import { StoryblokStory } from '@storyblok/react/rsc';

export default async function Home() {
  const { data } = await fetchData();
 
  return (
    <div>
      <StoryblokStory story={data.story} />
    </div>
  );
}
 
export async function fetchData() {
  const storyblokApi = getStoryblokApi();
  return storyblokApi.get('cdn/stories/home', { version: 'draft' });
}

src/components/Page.jsx

import { storyblokEditable, StoryblokServerComponent } from '@storyblok/react/rsc';
 
const Page = ({ blok }) => (
  <main {...storyblokEditable(blok)}>
    {blok.body.map(nestedBlok => (
      <StoryblokServerComponent blok={nestedBlok} key={nestedBlok._uid} />
    ))}
  </main>
);
 
export default Page;

排查与解决方法

1. 严格匹配组件名称与Storyblok后台Handle

Storyblok组件匹配区分大小写,确认你在Storyblok后台创建的页面组件的handle是小写的page。如果后台组件handle是Page或其他形式,需要同步修改storyblokInit中components的键名,保证完全一致。

2. 确保storyblokInit在服务器端正确初始化

storyblokInit需要在服务器组件环境中执行才能正确注册组件。可以在src/app/layout.tsx中直接引入@/lib/storyblok,确保初始化逻辑在服务器端运行:

import '@/lib/storyblok'; // 添加这行
import StoryblokProvider from "@/components/StoryblokProvider";
import "./globals.css";

export default function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode;
}>) {
  return (
    <StoryblokProvider>
      <html lang="en">
        <body>
          {children}
        </body>
      </html>
    </StoryblokProvider>
  );
}

3. 修复StoryblokProvider的实现

当前自定义的StoryblokProvider不符合RSC场景要求,需要替换为SDK提供的官方StoryblokProvider(从@storyblok/react/rsc导入):

'use client';

import { StoryblokProvider } from '@storyblok/react/rsc';

export default function StoryblokProviderWrapper({ children }) {
  return <StoryblokProvider>{children}</StoryblokProvider>;
}

这个客户端组件负责管理编辑模式所需的上下文,确保客户端与服务器端的组件状态同步。

4. 验证组件导入路径与文件名一致性

检查src/lib/storyblok.ts中Page组件的导入路径是否正确,确认src/components/Page.jsx文件名的大小写与导入语句匹配(比如文件是page.jsx则导入路径要改成@/components/page)。

5. 确认SDK版本为v4及以上

运行以下命令检查@storyblok/react版本:

npm list @storyblok/react

如果版本低于v4,升级到最新版本:

npm install @storyblok/react@latest

内容的提问来源于stack exchange,提问作者J-vbrc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 01:03:13