当我导入客户端库时,为什么会出现 ReferenceError: self is not Defined ?

2023-12-03

试图创建一个xterm反应组件Next.js我陷入了困境,因为我无法克服以前从未收到过的错误消息。

我正在尝试导入一个名为的 npm 客户端模块xterm,但是如果我添加导入行,应用程序就会崩溃。

import { Terminal } from 'xterm'

错误读取Server Error... ReferenceError: self is not defined然后将这段代码显示为Source

module.exports = require("xterm");

根据我所做的一些研究,这与 Webpack 有关,如果执行以下操作可能会有所帮助:

output: {
  globalObject: 'this'
}

你知道如何解决这个问题吗?


发生错误的原因是该库需要 Web API 才能工作,而在以下情况下这些 API 不可用Next.js 预渲染页面在服务器端。

就你而言,xterm尝试访问window服务器上不存在的对象。解决方案是避免加载xterm在服务器上并动态导入它,以便它仅在客户端加载。

在 Next.js 中,有多种方法可以实现此目的。


#1 使用动态import() inside useEffect

移动import到你的组件的useEffect,然后动态导入库并在其中添加您的逻辑。

useEffect(() => {
    const initTerminal = async () => {
        const { Terminal } = await import('xterm')
        const term = new Terminal()
        // Add logic with `term`
    }
    initTerminal()
}, [])

#2 使用next/dynamic with ssr: false

创建一个组件,在其中添加xterm logic.

// components/terminal-component
import { Terminal } from 'xterm'

function TerminalComponent() {
    const term = new Terminal()
    // Add logic around `term`
    return <></>
}

export default TerminalComponent

然后在使用时动态导入该组件。

import dynamic from 'next/dynamic'

const TerminalComponent = dynamic(() => import('<path-to>/components/terminal-component'), {
    ssr: false
})

As an 选择,您可以在动态导入库时直接添加逻辑next/dynamic以避免有额外的文件。

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
    }
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我导入客户端库时,为什么会出现 ReferenceError: self is not Defined ? 的相关文章

随机推荐