1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

RuruCun個人開発Advent Calendar 2023

Day 3

RemixのQuickStartで入門してみる。

Posted at

背景

普段はNext.jsを使って開発をしているのですが、下記の記事で色々話題になったRemixについて気になったので、アドベントカレンダー消化ついでにチュートリアルを走ってみます。

ZennでのScrapをまとめた記事です。

参考

Installation

mkdir my-remix-app
cd my-remix-app
npm init -y

# install runtime dependencies
npm i @remix-run/node @remix-run/react @remix-run/serve isbot react react-dom

# install dev dependencies
npm i -D @remix-run/dev

Root Route

appディレクトリにroot.jsxを作成する。

mkdir app
touch app/root.jsx

下記のファイルを作成する。

import {
  Links,
  Meta,
  Outlet,
  Scripts,
} from "@remix-run/react";

export default function App() {
  return (
    <html>
      <head>
        <link
          rel="icon"
          href="data:image/x-icon;base64,AA"
        />
        <Meta />
        <Links />
      </head>
      <body>
        <h1>Hello world!</h1>
        <Outlet />

        <Scripts />
      </body>
    </html>
  );
}

Build and Run

下記のコマンドで、Buildする。
build/フォルダーにファイルがビルドされます。

npx remix build

アプリを実行するために、package.jsonに下記を追加します。

{
  "type": "module"
  // ...
}

package.jsonを更新後に、次のコマンドを使用して実行します。
実行後に表示されたURLをブラウザで開くと、HelloWorldが表示されたサイトへアクセスできます。

npx remix-serve build/index.js

[remix-serve] http://localhost:3000 (http://192.168.1.1:3000)

自分のサーバーを持ち込む

build/のファイルはExpress、Cloudflare Workers、Netlify、Vercel、Fastly、AWS、Deno、Azure、Fastify、Firebase などのサーバー内でどこでも実行できる単なるモジュールです。
remix-serveの使用をやめて、かわりにExpressを使用しましょう。

とのことで、expressでの実装を試す。

expressのインストールとremix-serveのアンインストール

npm i express @remix-run/express

# not going to use this anymore
npm uninstall @remix-run/serve

Expressサーバーを作成する。

touch server.mjs
server.mjs
import { createRequestHandler } from "@remix-run/express";
import express from "express";

// notice that the result of `remix build` is "just a module"
import * as build from "./build/index.js";

const app = express();
app.use(express.static("public"));

// and your app is "just a request handler"
app.all("*", createRequestHandler({ build }));

app.listen(3000, () => {
  console.log("App listening on http://localhost:3000");
});

Expressでアプリを実行する

node server.mjs

開発ワークフロー

React RefrechとRemix Hot Data Revalidationを使用して、ファイル変更で更新が入るようにする。

package.json へスクリプトを追加する。

下記の変更で、Remix開発サーバーを起動し、ファイルの変更を監視してアプリをリロードするようになる。
cフラグはアプリケーション・サーバーの起動方法をしている。

ファイルが変更されると、サーバーを再起動しようとするが、Expressを自前で立てているので、ブラウザにホットアップデートを送信できるように、Remixに再起動したことを伝えます。

{
  "scripts": {
    "dev": "remix dev -c \"node server.mjs\""
  }
  // ...
}

broadcastDevReadyをserverに追加する

server.mjs
import { createRequestHandler } from "@remix-run/express";
+ import { broadcastDevReady } from "@remix-run/node";
import express from "express";

// notice that the result of `remix build` is "just a module"
import * as build from "./build/index.js";

const app = express();
app.use(express.static("public"));

// and your app is "just a request handler"
app.all("*", createRequestHandler({ build }));

app.listen(3000, () => {
+  if (process.env.NODE_ENV === "development") {
+    broadcastDevReady(build);
+  }
  console.log("App listening on http://localhost:3000");
});
diff app/root.jsx
import {
  Links,
+  LiveReload,
  Meta,
  Outlet,
  Scripts,
} from "@remix-run/react";

export default function App() {
  return (
    <html>
      <head>
        <link
          rel="icon"
          href="data:image/x-icon;base64,AA"
        />
        <Meta />
        <Links />
      </head>
      <body>
        <h1>Hello world!</h1>
        <Outlet />

        <Scripts />
+        <LiveReload />
      </body>
    </html>
  );
}

devサーバーを起動する。

npm run dev

この状態でlocalhostを開き、app/root.jsxに変更を加えて保存すると、ファイルの変更がリアルタイムに反映されます。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?