reactjs - 引用错误 : document is not defined when refresh nextjs page

标签 reactjs webpack next.js server-side-rendering

我正在尝试使用 React for Nextjs 9.4 创建一个简单的 UI 库,这就是我在做什么

// input.js in React UI Lib

import React from "react";
import styled from "./input.module.scss";

const Input = React.forwardRef((props, ref) => (
  <>
    {props.label && <label className={styled.label}>{props.label}</label>}
    <input className={styled.input} {...props} ref={ref} />
  </>
));

export default Input;

并为简单起见制作了导出所有模块的索引
// app.js the index file for the lib

import PrimaryButton from "./components/button/primaryButton";
import TextInput from "./components/input/input";
import PasswordInput from "./components/passwordInput/password";
import CheckBox from "./components/checkbox/checkbox";

export {
  PrimaryButton,
  TextInput,
  PasswordInput,
  CheckBox
};

这也是我为 SSR Next 构建的 webpack 配置
const path = require("path");
const autoprefixer = require("autoprefixer");
const nodeExternals = require("webpack-node-externals");

const CSSLoader = {
  loader: "css-loader",
  options: {
    modules: "global",
    importLoaders: 2,
    sourceMap: false,
  },
};

const CSSModlueLoader = {
  loader: "css-loader",
  options: {
    modules: true,
    importLoaders: 2,
    sourceMap: false,
  },
};

const PostCSSLoader = {
  loader: "postcss-loader",
  options: {
    ident: "postcss",
    sourceMap: false,
    plugins: () => [autoprefixer()],
  },
};

const SassLoader = {
  loader: "sass-loader",
  options: {
    // Prefer `dart-sass`
    implementation: require("sass"),
  },
};

module.exports = {
  target: "node",
  entry: "./src/app.js",
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "bundle.js",
    chunkFilename: "[id].js",
    publicPath: "",
    library: "",
    libraryTarget: "commonjs",
  },
  externals: [nodeExternals()],
  resolve: {
    extensions: [".js", ".jsx"],
  },
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        loader: "babel-loader",
        exclude: /node_modules/,
      },
      {
        test: /\.(sa|sc|c)ss$/i,
        exclude: [/node_modules/, /\.module\.(sa|sc|c)ss$/i],
        use: ["style-loader", CSSLoader, PostCSSLoader, SassLoader],
      },
      {
        test: /\.module\.(sa|sc|c)ss$/i,
        exclude: /node_modules/,
        use: ["style-loader", CSSModlueLoader, PostCSSLoader, SassLoader],
      },
      {
        test: /\.(png|jpe?g|gif)$/,
        loader: "url-loader?limit=10000&name=img/[name].[ext]",
      },
    ],
  },
};

1-i 构建

2-在 npm 上发布

3-在 Nextjs 中导入

然后一切正常,但问题是当我在开发过程中尝试刷新(F5)页面时出现错误
Unhandled Runtime Error
ReferenceError: document is not defined

我该如何解决?

最佳答案

  • 尝试仅在客户端呈现组件,您可以这样做:
    typeof window !== 'undefined' ? <Component /> : null
  • 您正在使用 style-loader在你的 webpack 配置中,它将 inject styles使用 document.createElement 进入头部在 SSR 中不可用,您可以选择其他选项,如 mini-css-extract-plugin
  • 关于reactjs - 引用错误 : document is not defined when refresh nextjs page,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62322187/

    相关文章:

    git - 如何将大型 NextJS 项目推送到 GitHub

    javascript - 使用 react 按时间间隔更改图像

    webpack - 从 v4 替换 Webpack v5 中的进程的 polyfill

    javascript - Next.js - bundle 大小太大 (~3MB)

    reactjs - Routes.push() 在 NextJS 上没有按预期工作

    javascript - React useState Hook 是附加值而不是覆盖

    javascript - Auth0 未重定向到指定的 URL (React)

    javascript - 如何设置 React 渲染组件的样式

    reactjs - 为什么在函数内部调用时会得到 'Error: Invalid hook call'?

    php - laravel 6 身份验证 "npm run dev not working"