什么是 Remix?
Remix JS 是一个全栈 React 框架,它允许我们在服务器端渲染代码。与在客户端使用 React 相比,这通常会带来更好的性能和搜索引擎优化(SEO)效果。你可能会问,Next JS 已经提供了服务端渲染,那 Remix 与它有何不同呢?Remix JS 仅专注于服务端渲染。它不具备 Next JS 那样的静态站点生成(SSG)和增量静态再生成(ISR)的能力。不过,由于它使用 esbuild 而不是 webpack,因此相比 Next JS,它能提供更快的开发体验。
Remix 是为了简化嵌套路由、数据获取和表单处理等复杂任务而构建的。其架构允许进行高效的渲染,仅加载页面中必要的部分。即使在禁用 JavaScript 的情况下,Remix 也能确保我们的应用程序无缝运行。
Remix 由 React Router 的联合创作者 Michael Jackson 和 Ryan Florence 创建,于 2020 年推出,旨在通过全栈 React 开发来提升 Web 性能。最初它是付费产品,但在 2021 年转为开源,并因其嵌套路由、SSR 和渐进式增强等强大功能而迅速走红。
核心功能
路由:
它支持基于文件结构的路由,这是构建在 React Router 之上的。它还允许我们创建嵌套路由。在 Remix JS 中,嵌套路由的 UI 继承自父路由组件。如果你使用过 Angular 或 Ember.js 等框架,你应该会熟悉这种模式。
数据获取:
在任何给定的路由中,我们可以导出一个用于前端 UI 的 React 组件。但我们也可以定义一个 loader 函数,该函数将在服务器上获取数据并将其发送到前端。我们的 React 组件可以通过使用 useLoaderData 钩子来访问这些获取的数据。
错误处理:
我们代码中、服务器上或浏览器中的大部分错误都会被 Remix 自动捕获,并渲染距离错误发生位置最近的 Error Boundary(错误边界)。
轻松访问 标签和文档:
任何路由模块都可以轻松提供对 head 标签的访问。在 head 标签中,我们可以轻松添加 meta 标签、描述和 CSS 链接。
TypeScript 支持:
它开箱即用地支持 TypeScript,我们可以轻松使用 TypeScript 生成应用程序的脚手架。
内置 Cookie 支持:
Remix 提供了一个名为 createCookie 的内置函数来处理 Cookie。
安装和设置 Remix 的步骤
第 1 步:安装并验证 Node 版本
在创建 Remix 应用程序之前,请确保我们已安装 node.js 和 npm。我们可以从这里安装 node js。通过运行以下命令来确认安装。
npm -v
node -v
第 2 步:初始化 Remix 项目
现在创建一个新文件夹并在终端中进入该文件夹。运行以下命令以创建一个最新版本的 Remix 应用。
npx create-remix@latest
第 3 步:选择所需选项
在继续安装的过程中,系统会提示我们选择一个服务器。请选择一个我们熟悉的服务器并继续。
!image终端截图
第 4 步:选择语言
输入我们想使用的编程语言并继续安装。
!image终端截图
第 5 步:切换到项目目录
使用以下命令切换到项目文件夹
cd my-remix-app
项目结构:
package.json 文件中的依赖列表如下:
“`
{
"name": "my-remix-app",
"private": true,
"sideEffects": false,
"type": "module",
"scripts": {
"build": "remix vite:build",
"dev": "remix vite:dev",
"lint": "eslint –ignore-path .gitignore –cache –cache-location ./node_modules/.cache/eslint .",
"start": "remix-serve ./build/server/index.js",
"typecheck": "tsc"
},
"dependencies": {
"@remix-run/node": "^2.11.2",
"@remix-run/react": "^2.11.2",
"@remix-run/serve": "^2.11.2",
"isbot": "^4.1.0",
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"devDependencies": {
"@remix-run/dev": "^2.11.2",
"@types/react": "^18.2.20",
"@types/react-dom": "^18.2.7",
"@typescript-eslint/eslint-plugin": "^6.7.4",
"@typescript-eslint/parser": "^6.7.4",
"autoprefixer": "^10.4.19",
"eslint": "^8.38.0",
"eslint-import-resolver-typescript": "^3.6.1",
"eslint-plugin-import": "^2.28.1",
"eslint-plugin-jsx-a11y": "^6.7.1",
"eslint-plugin-react": "^7.33.2",
"eslint-plugin-react-hooks": "^4.6.0",
"postcss": "^8.4.38",
"tailw