问题描述
import Highlighter from "monaco-jsx-Highlighter";
next.js 中的这个导入给出了“找不到文档”的错误。所以我尝试动态导入
import dynamic from "next/dynamic";
const Highlighter = dynamic(import("monaco-jsx-Highlighter"),{ ssr: false });
但是动态导入返回可加载组件。我检查了 next-github,看起来动态导入仅适用于组件。但是import Highlighter from "monaco-jsx-Highlighter"
。荧光笔实际上是一个类,需要初始化为:
const Highlighter = new Highlighter()
如何在没有动态导入的情况下在 next.js 中使用这个模块?
解决方法
试试 smt。像这样:
/ClientSideComponent.js
:
import Highlighter from "monaco-jsx-highlighter";
export default function ClientSideComponent(props){
// Write here the Highlighter logic.
return <>Highlighter</>;
}
/page.js
:
import dynamic from "next/dynamic";
const ClientSideComponent = dynamic(()=> import("./ClientSideComponent.js"),{ ssr: false });
function Page(props) {
return <ClientSideComponent />
}
,
问题似乎是荧光笔只有客户端代码,不能在带有 SSR 的服务器上运行。您可以将它定期导入到其他一些组件中,例如 HighlighterWrapper
,然后将 HighlighterWrapper
动态导入到您需要它的主组件中,然后它应该可以工作了。
import Highlighter from "monaco-jsx-highlighter";
export const HighligherWrapper = (props) => {
// Make instance here or outside
const highlighter = useMemo(() => new Highlighter(),[]);
// Do whatever you want here with highlighter instance
return <div>Something</div>;
}
export default HighligherWrapper;
import dynamic from "next/dynamic";
const HighligherWrapper = dynamic(()=> import("./HighligherWrapper"),{ ssr: false });
const Page() {
// Now you can use it in your code and it won't break SSR
return (
<div>
<HighligherWrapper />
</div>
);
}
,
我使用 vanilla 动态导入而不是 next.js 动态导入解决了这个问题。
let jsxHighlighter = null;
import("monaco-jsx-highlighter").then((allMonacoSyntaxHighlighter) => {
jsxHighlighter = allMonacoSyntaxHighlighter.default;
});