gl-reactを使ってGLSL
でリアルタイムな画像処理がしたい。
ace.jsという有名なコードエディタがあるので使いたいですが、React
でそのまま使うとなると難しそう。
バージョンは最新ではないもののReact
コンポーネント化したreact-aceというものがあったので、その使い方とnext.js
で使う時の注意を覚書き。
やりたいこと
GLSL
を書くと画像に反映させたい。
これはtextarea
でも可能ですが見栄えは悪いし書きにくいです。
使い方
モジュールを2つ追加します。
1 2 3 |
> npm install react-ace ace-builds or > yarn add react-ace ace-builds |
next.js
でサンプルをそのまま使おうとするとエラーになりました。
ReferenceError: window is not defined
import
する段階でwindow
を使おうとしてエラーが起きているようです。
最初はDOM
構築前にwindow
がないからダメなやつかなと思ったんですが、React
コンポーネントでそこを考慮してないことはない気がする。
動作を見るとnext
のサーバーサイドレンダリングでエラーが起きている気がする。
import
の代わりにrequire
を使ってクライアント側だけで呼び出すようにします。
1 2 3 4 5 6 7 8 9 |
const Editor = (props: any) => { if (typeof window !== "undefined") { const Ace = require("react-ace").default; require("ace-builds/src-noconflict/mode-glsl.js"); require("ace-builds/src-noconflict/theme-twilight"); return <Ace {...props} />; } return null; }; |
言語をglsl
にして見た目を好みなものに変更。
1 2 3 4 5 6 7 8 9 10 11 12 |
const [glsl, setGlsl] = useState(``); ... <Editor mode="glsl" theme="twilight" value={glsl} onChange={(v: any) => setGlsl(v)} name="ace_editor" editorProps={{ $blockScrolling: true }} style={{ width: "100%" }} /> |
モード(言語)とテーマの一覧はこちら。大体ある気がする。
これでいい感じになりました。