Pourquoi est-ce que j'obtiens ReferenceError: self is not Defined lorsque j'importe la bibliothèque cliente ?
P粉214089349
P粉214089349 2023-10-21 12:53:53
0
1
591

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 ?

P粉214089349
P粉214089349

répondre à tous (1)
P粉958986070

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 suruseEffect内使用动态import()

Remplacezimport移至组件的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 Utiliseznext/dynamicssr: falseensemble

Créez un composant et ajoutez-y une logiquexterm.

// components/terminal-component import { Terminal } from 'xterm' function TerminalComponent() { const term = new Terminal() // Add logic around `term` return <> } export default TerminalComponent

Ensuite, 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 desnext/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 } )
    Derniers téléchargements
    Plus>
    effets Web
    Code source du site Web
    Matériel du site Web
    Modèle frontal
    À propos de nous Clause de non-responsabilité Sitemap
    Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!