サーバー側のレンダリングを行っている場合、グローバル ウィンドウ オブジェクトが未定義になる可能性が高くなります。これは、クライアントが理解できるものにすぎないためです。
注:最初に、プロジェクトを開始すると、DOM の完全な文字列がレンダリングされます (この時点ではサーバー側であるため認識されませんがwindow
、クライアント側のコードを使用して再レンダリングされます)。ウィンドウオブジェクトが利用可能になります!
この場合、私が使用している回避策があります。これは、webpack プラグイン用に用意したものです。
new webpack.DefinePlugin({
'process.env.NODE_ENV': isDevelopment ? '"development"' : '"production"',
'process.env.BROWSER': JSON.stringify(true),
__DEV__: isDevelopment
}),
したがって、サーバー側であるかのように定義され、クライアント側でレンダリングが完了した場合process.env.BROWSER
に定義されるため、私は有利に使用します。undefined
true
サーバー側にウィンドウ オブジェクトがない場合、すべてが機能しなくなるため、これを追加できます。
const mySpecialWindowFunction = () => {
/* START HACK */
if (!process.env.BROWSER) {
global.window = {}; // Temporarily define window for server-side
}
/* END HACK */
return /msie [6-9]\b/.test(window.navigator.userAgent.toLowerCase());
};
そうすれば、コンソールが悲鳴を上げることも、サーバー側のレンダリングを停止することもなく、輝かしい一日を続けることができます! これは少しハッキーであることは認めざるを得ませんが、やりたいことはサーバー側に最初の DOM 文字列をレンダリングさせ、クライアント側に引き継がせることだけなので、仕事は完了です。
また、注: window を空のオブジェクトとして設定することについて心配する必要はありません。クライアント側のレンダリングが完了すると、通常の状態に戻ります。