首页
/ Remix 3 全栈 Web 框架源码解析:设计原则、包生态与快速上手指南

Remix 3 全栈 Web 框架源码解析:设计原则、包生态与快速上手指南

2026-09-09 09:38:36作者:袁立春Spencer

Remix 3 是 Remix 框架基于 Web 标准 API 全面重写的新一代全栈 Web 框架,本文以本仓库根 README.md 为主线,系统拆解其六大工程哲学、由 40+ 独立包构成的生态体系,并结合仓库内真实源码与模板给出从 remix@next 安装、CLI 建站到 remix.json 配置的完整实战路径。读完本文,你将理解 Remix 3 为什么宣称"默认可移植、面向未来",并能在 Node.js 等任意 JavaScript 运行时上独立搭建一个可运行的 Remix 应用。

Remix 3 是什么:正在积极开发中的新一代全栈框架

仓库根 README 开宗明义:这是 Remix 3 的源码仓库,目前正处于活跃开发阶段(under active development)。在本文所对应的仓库状态下,核心包 packages/remix/package.json 的版本号为 3.0.0-rc.1,即已进入 Release Candidate 阶段。

与上一代不同,Remix 3 的定位是"The fully-stacked web framework"——一个覆盖浏览器、服务端、数据层、测试与开发工具的完整全栈框架。仓库采用 pnpm workspace 单仓库(monorepo)结构,所有产品代码集中在 packages/ 目录下,并由根 package.json 统一管理工作区与脚本;开发环境要求 node >= 24.3.0,使用 --import 加载器直接运行 TypeScript/JSX 源码,无需预编译构建步骤。

六大设计原则:驱动 Remix 3 的工程哲学

README 用六条原则概括了 Remix 3 的构建理念,这六条原则不仅指导框架本身的实现,也直接决定了包生态的形状与使用方式。

1. Model-First Development(模型优先开发)

AI 正在从根本上改变人机交互模型——无论是用户体验还是开发者工作流。Remix 3 主张为 LLM 优化源码、文档、工具链与抽象层,同时提供让应用在产品内部使用模型的抽象,而不仅是把模型当作开发工具。

这一原则在仓库中有直接体现:根目录的 AGENTS.md 完整记录了仓库形态、开发循环、代码风格与测试约定,并维护了 .agents/skills/remix/SKILL.md 这一面向 Agent 的"应用构建技能"文档(见后文"面向 Agent 的工程化支持"一节)。

2. Build on Web APIs(构建在 Web API 之上)

跨栈共享抽象能大幅减少人与机器的上下文切换。Remix 3 坚定地建立在 Web API 与 JavaScript 之上,因为这是唯一覆盖全栈的生态。具体替换策略包括:

场景 Remix 3 采用 放弃
流处理 Web Streams API node:stream
二进制数据 Uint8Array Node.js Buffer
密码学 Web Crypto API node:crypto
文件与二进制对象 Blob / File 各运行时专属 API

从源码结构看,这一取向贯穿始终:例如 packages/node-fetch-server 用 Fetch API 的 Request/Response 构建 Node.js 服务器,packages/fs 提供基于 Web File API 的文件系统工具,而 packages/response 则是纯 Fetch API 的响应帮助库。

3. Religiously Runtime(虔诚地忠于运行时)

为 bundler/compiler/typegen 等"运行时之前的静态分析"而设计,最终会污染整个系统的 API 设计。因此 Remix 3 要求:所有包在设计中不依赖任何静态分析,所有测试必须在不打包(without bundling)的情况下运行;由于浏览器环境不可避免,仅允许使用 --import 加载器做 TypeScript 与 JSX 这类简单转换。

这一点可从 template/package.json 的脚本得到印证:devstarttest 全部通过 node --import remix/node-tsx 直接运行源码,测试脚本甚至直接使用 node --test;而 AGENTS.md 也明确写着"Tests run from source: no build step required"。

4. Avoid Dependencies(避免依赖)

依赖会把你锁定在别人的路线图上。Remix 3 的策略是:谨慎选择依赖、彻底封装(wrap them completely)、并预期最终用自有实现替换大多数依赖,目标是零依赖。这也是仓库内大量基础包存在的原因——multipart 解析(packages/multipart-parser)、tar 解析(packages/tar-parser)、MIME 处理(packages/mime)等全部自研实现。

5. Demand Composition(要求可组合性)

抽象应当单一职责、可替换、易组合。一个可组合的抽象应当易于从既有程序中添加和移除;每个包必须在脱离任何其他上下文时仍然有用且有文档。新功能应优先以"新包"的形式尝试实现;如果不可行,则优先拆分既有包以提升可组合性;而那些几乎总是双向一起变化的紧耦合模块则应并入同一包。

packages/remix/package.json 的依赖表正是这一原则的产物——remix 聚合包显式依赖了 40+ 个 @remix-run/* 工作区包,而这些包彼此独立发布、独立文档。

6. Distribute Cohesively(整体化分发)

过度可组合的生态难以学习与使用,因此 Remix 选择以单一的 remix 包进行分发与文档化。用户只需安装一个 remix 依赖,即可获得全部能力;同时每个能力又以子路径导出的方式暴露(如 remix/routerremix/assetsremix/middleware/render),做到了"一个依赖、多入口、按需使用"。

Goals:单包可用与默认可移植

README 明确指出,虽然推荐使用聚合的 remix 包,但构成 Remix 的每个包都应能独立使用。这迫使团队认真思考包边界,并定义可移植、可互操作的公共接口。每个包必须满足:

  • 单一职责(single responsibility):一个包只做一件事;
  • 优先 Web 标准:确保在 JavaScript 各运行时之间最大程度的互操作性与可移植性;
  • 克制地增强标准:在标准缺失或不完整处"不突兀地"补充,最小化兼容性风险。

其结果就是 Remix 代码默认可移植:同一份代码可无缝运行于 Node.js、Bun、Deno、Cloudflare Workers 等环境。这种"不仅可复用,而且面向未来(future-proof)"的特性,是 Web API 优先策略的直接收益。

包生态:40+ 独立包组成的可组合工具库

README 列出了仓库中的全部包。按职责可归为以下几类(路径均为仓库根相对路径):

核心框架

  • remix:Remix 全栈 Web 框架,聚合包的枢纽

基础工具(跨运行时)

Fetch 路由与服务器

中间件(Fetch API 服务器)

认证、存储与数据库

资产、视图与开发工具

  • assets:按需编译浏览器 JS/TS 与 CSS 资产的 Fetch 服务器
  • ui:带 reconciler、组件模型与第一方 UI 组件的视图层
  • ui-hmr:Remix UI 组件的 HMR 运行时与转换
  • node-hmr:带热模块重载的 Node.js 运行
  • node-tsx:带 TS/JSX 语法支持的 Node.js 运行
  • cli:Remix 命令行工具
  • test:面向 JS/TS 项目的测试框架

组合方式与源码佐证remix 包通过 packages/remix/package.json 中的 exports 字段把各子模块映射到 src/*.ts 顶层文件(如 "./router": "./src/fetch-router.ts""./middleware/render": "./src/render-middleware.ts""./assets": "./src/assets.ts"),发布时再由 publishConfig.exports 映射到构建产物 dist/*.js。这正是"单包分发、子路径独立消费"的落地实现。需要说明的是,这些包从 npm 安装时统一使用 remix 名称(如 import { createRouter } from 'remix/router'),仓库内的 @remix-run/* 名称仅存在于单仓库内部,是聚合包的工作区依赖。

安装与快速开始

安装当前 beta 版本

使用 next dist-tag 安装 Remix 3 的当前 beta 版本:

npm install remix@next

使用 CLI 创建新应用

npx remix@next new my-remix-app

也可以先安装 remix 包,再用本地命令创建:

npm i remix
remix new my-remix-app

尝鲜 main 分支的最新构建

如果想体验最前沿(bleeding edge)的版本,仓库会持续把最新 main 分支构建到 preview/main 分支,可用 pnpm(9+ 版本)从 Git 仓库直接安装:

pnpm install "remix-run/remix#preview/main&path:packages/remix"

也可以只安装生态中的单个包:

pnpm install "remix-run/remix#preview/main&path:packages/fetch-router"

环境要求与脚手架内部结构

template/package.json 可以看到,Remix 应用要求 node >= 24.3.0,模板提供的脚本包括:

  • devNODE_ENV=development node --watch --import remix/node-tsx server.ts——监听文件变更并直接运行 TS 源码
  • hmrNODE_ENV=development node hmr.ts——启用 UI 热模块替换
  • startNODE_ENV=production node --import remix/node-tsx server.ts
  • testNODE_ENV=test node --import remix/node-tsx --test
  • typechecktsc --noEmit

脚手架生成的应用结构(见 template/)展示了 Remix 3 的核心约定:

  • server.tscreateRequestListener(来自 remix/node-fetch-server)把原生 node:http 服务器桥接到 Fetch API,然后委托给 router.fetch(request),并处理优雅关闭(SIGINT/SIGTERM);
  • app/router.tscreateRouter 组合中间件(如 staticFiles('./public')render({ assets })),再通过 router.map(routes, controller) 把路由表映射到控制器;
  • app/routes.tsroute({ ... }) 声明式定义路由,例如 assets: get('/assets/*path')home: '/'
  • app/actions/controller.tsxcreateController(routes, { actions: { ... } }) 为每个路由提供处理函数,其中 assets 动作直接代理给资产服务器;
  • app/assets.tscreateAssetServer 按需编译浏览器 JS/TS 与 CSS,开发环境开启 sourceMaps: 'external'watch,HMR 模式下注入 uiHmr() 加载器。

CLI 与 remix.json 配置

安装 remix 后,完整的 CLI 命令(详见 packages/cli/README.md)包括:

remix new my-remix-app
remix assets
remix assets inspect /assets/app/actions/public/entry.ts
remix completion bash >> ~/.bashrc
remix completion zsh >> ~/.zshrc
remix doctor
remix doctor --fix
remix db migrate
remix db rollback
remix db status
remix db reset --force
remix routes
remix routes --table
remix routes --table --no-headers
remix test
remix version
remix --no-color doctor

其中几个命令的要点:

  • remix assets:逐行列出每个浏览器可达资产,格式为 URL -> fileremix assets inspect <url-or-file> 可查看单个资产解析结果以及它是可达、被拒、不支持、缺失还是未映射(被拒资产会显示命中的拒绝规则);
  • remix doctor:检查项目环境与 Remix 应用约定;--fix 应用低风险修复;--no-strict 可单次关闭严格模式;
  • remix db:管理当前应用数据库,破坏性命令(db wipedb reset)不带 --force 会拒绝执行;db rollback 默认回滚最近一次迁移,可用 --step <count>--to <migration> 选择范围,用 --dry-run 预览而不改动数据库;
  • remix routes:查看当前应用的路由树,--table 输出表格,--no-headers 去掉表头。

CLI 也可编程式调用——runRemix() 返回 Promise<退出码>:

import { runRemix } from 'remix/cli'

await runRemix(['new', 'my-remix-app'])
await runRemix(['doctor', '--fix'])
await runRemix(['routes', '--table'])

CLI 会加载一个可选的 remix.json 配置文件,采用 JSONC 格式(允许注释与尾逗号),所有顶层字段均可选。完整示例可参考 packages/cli/README.md,仓库内 demos/bookstore/remix.json 是真实应用配置实例,核心结构如下:

{
  "$schema": "./node_modules/remix/schema/remix.json",

  "assets": {
    "rootDir": ".",
    "basePath": "/assets",
    "mounts": { "app": "app", "npm": "node_modules" },
    "allowFiles": ["app/routes.ts", "app/**/public/**"],
    "allowPackages": ["remix"],
    "denyFiles": ["app/**/*.test.*"]
  },

  "db": {
    "adapter": {
      "type": "sqlite",
      "filename": { "env": "DATABASE_URL", "default": "./db/app.sqlite" },
      "foreignKeys": true,
      "busyTimeout": 5000
    },
    "migrations": { "directory": "./db/migrations", "journalTable": "data_table_migrations" },
    "seed": "./db/seed.sql"
  },

  "doctor": { "strict": true },

  "test": {
    "files": ["**/*.test{,.browser,.e2e}.{ts,tsx}"],
    "concurrency": 4,
    "pool": "forks",
    "coverage": { "enabled": true, "dir": ".coverage", "branches": 80, "functions": 80, "lines": 80, "statements": 80 }
  }
}

配置行为要点(均来自 packages/cli/README.md):

  • $schema 指向随本地 remix 包分发的 schema(packages/cli/schema/remix.json),保证编辑器校验与当前安装版本一致且离线可用;它刻意不引用传递依赖 @remix-run/cli,因为 pnpm 等包管理器可能不会在项目根部链接它;
  • 显式命令行 flag 与位置参数优先于配置值;重复 flag 会替换配置中的数组,而嵌套的 Playwright 与 coverage 设置按字段合并;相对路径与 glob 从配置文件所在目录解析;
  • remix db 必须配置 db.adaptertype 支持 sqlite/postgres/mysql,PostgreSQL 用 connectionString,MySQL 用 uri;连接值可以是字符串,也可以是"命名环境变量 + 可选默认值"的对象;db.seed 指定 remix db seed / remix db reset 要执行的 SQL 文件;
  • 数据库命令支持 --migrations--seed--journal-table--connection-env--step--to--dry-run 等单次覆盖 flag;未指定全局 --config 时,数据库命令会从工作目录向上查找最近的 remix.json
  • 全局 --config 选项可选择其他 JSONC 文件,可放在命令前后:remix --config ./config/remix.ci.json test
  • 默认 remix.json 缺失会被忽略;但显式选择的文件缺失、JSONC 语法错误、未知属性或非法值都会报 CLI 错误;
  • 应用代码可用 loadConfig()(来自 remix/cli)加载完整校验后的配置,并直接展开 config.assets 传入 createAssetServer(),运行时相关选项(transforms、缓存、HMR、错误处理等)在应用代码中补充。

面向 Agent 的工程化支持

README 特别强调:从本仓库启动 Remix 3 应用的 Agent 应当使用 remix 应用技能文档。该技能覆盖项目布局、路由、控制器、中间件、校验、数据访问、认证、会话、上传、UI、水合、导航、动画与测试的全链路指导。CLI 的 prepack 步骤会把这个技能复制进应用模板,因此脚手架生成的应用也能获得同样的 Agent 指导。仓库根 AGENTS.md 还维护了面向仓库开发者的完整规范:默认开发循环(linttest:changedtypecheck:changed)、代码风格(import type.ts 扩展名、Oxfmt 格式化)、测试约定(从源码运行、无构建步骤)等。

仓库布局与开发循环

  • 单仓库结构:pnpm workspace,产品代码在 packages/,每个 exports 入口映射到独立的顶层 src/*.ts 文件,实现细节放在 src/lib
  • 跨包边界:不在包之间互相 re-export API 或类型,直接从拥有方包导入;
  • 平台立场:优先 Web API 与标准对齐原语,而非 Node 专属 API;
  • 验证脚本(根 package.json):pnpm run lint(oxlint)、pnpm run format(oxfmt)、pnpm test(并发运行所有工作区测试)、pnpm run typecheck,以及面向变更包的快速验证 test:changed / typecheck:changed
  • 目录速览:真实应用示例见 demos/(含 bookstore、timeboxer、social-auth、frames 等,每个都带 e2e 测试),决策记录见 decisions/(如路由模式与 trie 匹配、SQL 迁移方案等),文档站点见 docs/

参与贡献与许可证

仓库欢迎一切形式的贡献,可提交 issue 或 pull request,详见 CONTRIBUTING.md。源码采用 MIT 许可证,见 LICENSE。安装、运行、查看与配置方式均以本文所述为准;仓库本身为只读研究用,如需修改请基于克隆副本进行。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.14 K
2.76 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
858
1.35 K
docsdocs
暂无描述
Markdown
899
5.82 K
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
923
1.85 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.83 K
1.02 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
532
596
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.03 K
524
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.37 K
1.46 K
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
548
393