From 1f0109ebc4086cd4227ffbbc6469f2c7d035b731 Mon Sep 17 00:00:00 2001 From: Yoshihiro OKUMURA Date: Mon, 25 May 2026 20:40:13 +0900 Subject: [PATCH] build: externalize modules data and reorganize dependencies Configure sirv plugin to serve data/modules at /modules during dev and preview, enabling routing without copying large data into dist. Move @types/* packages from dependencies to devDependencies. --- .gitignore | 2 +- package-lock.json | 62 ++++++++++++++++++++++++++++++++++++++++++----- package.json | 13 +++++----- vite.config.ts | 51 +++++++++++++++++++++++++++++++++++--- 4 files changed, 112 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index 544f1ff..63aefaa 100644 --- a/.gitignore +++ b/.gitignore @@ -40,5 +40,5 @@ coverage .eslintcache # Custom - database contents -/public/modules +/data #/src/xoonips/assets/*.json diff --git a/package-lock.json b/package-lock.json index 5c4a57b..444c063 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,12 +9,6 @@ "version": "1.0.0", "dependencies": { "@orrisroot/react-html-parser": "^3.0.0", - "@types/async-lock": "^1.4.2", - "@types/lokijs": "^1.5.14", - "@types/react": "^19.2.15", - "@types/react-dom": "^19.2.3", - "@types/react-router-dom": "^5.3.3", - "@types/react-router-hash-link": "^2.4.9", "async-lock": "^1.4.1", "ky": "^2.0.2", "lokijs": "^1.5.12", @@ -36,12 +30,19 @@ "devDependencies": { "@biomejs/biome": "^2.4.15", "@eslint/js": "^10.0.1", + "@types/async-lock": "^1.4.2", + "@types/lokijs": "^1.5.14", "@types/node": "^24.12.4", + "@types/react": "^19.2.15", + "@types/react-dom": "^19.2.3", + "@types/react-router-dom": "^5.3.3", + "@types/react-router-hash-link": "^2.4.9", "@vitejs/plugin-react": "^6.0.2", "eslint": "^10.4.0", "eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-react-refresh": "^0.5.2", "globals": "^17.6.0", + "sirv": "^3.0.2", "typescript": "~6.0.3", "typescript-eslint": "^8.59.4", "vite": "^8.0.14" @@ -790,6 +791,13 @@ "url": "https://github.com/sponsors/Boshen" } }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -1091,6 +1099,7 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/@types/async-lock/-/async-lock-1.4.2.tgz", "integrity": "sha512-HlZ6Dcr205BmNhwkdXqrg2vkFMN2PluI7Lgr8In3B3wE5PiQHhjRqtW/lGdVU9gw+sM0JcIDx2AN+cW8oSWIcw==", + "dev": true, "license": "MIT" }, "node_modules/@types/esrecurse": { @@ -1111,6 +1120,7 @@ "version": "4.7.11", "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "dev": true, "license": "MIT" }, "node_modules/@types/hoist-non-react-statics": { @@ -1136,6 +1146,7 @@ "version": "1.5.14", "resolved": "https://registry.npmjs.org/@types/lokijs/-/lokijs-1.5.14.tgz", "integrity": "sha512-4Fic47BX3Qxr8pd12KT6/T1XWU8dOlJBIp1jGoMbaDbiEvdv50rAii+B3z1b/J2pvMywcVP+DBPGP5/lgLOKGA==", + "dev": true, "license": "MIT" }, "node_modules/@types/node": { @@ -1161,6 +1172,7 @@ "version": "19.2.3", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "devOptional": true, "license": "MIT", "peerDependencies": { "@types/react": "^19.2.0" @@ -1170,6 +1182,7 @@ "version": "5.1.20", "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "dev": true, "license": "MIT", "dependencies": { "@types/history": "^4.7.11", @@ -1180,6 +1193,7 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "dev": true, "license": "MIT", "dependencies": { "@types/history": "^4.7.11", @@ -1191,6 +1205,7 @@ "version": "2.4.9", "resolved": "https://registry.npmjs.org/@types/react-router-hash-link/-/react-router-hash-link-2.4.9.tgz", "integrity": "sha512-zl/VMj+lfJZhvjOAQXIlBVPNKSK+/fRG8AUHhlP9++LhlA2ziLeTmbRxIMJI3PCiCTS+W/FosEoDRoNOGH0OzA==", + "dev": true, "license": "MIT", "dependencies": { "@types/history": "^4.7.11", @@ -2686,6 +2701,16 @@ "node": "*" } }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -3219,6 +3244,21 @@ "node": ">=8" } }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -3255,6 +3295,16 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/ts-api-utils": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", diff --git a/package.json b/package.json index 825a4a3..ee38547 100644 --- a/package.json +++ b/package.json @@ -13,12 +13,6 @@ }, "dependencies": { "@orrisroot/react-html-parser": "^3.0.0", - "@types/async-lock": "^1.4.2", - "@types/lokijs": "^1.5.14", - "@types/react": "^19.2.15", - "@types/react-dom": "^19.2.3", - "@types/react-router-dom": "^5.3.3", - "@types/react-router-hash-link": "^2.4.9", "async-lock": "^1.4.1", "ky": "^2.0.2", "lokijs": "^1.5.12", @@ -40,12 +34,19 @@ "devDependencies": { "@biomejs/biome": "^2.4.15", "@eslint/js": "^10.0.1", + "@types/async-lock": "^1.4.2", + "@types/lokijs": "^1.5.14", "@types/node": "^24.12.4", + "@types/react": "^19.2.15", + "@types/react-dom": "^19.2.3", + "@types/react-router-dom": "^5.3.3", + "@types/react-router-hash-link": "^2.4.9", "@vitejs/plugin-react": "^6.0.2", "eslint": "^10.4.0", "eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-react-refresh": "^0.5.2", "globals": "^17.6.0", + "sirv": "^3.0.2", "typescript": "~6.0.3", "typescript-eslint": "^8.59.4", "vite": "^8.0.14" diff --git a/vite.config.ts b/vite.config.ts index 4b2bb97..325f172 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,10 +1,55 @@ import react from '@vitejs/plugin-react'; +import type { Connect } from 'vite'; import { defineConfig } from 'vite'; +import sirv from 'sirv'; +import path from 'path'; +import { fileURLToPath } from 'url'; +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +const serveModulesPlugin = () => ({ + name: 'serve-modules', + configureServer(server: { middlewares: Connect.Server }) { + server.middlewares.use( + '/modules', + sirv(path.resolve(__dirname, 'data/modules'), { + single: false, + dev: true, + }), + ); + }, + configurePreviewServer(server: { middlewares: Connect.Server }) { + server.middlewares.use( + '/modules', + sirv(path.resolve(__dirname, 'data/modules'), { + single: false, + dev: false, + }), + ); + }, +}); + export default defineConfig({ - plugins: [react()], + plugins: [react(), serveModulesPlugin()], + server: { + fs: { + allow: [__dirname, path.resolve(__dirname, 'data')], + }, + }, build: { - outDir: 'build', - emptyOutDir: true, + target: 'es2023', + chunkSizeWarningLimit: 1000, + rollupOptions: { + output: { + manualChunks(id) { + if (id.includes('node_modules')) { + if (id.includes('react') || id.includes('react-dom')) { + return 'vendor'; + } + return 'vendor-lib'; + } + }, + }, + }, }, });