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.
This commit is contained in:
2026-05-25 20:40:13 +09:00
parent 4e4a0c5de1
commit 1f0109ebc4
4 changed files with 112 additions and 16 deletions
+1 -1
View File
@@ -40,5 +40,5 @@ coverage
.eslintcache
# Custom - database contents
/public/modules
/data
#/src/xoonips/assets/*.json
+56 -6
View File
@@ -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",
+7 -6
View File
@@ -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"
+48 -3
View File
@@ -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';
}
},
},
},
},
});