next.js 在markdown-to-jsx中使用prism-react-renderer时获取`useState`错误

daolsyd0  于 2023-05-28  发布在  React
关注(0)|答案(1)|浏览(159)

使用nextjs-13
我想在markdown-to-jsx中使用prism-react-renderer来突出显示我的代码,我按照自己的理解编写了以下代码
page.tsx

import fs from "fs";
import Markdown from "markdown-to-jsx";
import matter from "gray-matter";
import { Highlight,themes} from "prism-react-renderer";
import React, { useState } from 'react';

const getPost = () => {
  const file = "posts/test.md";
  const content = fs.readFileSync(file, "utf8");
  const matterResult = matter(content);
  return matterResult;
};

const Page = () => {
  const post = getPost();
  return (
    <Markdown options={{
      wrapper: 'article', slugify: str => str,
      overrides: {
        pre: CodeBlock
      }
    }} className="markdown">{post.content}</Markdown>
  );
};

const CodeBlock = ({ children }: any) => {
  const code = children.props.children;
  const language = children.props.className?.replace("lang-", "").trim();

  return (
    <Highlight code={code} language={language} theme={themes.dracula}>
      {({ tokens, className, style, getLineProps, getTokenProps }) => (
        <pre className={className} style={style}>
          {tokens.map((line, i) => (
            <div key={i} {...getLineProps({ line })}>
              <span>{i + 1}</span>
              {line.map((token, key) => (
                <span key={key} {...getTokenProps({ token })} />
              ))}
            </div>
          ))}
        </pre>
      )}
    </Highlight>
    
    //! This is OK
    // <pre className={`language-${language}`}>
    //   <code>
    //     {code}
    //   </code>
    // </pre>
)}

export default Page;

但是我在运行pnpm run dev时出错

Unhandled Runtime Error

Error: (0 , import_react.useState) is not a function or its return value is not iterable
Call Stack
themeToDict_default
node_modules/.pnpm/prism-react-renderer@2.0.3_react@18.2.0/node_modules/prism-react-renderer/dist/index.js (2592:4)
useThemeDictionary
node_modules/.pnpm/prism-react-renderer@2.0.3_react@18.2.0/node_modules/prism-react-renderer/dist/index.js (2770:26)

我已经检查了提示符的代码,但我不知道
我尝试了这个演示与相同的版本,它的工作正常
有什么问题,我该如何解决?

tcomlyy6

tcomlyy61#

我也有同样的问题。虽然我不知道为什么。我知道,通过在呈现代码块的组件中使用use client,它为我解决了这个问题。
这可能是由于Next.js 13?当我找不到解决方案时,我尝试了另一种方法,这也导致了我的问题。但是this的答案让我也尝试了这里的解决方案。
因此,它可能与荧光笔需要在客户端运行的事实有关,并且由于Next.js 13默认为服务器,因此会出现此问题。

相关问题