【问题标题】:Next.js Webviewer Reference Error on build, window is not definedNext.js Webviewer 在构建时参考错误,未定义窗口
【发布时间】:2021-08-16 20:16:06
【问题描述】:

我正在创建一个网站,其中我的页面中有一个动态导入的 pdf 查看器。 代码在本地运行没有错误,但在“npm run build”命令期间我发现以下错误:

> Build error occurred
ReferenceError: window is not defined
    at Object.<anonymous> (C:\Users\GustavoMorilla\MyProfile\node_modules\@pdftron\webviewer\webviewer.min.js:1:224)
    at Object.g7Pv (C:\Users\Gustavo Morilla\MyProfile\.next\server\pages\resume\viewer.js:121:18)    
    at __webpack_require__ (C:\Users\Gustavo Morilla\MyProfile\.next\server\pages\resume\viewer.js:23:31)
    at Module.vRHl (C:\Users\Gustavo Morilla\MyProfile\.next\server\pages\resume\viewer.js:134:76) {  
  type: 'ReferenceError'
info  - Collecting page data .npm ERR! code ELIFECYCLE }

viewer.js 代码:

import React, { useRef, useEffect } from "react";
import WebViewer from "@pdftron/webviewer";

const Viewer = () => {
  const viewer = useRef(null);

  useEffect(() => {   
    WebViewer(
      {
        path: '/lib',
        initialDoc: "/pdf/GustavoMorilla.pdf",
      },
      viewer.current
    ).then(function (instance) {
      instance.setTheme("dark");
    });
  }, []);

  return (
    <div>      
        <div className="Viewer">  
        <div className="header flex justify-between">          
          <a>Resume</a>
          <a className="text-sm">You can download the file on "Settings" button</a>         
        </div>    
        <div className="Webviewer" ref={viewer}></div>
      </div>
    </div>
  );
};

export default Viewer;

resume.js 代码:

import SiteLayout from "../../components/SiteLayout";
import React from "react";
import dynamic from "next/dynamic";
const Viewer = dynamic(() => import("../resume/viewer.js"), { ssr: false });

export default function Resume({ resume }) {
  return (
    <div>
      <SiteLayout>    
      <div className="main w-screen">                         
          <Viewer />     
        </div>               
      </SiteLayout>
    </div>
  );
}

应该是与 SSR 或生命周期相关的东西……我不知道。

【问题讨论】:

  • 听起来你有一个服务器端(同构)(SSR)实现——当这段代码在服务器上运行时,它没有窗口对象——你需要阻止代码在服务器上运行这部分——我认为React.useEffect 在服务器上运行,如果我没记错的话

标签: javascript reactjs next.js


【解决方案1】:

window对象在服务端不存在,使用条件渲染解决。

import SiteLayout from '../../components/SiteLayout'
import React from 'react'
import dynamic from 'next/dynamic'
const Viewer = dynamic(() => import('../resume/viewer.js'), { ssr: false })

export default function Resume({ resume }) {
  return window ? (
    <div>
      <SiteLayout>
        <div className="main w-screen">
          <Viewer />
        </div>
      </SiteLayout>
    </div>
  ) : null
}

【讨论】:

  • 我们没有窗口的定义。当我尝试这段代码时,我们得到了参考错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
  • 2021-12-04
相关资源
最近更新 更多