ReactJS Vite SSR ReferenceError: window is not defined - react-slick 库

ReactJS Vite SSR ReferenceError: window is not defined - react-slick library

提问人:Jolly Good 提问时间:9/25/2023 更新时间:9/25/2023 访问量:128

问:

当我使用 React Vite SSR 插件运行时,构建后出现以下错误:npm build

/<path>/node_modules/enquire.js/src/MediaQueryDispatch.js:14
if(!window.matchMedia) {
^
ReferenceError: window is not defined
    at new MediaQueryDispatch (/<path>/node_modules/enquire.js/src/MediaQueryDispatch.js:14:5)
    at Object.<anonymous> (/<path>/node_modules/enquire.js/src/index.js:2:18)

我确定它来自 react-slick 库,因为当我注释掉它时,它可以工作。如何解决这个问题?

reactjs vite 服务器端渲染 build-error react-slick

评论


答:

0赞 Jolly Good 9/25/2023 #1

我了解到问题是一些库,例如 react-slick,在撰写本文时,不支持服务器端渲染 (SSR)。该库要求窗口对象可用,但此对象在服务器端呈现的环境中不存在。

因此,解决方案是仅在客户端导入库(当窗口对象可用时)。做以下事情对我有用:

 const [Slider, setSlider] = useState(null);

  useEffect(() => {
    if (typeof window !== "undefined") {
      import("react-slick")
        .then((module) => {
          setSlider(() => module.default);
        })
        .catch((error) => {
          console.error("An error occurred when loading react-slick", error);
        });
    }
  }, []);

然后确保在它可用后使用它,如下所示:

{Slider ?  (<Slider ...> <div>..</div> </Slider>) : ("Loading ...")}

此外,将 noExternal 添加到 vite.config 文件有助于解决具有无效代码的库:

  import { defineConfig } from "vite";
  import ssr from "vite-plugin-ssr/plugin";

  export default defineConfig({
   ...other configurations..,
   ssr: {
    noExternal: ["react-slick"],
   },

})