文件
hyb-oa/client/vite.config.ts
T

193 行
5.2 KiB
TypeScript

import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import { VitePWA } from "vite-plugin-pwa";
const PAGE_CHUNK_PATTERNS = {
"page-travel": ["TravelRequestsPage"],
"page-assets": ["AssetRegistryPage", "InventoryChecksPage"],
"page-procurement": ["PurchaseRequestsPage"],
"page-workflow": ["WorkflowTasksPage", "WorkflowTaskDetailPage"],
"page-system": [
"AuditLogsPage",
"ApprovalRulesPage",
"DelegationsPage",
"DepartmentsPage",
"ErpIntegrationPage",
"FeatureFlagsPage",
"InvoicePoolPage",
"LeaveRequestPage",
"MasterDataPage",
"NotificationChannelsPage",
"NotificationsPage",
"ReimbursementDetailPage",
"ReimbursementsPage",
"UserManagementPage",
],
"page-mobile": ["MobileCapturePage", "MobileAssetScanPage", "MobileApprovalsPage"],
} as const;
function resolveManualChunk(id: string) {
if (id.includes("node_modules")) {
if (["react", "react-dom", "react-router-dom"].some((pkg) => id.includes(`/node_modules/${pkg}/`))) {
return "vendor-react";
}
if (id.includes("/node_modules/@tanstack/react-query/")) {
return "vendor-query";
}
if (id.includes("/node_modules/@zxing/browser/")) {
return "vendor-scan";
}
if (
id.includes("/node_modules/@radix-ui/") ||
id.includes("/node_modules/class-variance-authority/") ||
id.includes("/node_modules/clsx/") ||
id.includes("/node_modules/tailwind-merge/") ||
id.includes("/node_modules/sonner/")
) {
return "vendor-ui";
}
return undefined;
}
if (
id.includes("/src/api/http.ts") ||
id.includes("/src/api/types.ts") ||
id.includes("/src/api/errorMessages.ts") ||
id.includes("/src/api/auth.ts") ||
id.includes("/src/auth/") ||
id.includes("/src/components/common/") ||
id.includes("/src/hooks/") ||
id.includes("/src/lib/") ||
id.includes("/src/pwa.ts")
) {
return "app-core";
}
if (id.includes("/src/api/masterData.ts") || id.includes("/src/components/ai/")) {
return "app-domain-shared";
}
for (const [chunkName, pageNames] of Object.entries(PAGE_CHUNK_PATTERNS)) {
for (const pageName of pageNames) {
if (id.includes(`/src/router/lazy/${pageName}.ts`)) {
return chunkName;
}
}
}
return undefined;
}
export default defineConfig({
plugins: [
react(),
VitePWA({
disable: false,
registerType: "autoUpdate",
includeAssets: ["pwa-192x192.png", "pwa-512x512.png", "pwa-maskable-512x512.png"],
manifest: {
name: "hyb-oa 移动工作台",
short_name: "hyb-oa",
description: "海音达工作台移动端入口,支持离线拍照上传与移动审批。",
start_url: "/",
display: "standalone",
background_color: "#ffffff",
theme_color: "#2563eb",
icons: [
{
src: "pwa-192x192.png",
sizes: "192x192",
type: "image/png",
},
{
src: "pwa-512x512.png",
sizes: "512x512",
type: "image/png",
},
{
src: "pwa-maskable-512x512.png",
sizes: "512x512",
type: "image/png",
purpose: "maskable",
},
],
},
workbox: {
cleanupOutdatedCaches: true,
clientsClaim: true,
navigateFallback: "/index.html",
navigateFallbackDenylist: [/^\/api\//],
globPatterns: ["**/*.{js,css,html,ico,png,svg,webmanifest}"],
skipWaiting: true,
runtimeCaching: [
{
urlPattern: ({ request, url }) =>
["script", "style", "font", "image"].includes(request.destination) || url.pathname.endsWith(".webmanifest"),
handler: "StaleWhileRevalidate",
options: {
cacheName: "app-static-runtime",
cacheableResponse: {
statuses: [0, 200],
},
expiration: {
maxEntries: 120,
maxAgeSeconds: 7 * 24 * 60 * 60,
},
},
},
{
urlPattern: ({ request, url }) => {
if (request.method !== "GET") {
return false;
}
return (
url.pathname === "/api/me" ||
url.pathname.startsWith("/api/workflow/tasks") ||
url.pathname.startsWith("/api/workflow/approvers") ||
url.pathname.startsWith("/api/notifications")
);
},
handler: "NetworkFirst",
options: {
cacheName: "app-api-runtime",
networkTimeoutSeconds: 3,
cacheableResponse: {
statuses: [200],
},
expiration: {
maxEntries: 80,
maxAgeSeconds: 30 * 60,
},
},
},
],
},
devOptions: {
enabled: false,
},
}),
],
build: {
rollupOptions: {
output: {
manualChunks(id) {
return resolveManualChunk(id);
},
},
},
},
server: {
proxy: {
"/api": {
target: "http://127.0.0.1:3000",
changeOrigin: true,
},
},
},
});