Skyroc Admin React
部署

构建部署

构建 apps/admin 生产包,并正确处理 preview、base url、history rewrite、Nginx 和常见部署问题

这一页说明 apps/admin 如何构建和部署。重点是把命令、mode、env、Vite base、SPA history rewrite 和 Nginx 配置放在一起看,避免构建成功但线上刷新 404、资源路径错误或接口地址不对。

命令建议在仓库根目录执行。apps/admin 的 workspace 包名是 skyroc-admin

适用场景

场景重点位置
构建生产包pnpm --filter skyroc-admin build.env.prod
构建测试环境包pnpm --filter skyroc-admin build:test.env.test
本地预览构建产物pnpm --filter skyroc-admin preview
部署到域名根路径VITE_BASE_URL=/、Nginx try_files
部署到子路径VITE_BASE_URL=/admin/、Nginx location /admin/
切换后端接口VITE_SERVICE_BASE_URLVITE_OTHER_SERVICE_BASE_URL
排查刷新 404TanStack Router 默认 browser history、服务端 rewrite

当前实现位置

文件职责
apps/admin/package.json定义 devbuildbuild:testpreviewpre* 脚本。
apps/admin/.env公共 env,包含 VITE_BASE_URL、代理开关、服务 code、路由和存储配置。
apps/admin/.env.testtest mode 覆盖项,当前主要配置测试环境后端地址。
apps/admin/.env.prodprod mode 覆盖项,当前主要配置生产环境后端地址。
apps/admin/vite.config.ts使用 @skyroc/web-admin-vitedefineConfig(),注入应用级 SCSS 配置。
packages/web/admin-vite/src/config.ts共享 Vite 预设入口,读取 env、生成 base、server、preview、proxy 和插件。
packages/web/admin-vite/src/build.ts构建产物命名、页面 chunk、组件 chunk 和 vendor chunk 规则。
packages/web/admin-vite/src/proxy.ts开发代理生成逻辑。生产部署不会依赖 Vite dev proxy。
apps/admin/src/features/router/index.ts当前 TanStack Router 使用默认 browser history,需要服务端 SPA rewrite。

构建前检查

当前仓库根要求:

工具要求来源
Node.js>=20package.json
pnpm10.4.1package.jsonapps/admin/package.json

先在仓库根安装依赖:

pnpm install

不要只在 apps/admin 目录单独安装依赖。apps/admin 使用多个 workspace 包,构建时需要 workspace 解析和本地包产物配合。

构建命令

生产环境构建:

pnpm --filter skyroc-admin build

实际执行:

vite build --mode prod

测试环境构建:

pnpm --filter skyroc-admin build:test

实际执行:

vite build --mode test

两个构建命令都会先执行对应的 prebuild 脚本:

pnpm run build:admin-vite

也就是先构建 @skyroc/web-admin-vite

pnpm --filter @skyroc/web-admin-vite build

原因是 apps/admin/vite.config.ts 直接从共享包导入 defineConfig。构建应用前先构建共享 Vite 预设,可以确保本次构建使用的是最新的 preset 产物。

mode 和 env

脚本和 env 的关系如下:

命令Vite mode读取 env
pnpm --filter skyroc-admin buildprod.env + .env.prod
pnpm --filter skyroc-admin build:testtest.env + .env.test
pnpm --filter skyroc-admin previewVite preview运行已构建产物;构建时 env 已固化进产物。

VITE_SERVICE_BASE_URLVITE_OTHER_SERVICE_BASE_URLVITE_BASE_URL 这类变量会在构建时确定。修改 env 后必须重新构建,不能只替换静态文件目录里的某个 JS 文件。

预览构建产物

构建完成后,本地预览:

pnpm --filter skyroc-admin preview

@skyroc/web-admin-vite 的 preview 默认端口是 9725

config.preview = {
  port: 9725,
  ...application.preview
};

如果要改 preview 端口,在 apps/admin/vite.config.ts 配置:

import { defineConfig } from '@skyroc/web-admin-vite';

export default defineConfig({
  application: {
    preview: {
      port: 4173
    }
  }
});

preview 只用于本地检查构建产物,不替代线上 Nginx、CDN 或对象存储配置。

部署到域名根路径

如果部署在域名根路径,例如:

https://admin.example.com/

保持:

VITE_BASE_URL=/

构建后把 Vite 输出目录部署到站点根目录。Vite 默认输出目录是 dist

Nginx 最小配置:

server {
  listen 80;
  server_name admin.example.com;

  root /var/www/skyroc-admin/dist;
  index index.html;

  location / {
    try_files $uri $uri/ /index.html;
  }
}

try_files 是必须的。当前 TanStack Router 使用默认 browser history,用户刷新 /manage/user 时,服务器需要回退到 index.html,再让前端路由接管。

部署到子路径

如果部署在子路径,例如:

https://example.com/admin/

先把 base 改成子路径:

VITE_BASE_URL=/admin/

然后重新构建:

pnpm --filter skyroc-admin build

Nginx 示例:

server {
  listen 80;
  server_name example.com;

  location /admin/ {
    alias /var/www/skyroc-admin/dist/;
    index index.html;
    try_files $uri $uri/ /admin/index.html;
  }
}

子路径部署时要同时满足两件事:

配置作用
VITE_BASE_URL=/admin/让构建产物里的 JS、CSS、图片等资源使用正确前缀。
服务端 rewrite 到 /admin/index.html让刷新 /admin/manage/user 这类前端路由时仍返回入口 HTML。

如果只改 Nginx,不改 VITE_BASE_URL,资源路径可能从域名根加载;如果只改 VITE_BASE_URL,不做 rewrite,刷新深层路由仍会 404。

后端接口和代理

开发环境代理由这些变量控制:

VITE_HTTP_PROXY=Y
VITE_PROXY_LOG=Y

@skyroc/web-admin-vite 会在 dev server 下创建:

服务代理前缀
主服务 VITE_SERVICE_BASE_URL/proxy-default
其他服务 VITE_OTHER_SERVICE_BASE_URL 中的 demo/proxy-demo

生产部署不要依赖 Vite dev proxy。生产包里的接口地址来自构建时的 env:

VITE_SERVICE_BASE_URL=https://api.example.com
VITE_OTHER_SERVICE_BASE_URL={ demo: "https://demo-api.example.com" }

如果线上需要通过同域 Nginx 转发后端,可以把 VITE_SERVICE_BASE_URL 配成同域路径,再在 Nginx 增加 API location:

VITE_SERVICE_BASE_URL=/api
location /api/ {
  proxy_pass https://api.example.com/;
}

注意路径重写规则要和后端接口路径对齐,避免 /api/auth/login 被转发成错误路径。

构建产物规则

@skyroc/web-admin-vite 默认会调整 Rollup 输出:

类型输出规则
CSScss/[name]-[hash].css
图片images/[name]-[hash].[ext]
页面 chunkjs/pages/{path}/[name]-[hash].js
组件 chunkjs/components/[name]-[hash].js
其他 JSjs/[name]-[hash].js
vendor chunk默认拆 antdil8nreactreact-router

需要增加 manual chunks 时,不要完全重写 Vite 配置,优先通过 application.build.manualChunks 扩展:

import { defineConfig } from '@skyroc/web-admin-vite';

export default defineConfig({
  application: {
    build: {
      manualChunks: {
        charts: ['echarts']
      }
    }
  }
});

CI 示例

一个最小 CI 构建流程可以是:

corepack enable
corepack prepare pnpm@10.4.1 --activate
pnpm install --frozen-lockfile
pnpm --filter skyroc-admin typecheck
pnpm --filter skyroc-admin build

如果 CI 只做静态部署,上传 apps/admin/dist 即可。实际目录以 Vite build 输出为准。

常见问题

现象先检查
构建时找不到 @skyroc/web-admin-vite 产物是否通过 pnpm --filter skyroc-admin build 执行,让 prebuild 先构建 admin-vite。
线上刷新 /manage/user 404Nginx 或静态服务器是否把未知路径 rewrite 到 index.html
部署在 /admin/ 后资源 404VITE_BASE_URL 是否在构建前改成 /admin/ 并重新构建。
线上仍请求测试后端构建时 mode 是否是 prod.env.prod 是否覆盖了正确的 VITE_SERVICE_BASE_URL
生产环境代理没有生效Vite dev proxy 只服务开发服务器;生产需要真实后端地址或 Nginx/API 网关转发。
sourcemap 没生成当前 VITE_SOURCE_MAP 只是 env 声明,preset 没直接读取;需要在 vite.build.sourcemap 中明确配置。
修改 env 后线上没有变化env 在构建时注入,必须重新构建并发布新产物。

相关链接

On this page