本指南将帮助您尽快熟悉运行 Remix 应用所需的基本流程。虽然有很多带有不同运行时、部署目标和数据库的入门模板,但我们将从头开始创建一个最基本的项目。
当您准备好认真对待您的 Remix 项目时,您可以考虑从社区模板开始。它们包括 TypeScript 设置、数据库、测试工具、身份验证等等。您可以在 Remix 资源 页面找到社区模板列表。
如果您更喜欢初始化一个包含所有必要功能的 Remix 项目,可以使用 create-remix
CLI
npx create-remix@latest
但是,本指南将解释 CLI 为设置您的项目所做的所有操作,并且您可以按照以下步骤操作,而不是使用 CLI。如果您刚开始使用 Remix,我们建议您遵循本指南以了解构成 Remix 应用的不同部分。
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@4 react react-dom
# install dev dependencies
npm i -D @remix-run/dev vite
touch vite.config.js
由于 Remix 使用 Vite,因此您需要使用 Remix Vite 插件提供一个 Vite 配置。以下是您需要的基本配置
import { vitePlugin as remix } from "@remix-run/dev";
import { defineConfig } from "vite";
export default defineConfig({
plugins: [remix()],
});
mkdir app
touch app/root.jsx
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>
);
}
首先为生产环境构建应用程序
npx remix vite:build
您现在应该会看到一个 build
文件夹,其中包含一个 server
文件夹(应用程序的服务器版本)和一个 client
文件夹(浏览器版本),其中包含一些构建工件。(这都是 可配置的。)
👉 使用 remix-serve
运行应用程序
首先,您需要在 package.json
中将类型指定为模块,以便 remix-serve
可以运行您的应用程序。
{
"type": "module"
// ...
}
现在您可以使用 remix-serve
运行您的应用程序
# note the dash!
npx remix-serve build/server/index.js
您应该能够打开 https://127.0.0.1:3000 并查看“hello world”页面。
除了 node_modules
中数量庞大的代码外,我们的 Remix 应用程序只是一个文件
├── app/
│ └── root.jsx
└── package.json
└── vite.config.js
remix vite:build
创建的 build/server
目录只是一个模块,您可以在 Express、Cloudflare Workers、Netlify、Vercel、Fastly、AWS、Deno、Azure、Fastify、Firebase 等任何服务器中运行它。
如果您不想设置自己的服务器,可以使用 remix-serve
。它是一个由 Remix 团队维护的基于 Express 的简单服务器。但是,Remix 专门设计用于在任何 JavaScript 环境中运行,以便您拥有自己的技术栈。预计许多(如果不是大多数)生产应用程序将拥有自己的服务器。您可以在 运行时、适配器和技术栈 中阅读更多相关内容。
为了好玩,让我们停止使用remix-serve
,改用express。
👉 安装Express、Remix Express适配器和cross-env用于在生产模式下运行
npm i express @remix-run/express cross-env
# not going to use this anymore
npm uninstall @remix-run/serve
👉 创建Express服务器
touch server.js
import { createRequestHandler } from "@remix-run/express";
import express from "express";
// notice that the result of `remix vite:build` is "just a module"
import * as build from "./build/server/index.js";
const app = express();
app.use(express.static("build/client"));
// and your app is "just a request handler"
app.all("*", createRequestHandler({ build }));
app.listen(3000, () => {
console.log("App listening on https://127.0.0.1:3000");
});
👉 使用express运行你的应用
node server.js
现在你拥有了自己的服务器,你可以使用服务器自带的任何工具来调试你的应用。例如,你可以使用Node.js inspect标志在chrome开发者工具中检查你的应用。
node --inspect server.js
无需每次都停止、重建和启动服务器,你可以使用中间件模式下的Vite在开发环境中运行Remix。这使得React Refresh(热模块替换)和Remix热数据重新验证能够即时反馈应用中的更改。
首先,为了方便起见,在package.json
中添加dev
和start
命令,分别用于在开发和生产模式下运行你的服务器。
👉 在package.json
中添加“scripts”条目
{
"scripts": {
"dev": "node ./server.js",
"start": "cross-env NODE_ENV=production node ./server.js"
}
// ...
}
👉 将Vite开发中间件添加到你的服务器
如果process.env.NODE_ENV
设置为"production"
,则不会应用Vite中间件,在这种情况下,你仍然会像之前一样运行常规构建输出。
import { createRequestHandler } from "@remix-run/express";
import express from "express";
const viteDevServer =
process.env.NODE_ENV === "production"
? null
: await import("vite").then((vite) =>
vite.createServer({
server: { middlewareMode: true },
})
);
const app = express();
app.use(
viteDevServer
? viteDevServer.middlewares
: express.static("build/client")
);
const build = viteDevServer
? () =>
viteDevServer.ssrLoadModule(
"virtual:remix/server-build"
)
: await import("./build/server/index.js");
app.all("*", createRequestHandler({ build }));
app.listen(3000, () => {
console.log("App listening on https://127.0.0.1:3000");
});
👉 启动开发服务器
npm run dev
现在你可以立即获得反馈地处理你的应用。试一试,更改root.jsx
中的文本,然后观察!
Remix使用一些默认的魔法文件,大多数应用不需要修改,但如果你想自定义Remix到服务器和浏览器的入口点,你可以运行remix reveal
,它们将被转储到你的项目中。
npx remix reveal
Entry file entry.client created at app/entry.client.tsx.
Entry file entry.server created at app/entry.server.tsx.
恭喜,你可以把Remix添加到你的简历上了!总结一下,我们学到了
总的来说,Remix有点“底层”。一些简单的样板代码,但现在你拥有了自己的技术栈。
接下来是什么?