[英]Cannot import module in nextjs
我尝试将缩放 websdk 模块导入下一个 js,但它失败了,因为 window object 未定义。
我所做的只是尝试导入 websdk 模块,但发生了这个错误
我将 nextjs v12 与 create-next-app 一起使用,我的代码非常简单。 这是我的pages/index.js
import { ZoomMtg } from '@zoomus/websdk';
const Page = () => {
const handleClick = async () => {
}
return (
<main>
{/* get meeting number and role here (and password maybe) */}
<button onClick={handleClick}>Join meeting</button>
{/* <div>{meetingUrl && <ZoomWindow url={meetingUrl} />}</div> */}
</main>
)
}
export default Page
websdk package 坏了还是什么?
请记住,NextJS 在浏览器和服务器上都运行。 在服务器端渲染期间, window
。 您可以使用动态导入仅导入浏览器上的一些依赖项,其中将定义 window。
https://nextjs.org/docs/advanced-features/dynamic-import
这是NextJS
的示例
import dynamic from 'next/dynamic'
const DynamicComponentWithNoSSR = dynamic(
() => import('../components/hello3'),
{ ssr: false }
)
function Home() {
return (
<div>
<Header />
<DynamicComponentWithNoSSR />
<p>HOME PAGE is here!</p>
</div>
)
}
export default Home
你可以做同样的事情,但你的依赖。
编辑:我认为 ZoomMtg 是一个组件。 文档中的第一个示例更接近 ZoomMtg 所需的内容。
这样的事情应该可以解决问题:
const [zoomMtg, setZoomMtg] = useState(null)
useEffect(() => {
( async () => {
if(typeof window !== "undefined"){
const {ZoomMtg} = (await import('@zoomus/websdk'))
setZoomMtg(ZoomMtg)
}
})()
}, [])
然后只需确认zoomMtg
在渲染组件之前定义了 state 变量。 {!!zoomMtg && <YourComponent />
注意:如果您可以控制YourComponent
模块,那么更好的选择是将ZoomMtg
的导入移动到此文件并正常导入。 然后使用 nextjs dynamic
语法导入YourComponent
。
我在导入模块后在 nextjs 中遇到了同样的问题,它会给出这样的错误 - SyntaxError: Cannot use import statement outside a module。 如果你想在 nextjs 中不工作的情况下使用模块,这是最好的解决方案,如果模块不工作,这不是问题,只需配置设置 -
npm i next-compose-plugins
npm i next-transpile-modules
const withPlugins = require("next-compose-plugins");
const withTM = require("next-transpile-modules")([
"@project-serum/sol-wallet-adapter",
"import another modules if not working..."
]);
module.exports = withPlugins([withTM], {
pageExtensions: ["mdx", "md", "jsx", "js", "tsx", "ts", "cjs", "mjs"],
distDir: "build",
basePath: "",
and config other...
}
在 next.config.js 中进行此设置后,您可以使用模块假设在组件中创建一个新文件 demo.js,然后它将工作。
import Wallet from "@project-serum/sol-wallet-adapter";
我测试了这段代码,它可以工作:
const Page = () => {
const handleClick = async () => {
alert("ok")
}
return (
<main>
{/* get meeting number and role here (and password maybe) */}
<button onClick={handleClick}>Join meeting</button>
{/* <div>{meetingUrl && <ZoomWindow url={meetingUrl} />}</div> */}
</main>
)
}
export default Page
检查您的@zoomus/websdk
库,然后
npm i
在您的文件夹中re-run your project
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.