web-dev-qa-db-ja.com

`window`、` localStorage`を処理するサーバーサイドレンダリングに反応する

これらのブラウザグローバル変数をwindowまたはlocalStorageを使用するReactコンポーネント)をサーバー側でレンダリングする場合、常に追加する必要があります

if (typeof localStorage !== 'undefined') { // then do stuff }

これらの 'localStorage is notdefined'エラーを取り除くために。

これに対する他のまともな解決策はありますか?

編集私のユースケース

  1. windowは、innerwitdthのような属性と、resizeのような生のブラウザイベントを追加するためのものです。
  2. localStorageはJWTトークンを保存するためのものです
14
xiaofan2406

サーバーサイドレンダリングは、アプリケーションがユニバーサルであることを意味します(同形として知られています)。ユニバーサルアプリケーションの場合、コードは有効であり、すべての環境でエラーなしで機能する必要があります。したがって、重要なルールはすべての環境で1つの同じプログラミングインターフェイスを使用するです。

言い換えると、ユニバーサルコードを作成する一般的な方法は3つあります。

  • 既存のインターフェースを使用。ほとんどの環境では、数学演算、テキストを処理するコードなど、まったく同じ基本コードを実行できます。ただし、インターフェイスのプログラミングが難しい場合もあります。たとえば、UIアプリケーションの場合、データをHTTP Cookieに保存でき、ブラウザとNodeJSは両方をサポートします。

  • インターフェースエミュレーション。環境がプログラミングインターフェイスをサポートしていない場合は、それを作成する必要があります。たとえば、NodeJSの場合、サーバー側でDOMAPIを使用するようにJSDOMに要求できます。

  • コード実行を無視。アプリケーションは、特定の環境でのみ指定されたコードを実行できます。したがって、それを除外することができます。たとえば、SSRを使用するUIアプリケーションの場合、サーバー側でGAウィジェットを実行する必要はありません。

あなたの場合には、JSDOM(エミュレーション方法)とHTTP Cookie(既存のインターフェース方法)を使用してください。

1
ufocoder