Remix 入門ログ
Quick Start(5min)
から
cli の頁もあるが,まずは基本の通り $ npx create-remix@latest
で対話的にやる
よしよし動いた.デフォルトは vuite
なのね.メインのファイルは root.tsx
か.デフォルトの remix-serve
を使わず,カスタムで server.js
を作って node で動かすこともできる.
package.json
を見たら,@remix-run/react
と react
, react-dom
, @types/react
, @types/react-dom
がある
続いて Tutorial(30min)
ボイラープレート見たら <Form>
というカスタムコンポーネントがあった.
標準のWebのHTMLフォームを拡張したものらしく,ブラウザからサーバーにリクエストを送信するのを防ぎ,フェッチ経由で action(後で出てくる)
にデータを送る,という仕組みらしい.
すべてのルートにおいて,スタイルシートの追加には,links
という関数を作って export するらしい.返すものは配列で.いわゆる <head>
に組み込むものをここで定義する.
import type { LinksFunction } from "@remix-run/node";
// existing imports
import appStylesHref from "./app.css?url";
export const links: LinksFunction = () => [
{ rel: "stylesheet", href: appStylesHref },
];
で,これが root.tsx
の <Links />
にレンダリングされる.
Remix は React Router
上に構築されていると,公式にもはっきり書かれているな.
Since Remix is built on top of React Router, it supports nested routing.
ネストされたルーティングのためには,親で <Outlet />
をレンダリングする必要があるらしい.
import { Outlet } from "@remix-run/react";
// (省略)
<div id="detail">
<Outlet />
</div>
SPA にするには <Link>
コンポーネントをインポートする必要がある.が,確認したところ SPA ではあるが,JS ファイルは確かに再度取得はしていないが,HTML, CSS などは再度サーバーに問い合わせているっぽいな.
data.ts
の中にデータフェッチ用の関数を含んだオブジェクトとダミーデータが格納されていて,それをコールして擬似的にデータを API からフェッチしているような見え方.このチュートリアルでは loader()
関数を書いているが,これは loader という名前のAPI なので,別の名前だとエラーになった.useLoaderData()
は loader()
で return したものを受け取れる.
ダイナミックセグメントは,URL の指定した位置(今回は $contanctId
の部分)の値を,params.contactId
で渡される.チュートリアル通りやっているが,typescriptの型エラーが出ているな.
↓
ちゃんと後ほど対応してる.型ガードの方.今のところは何かあっても404エラーとして画面上にも404だけが表示される.
tiny-invariant は初めて知った.
データの更新も Form
コンポーネントを使うのね.
ファイル名が app/routes/contacts.$contactId_.edit.tsx
と,接頭辞ではなく接尾辞として _
をつけるのは初めて見た.内部でネストさせたくない[1],でも差別化はしたい,ということでこうなったと.テクニックだったか.ちょっと違うけど,自分は自分の OSS で .gr
という固有の拡張子とか作ったことを思い出した.
で,form のデータで更新をするには,作成のときと同様に action()
関数を書くと.
ちなみに Remix は form のリクエストを中断しコントロールするので,リクエストボディとかを見るために action
で console.log()
とかを仕込んでも,ブラウザのコンソールには出ず,ターミナル等の標準出力に出る.サーバーで処理しているから.値を取得したければ,
formData.get("hoge")
と,ゲッターが用意されているのはありがたい.