Je suis bloqué en essayant de créer un composant xterm React dansNext.jsparce que je n'arrive pas à me remettre d'un message d'erreur que je n'ai jamais reçu auparavant.
J'essaie d'importer un module client npm appeléxtermmais si j'ajoute la ligne d'importation, l'application plante.
import { Terminal } from 'xterm'
Erreur de lecture服务器错误... ReferenceError: self is not DefinedAffichez ensuite ce code commeSource
module.exports = require("xterm");
D'après certaines recherches que j'ai effectuées, cela est lié à Webpack et cela pourrait être utile si quelque chose comme ceci était fait :
output: { globalObject: 'this' }
Savez-vous comment résoudre ce problème ?
La raison pour laquelle cette erreur se produit est que la bibliothèque nécessite l'API Web pour fonctionner et lorsqueNext.js pré-rend la page côté serveur.
Dans votre cas,
xterm尝试访问服务器上不存在的window对象。解决方案是避免在服务器上加载xtermet importez-le dynamiquement pour qu'il ne soit chargé que côté client.Dans Next.js, il existe plusieurs façons d'y parvenir.
#1 sur
useEffect内使用动态import()Remplacez
import移至组件的useEffectpuis importez dynamiquement la bibliothèque et ajoutez-y une logique.useEffect(() => { const initTerminal = async () => { const { Terminal } = await import('xterm') const term = new Terminal() // Add logic with `term` } initTerminal() }, [])#2 Utilisez
next/dynamic与ssr: falseensembleCréez un composant et ajoutez-y une logique
xterm.// components/terminal-component import { Terminal } from 'xterm' function TerminalComponent() { const term = new Terminal() // Add logic around `term` return <>> } export default TerminalComponentEnsuite, importez dynamiquement le composant lorsqu'il est utilisé.
import dynamic from 'next/dynamic' const TerminalComponent = dynamic(() => import('/components/terminal-component'), { ssr: false }) Commealternative, vous pouvez ajouter une logique directement lorsque vous utilisez des
next/dynamicbibliothèques d'importation dynamique pour éviter de générer des fichiers supplémentaires.import dynamic from 'next/dynamic' const Terminal = dynamic( { loader: () => import('xterm').then((mod) => mod.Terminal), render: (props, Terminal) => { const term = new Terminal() // Add logic with `term` return <>> } }, { ssr: false } )