About Remix
RemixはフルスタックWebフレームワーク
開発者がUIを中心に開発できるように設計されている
Web標準に従って開発を進めることができる
React Routerをベースに開発されている
PESPAがデフォルトのアーキテクチャ
Slide 5
Slide 5 text
PEMPA
Slide 6
Slide 6 text
SPA
Slide 7
Slide 7 text
PESPA
Slide 8
Slide 8 text
Comparison with Rails and Laravel
従来のバックエンドフレームワークはModel、View、Controllerの3
つを提供する
RemixはViewとControllerのみフレームワークの機能として提供す
る
RemixはModelを機能として提供しない
Slide 9
Slide 9 text
Reasons for not providing models
JavaScriptというエコシステムには、既にすばらしいライブラリが
存在している
開発者はPrismaなどのライブラリをモデルとして採用することがで
きる
採用するライブラリをフレームワークに強制されず、開発者が自由
に選択できる
Slide 10
Slide 10 text
Explanation from MVC aspects
Remixでは、それぞれのView自身がそのコントローラーを担う設計
データとコンポーネントをひとつのモジュールにまとめることで、
完全なUIを構築することを目標としている(ルートモジュール)
Slide 11
Slide 11 text
Questions about state management
Remixでは、グローバルな状態管理が必要ない
Reduxを使う必要がない
GraphQLのような巨大なモジュールをクライアントに送る必要がな
い
Slide 12
Slide 12 text
Misconceptions about Remix
RemixはWebフレームワークである
RemixはUIフレームワークではない
RemixにおいてReactはViewの機能としてのみ使われている
ReactはViewにとって現在サポートされているUIフレームワークの
ひとつにすぎない
将来的にはVueなどのUIフレームワークをサポートする予定
Slide 13
Slide 13 text
Origins of Remix
Slide 14
Slide 14 text
Authors
Michael Jackson
出典: https://remix.run/authors/profile-michael-jackson.png
Ryan Florence
出典: https://remix.run/authors/profile-ryan-florence.png
Slide 15
Slide 15 text
History of Remix
2020年にパンデミックが発生
Ryan FlorenceとMichael Jacksonが経営していたReact Trainingの
状況が悪化し、会社にとって最悪の状況を迎える
React RouterをベースにしたWebフレームワークの開発を始める
2020年10月ベータ版の開発者プレビューをライセンス形式で公開す
る(当時はライセンスの購入が必須)
Slide 16
Slide 16 text
Kent C. Dodds' participation in Remix
Kent C. Dodds
出典: https://remix.run/authors/profile-kent-c-dodds.png
フィードバックを積極的に行う
自分のWebサイトをRemixで作
り直す
Remixで人々がWebサイトを作
ることを手助けするために、フ
ルタイムの仕事を辞めてRemix
に参加することを決断
Setting up the project
% npx create-remix@latest --template remix-run/indie-stack
? Where would you like to create your app? (./my-remix-app)
? TypeScript or JavaScript? (Use arrow keys)
❯ TypeScript
JavaScript
? Do you want me to run `npm install`? (Y/n)
...
Start development with `npm run dev `
That's it!
Slide 20
Slide 20 text
Start a server for development
cd ./javascript-fes
npm run dev
...
Mock server running
Rebuilding...
Done in 128ms.
Loading environment variables from .env
Remix App Server started at http://localhost:3000 (http://192.168.xx.x:3000)
useLoaderData hook
loader() で返された値は useLoaderData() を使って取得できる
export default function NoteDetailsPage() {
const data = useLoaderData();
return (
{data.note.title}
{data.note.body}
...
);
}
Slide 37
Slide 37 text
Features of loader
GET リクエストの時に呼び出される
最初にSSRされるときにHTMLドキュメントに対してデータを提供
する
ブラウザ上でナビゲーションを行うたびに、セグメントとマッチす
るRoute Moduleに存在する loader() 関数が fetch によって呼び出さ
れる
Features of action
action() は GET 以外の POST 、 PUT 、 PATCH 、 DELETE リクエストの
時に呼び出される
その場合 loader() より先に呼び出される
loader() へ GET リクエストが到達した時、ルート階層にマッチする
すべての loader() が呼び出される
しかし、 action() の場合は1つのみ
Slide 41
Slide 41 text
Conditions under which an action is determined to be
one 1 / 2
どのルートの action() が呼び出されるかの条件は、最も深くマッチす
るルートであること
例えば、 /notes/$noteId の場合を考える
notes.tsx と notes.
$noteId.tsx の両方に action() が定義されていた
としても、呼び出されるのは notes.
$noteId.tsx の action()
理由はそれがもっとも深いルートだから
Slide 42
Slide 42 text
Conditions under which an action is determined to be
one 2 / 2
しかし、 /notes にリクエストが来た時の挙動は違う
notes._index.tsx があったとしても、 notes.tsx の action() が呼び出
される
明確に notes._index.tsx の action() を呼び出したい場合は、 ?index
を付与して /notes?index にリクエストを送る
Slide 43
Slide 43 text
How to call action
クライアントが action() を呼び出すために axios() を使う必要はな
い
Web標準に従って を使えば良い
Slide 44
Slide 44 text
Remix Form
export default function NoteDetailsPage() {
const data = useLoaderData();
return (
Create a Secret on Fly.io
プロジェクトの内部では SESSION_SECRET 環境変数が使われている
これはアカウント管理のロジックで使われている
secretsを設定することで環境変数として値を渡すことができる
% fly secrets set SESSION_SECRET=$(openssl rand -hex 32) --app javascript-fes
Secrets are staged for the first deployment%