next.jsのウィンドウが定義されていない
2022-02-21 10:43:13
1. 問題の説明
SSRにnext+expressを使用、リッチテキストエディタ導入
braft-editor
(なぜバックエンドのインターフェイスのレンダリングにSSRを使っているのかはわかりません。) コードは以下のとおりです。
import React from 'react'
import BraftEditor from 'braft-editor'
import 'braft-editor/dist/index.css'
export default class EditorDemo extends React.
state = {
editorState: BraftEditor.createEditorState(null)
async componentDidMount}
async componentDidMount () {
}
submitContent = async () => {
}
handleEditorChange = (editorState) => {
this.setState({ editorState })
}
render () {
const { editorState } = this.state
return (
<div className="my-component">
<BraftEditor
value={editorState}
onChange={this.handleEditorChange}
onSave={this.submitContent}
/>
</div>
)
}
}
以下のエラーが発生しました。
(ReferenceError): window is not defined
これはわかりやすいですね、ssrを使ってページをレンダリングすると、reactのライフサイクルである
render()
render とその前のステージはコンポーネントを実際の dom ノードとしてレンダリングしないため、window オブジェクトを取得できません。
componentDidMount(){
console.log( window ! == undefined ) //true
}
しかし、書き込みは禁止されています。
ES6仕様では、import/exportは現在の実行環境のトップレベルスコープでのみ宣言でき、importコマンドはモジュール全体の先頭に昇格されます
This is not allowed to be written ~
componentDidMount(){
import BraftEditor from 'braft-editor'
}
2. 解決方法
next.jsのドキュメントには、モジュールを動的にインポートする方法が記載されています。
'next/dynamic'
その
import dynamic from 'next/dynamic'
const DynamicPublish = dynamic(
import('. /publish'),
{
ssr: false //this should be added to disable the use of SSR
}
)
export default () => <DynamicPublish />
すると、大丈夫、リッチテキストエディタが正常に動作するようになりました。
関連
-
[解決済み】JS ファイルが net::ERR_ABORTED 404 (Not Found) を取得する)
-
[解決済み] 匿名のdefine()モジュールの不一致
-
[解決済み】NodeJs 。TypeError: require(...) は関数ではありません。
-
[解決済み】オリジン "null "のフレームがクロスオリジンフレームにアクセスするのをブロック - chrome
-
[解決済み] Node.js 7.5で「await Unexpected identifier」が発生する。
-
[解決済み] "ns_error_dom_bad_uri "です。制限されたURIへのアクセスが拒否されました"
-
[解決済み] Rails - JavaScriptランタイムが見つかりませんでしたか?
-
[解決済み] Jquery validation plugin - TypeError: $(...).validate は関数ではありません。
-
[解決済み] JavaScript/jQueryでリダイレクト時にPOSTデータを送信する?[重複)。
-
[解決済み] AngularJSのng-repeatは、空のリストのケースを処理します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ローカルのpackage.jsonは存在するが、node_modulesが見つからない
-
[解決済み】JQueryの問題 "TypeError: $.getJSON is not function".
-
[解決済み] JSON の位置 4 に予期しないトークン < があります。
-
[解決済み] ぼかしとフォーカスアウトの違いは?重複
-
[解決済み] setAttributeで設定されたonclickプロパティがIEで機能しないのはなぜですか?
-
[解決済み] Mocha で javascript をテストする - テストをデバッグするために console.log を使用するにはどうすればよいですか?
-
[解決済み] babel-loader jsx SyntaxError: 予期しないトークン [重複] が発生しました。
-
[解決済み] JavaScript - ReferenceError: WebSocket は定義されていません。
-
[解決済み] React Nativeの固定フッター
-
[解決済み] 迷走する開始タグスクリプト