動作確認
現在私が使用しているのはnode v12.18.4
npm v6.14.6
となっています。現在(2020/10/30時点)nodejsの推奨版はv14.15.0LTSとなっているようですが、とりあえずv12のほうでやっていこうかと思います。
Reasonを使うためにはbs-platform
が必要になりますので、そちらをインストールします。
$ npm install --global bs-platform
次に以下のようにすると、ReasonReactのプロジェクトの見本が出来上がります。
$ npx bsb -init hello -theme react-hooks
Making directory hello
$ npm install && npm start
これで諸々の準備が行われます。react-hooksは私のような入門者にはscaffolding(足場)となるだろうと、公式ドキュメントにあるので各ファイルを参考に学んでいこうと思います。
教科書となるべくテンプレートがどのようなものか見てみるには、別のタブにて
$ npm run server
これで正常に動作したことを確認できると思います。
Hello world
現在、見本のままだと、以下のようなディレクトリ構成になっていると思います。
timer-app/
lib/
bs/
...
node_modules/
...
src/
BlinkingGreeting/
FetchedDogPictures/
ReasonUsingJSUsingReason/
ReducerFromReactJSDocs/
ExampleStyles.bs.js
ExampleStyles.re
Index.bs.js
Index.re
.gitignore
.merlin
bsconfig.json
index.html
indexProduction.html
package.json
package-lock.json
README.md
UNUSED_webpack.config.js
watcher.js
まずIndex.re
を見てみると、コメントにEntry pointとある。次にコードを見ていくと、
[@bs.val] external document: Js.t({..}) = "document";
とある。[@bs.val] external ...
はJavascriptのグローバルな変数とバインディングする時に使うというようなことが書かれていたので、JavaScriptのdocumentを使う際はこのように各必要があるようです。
次のコードでは
let style = document##createElement("style");
document##head##appendChild(style);
style##innerHTML #= ExampleStyles.style;
とある。この部分はHTMLのstyleタグの部分を生成しているようで、まずstyleタグを作成し、headタグ内に追加、styleタグで囲まれた部分にExampleStyles.re
の変数styleの文字列を追加。という感じになっているようです。どうやらCSSもこうやってreasonファイルとして書けるようです。この後もappendChild
というのがよく出てくるのですが、HTMLのツリー構造を考えると使いやすいような気がします。
Hello world
次にHello worldを表示できるようにしてみます。
src
ディレクトリに、新たにHello
ディレクトリを作成し、その中にHello.re
というファイルを作成します。
// Hello.re
let make = () => <div> { React.string("Hello, world!!") } </div>;
そしてIndex.re
の// All 4 examples.
というコメントのあとに以下を追記
ReactDOMRe.render(
32 <Hello />,
33 makeContainer("HelloWorld"),
34 );
そして先程のようにブラウザで表示させてみると、無事表示されました。
まとめ
ちょっとドキュメントが少ないような気がしないでもないですが、react-hooksの見本やReactと比較しながらやって行くとよいのかもしれません。とりあえず、なんとなく使い方が分かったような、分からないような…