programing

반응 - "localStorage is not defined" 오류가 표시됨

cafebook 2023. 2. 22. 23:11
반응형

반응 - "localStorage is not defined" 오류가 표시됨

제 웹사이트 SEO를 메타 태그로 친근하게 만들려고 합니다.응용 프로그램에 서버 측 렌더링을 구현하고 있습니다.그 후, 다음의 에러가 표시됩니다.

ReferenceError: localStorage가 정의되지 않았습니다.

해결 방법을 알려주세요.

나의package.json:

{


 "main": "server.js",
 "scripts": {
  "start-dev": "NODE_ENV=development webpack -w & NODE_ENV=development node server.js",
  "test": "echo \"Error: no test specified\" && exit 1"
 },
 "keywords": [],
 "author": "",
 "license": "ISC",
 "dependencies": {
  "axios": "^0.18.0",
  "express": "^4.15.3",
  "firebase": "^4.12.1",
  "html2canvas": "^1.0.0-alpha.12",
  "react": "^16.2.0",
  "react-adsense": "0.0.5",
  "react-dom": "^16.2.0",
  "react-facebook-login": "^4.0.1",
  "react-google-login": "^3.2.1",
  "react-meta-tags": "^0.3.0",
  "react-router-dom": "^4.2.2",
  "react-router-match-as-promised": "^1.0.5",
  "react-scripts": "1.1.1",
  "react-share": "^2.1.1",
  "react-slick": "^0.22.3"
 },
 "devDependencies": {
  "autoprefixer": "^7.1.2",
  "babel-core": "^6.25.0",
  "babel-loader": "^7.1.1",
  "babel-preset-es2015": "^6.24.1",
  "babel-preset-react-app": "^3.1.2",
  "babel-preset-stage-0": "^6.24.1",
  "css-loader": "^0.28.4",
  "extract-text-webpack-plugin": "^2.1.2",
  "file-loader": "^0.11.2",
  "postcss-loader": "^2.0.6",
  "webpack": "^3.1.0",
  "webpack-node-externals": "^1.7.2"
 }
}

모든 페이지에서 일반적으로 사용되는 메타 태그입니다.Home.js

<code>
import React, { Component } from 'react';
import axinst from '../common';
import {TabBox,TabBox2,TabBox3} from '../common/tabbox';
import Ads  from '../common/ads';
import SubscribeFrm from '../common/subscribefrm';
import MetaTags from 'react-meta-tags';
import AdSense from 'react-adsense';
import Loader from '../common/loader';

class Home extends Component {
  constructor(props) {
    super(props);
  }

  state = {
    header:[],
    otherSports:[],
    wizztalk:[],
    sports:[],
    isProgress:'',
    activeCat: '',
    metaTitle:'',
    metaDesc:'',
    metaKey:''
  }

  componentDidMount(){


    // axinst.get('/home')
    this.setState({isProgress:true});
    axinst.get('/home').then(response => {
      this.setState({isProgress:false});
      const header = response.data.data.Header;
      const sports = response.data.data.Sports;
      const otherSports = response.data.data.OtherSports;
      const wizztalk = response.data.data.Wizztalk;
      const metaTitle = response.data.data.metaTitle;
      const metaDesc = response.data.data.metaDesc;
      const metaKey = response.data.data.metaKeyword;
      this.setState({header});
      this.setState({sports});
      this.setState({otherSports})
      this.setState({wizztalk});
      this.setState({metaTitle});
      this.setState({metaDesc});
      this.setState({metaKey});
    }).catch(function (error) {
      // console.log(error);
      // console.log('error');
    });
  }

  render() {
    const hD = this.state.header;
    const sport = this.state.sports;
    return (
    <div id="maincontent">
        <MetaTags>
          <title>{this.state.metaTitle}</title>
          <meta name="title" content={this.state.metaTitle} />
          <meta name="keywords" content={this.state.metaKeyword} />
          <meta name="description" content={this.state.metaDesc} />
          <meta name="og:description" content={this.state.metaDesc} />
          <meta name="og:title" content={this.state.metaTitle} />
          <meta name="og:image" content={process.env.PUBLIC_URL +"/images/logo.png"}/>
        </MetaTags>
</code>

서버에서 렌더링할 때 브라우저가 없으므로 localStorage를 포함하여 브라우저에서 제공하는 모든 API에 액세스할 수 없습니다.

서버와 클라이언트(브라우저) 양쪽에서 동작하는 JavaScript 코드에서는, 통상, 에 대해서,if창이 정의되어 있는지 여부를 확인하는 절입니다."윈도"는 브라우저에서 제공하는 모든 API에 대해 브라우저에서 제공하는 루트 객체입니다.

예:

if (typeof window !== 'undefined') {
    console.log('we are running on the client')
} else {
    console.log('we are running on the server');
}

당신의 경우, 전화를 걸려고 합니다.localStorage이렇게 해서if예를 들어 다음과 같습니다.

if (typeof window !== 'undefined') {
    localStorage.setItem('myCat', 'Tom');
}

이 오넬라이너가 해줬어요

const checkout = typeof window !== 'undefined' ? localStorage.getItem('checkout') : null

에 폴리필을 추가할 수 있습니다.즉, 당신의 어딘가에서index.js:

if (!window) {
    require('localstorage-polyfill');
}

저 같은 경우에는useEffectlocalStorage를 사용하기 전에 페이지가 로드될 때까지 기다립니다.

컴포넌트 로직이 절대적으로 다음 값에 의존할 경우 이는 보다 신뢰할 수 있는 접근법입니다.lsVar조건부로 무언가를 렌더링합니다.

    const Component = () => {
        if (typeof window === "undefined") return null;

        const lsVar = localStorage.getItem("lsVar");

        // component logic
        
        return (<></>);
    }

언급URL : https://stackoverflow.com/questions/52474208/react-localstorage-is-not-defined-error-showing

반응형