feat(web-platform): release V0.4 balance control

This commit is contained in:
2026-08-24 14:45:52 +08:00
parent dc494f7a2d
commit c12e52f843
19 changed files with 625 additions and 25 deletions
+20 -6
View File
@@ -1,10 +1,24 @@
import {readFileSync} from 'node:fs';
import {dirname,resolve} from 'node:path';
import {fileURLToPath} from 'node:url';
import {defineConfig} from 'vitest/config';
import type {Plugin} from 'vite';
import react from '@vitejs/plugin-react';
const PYODIDE_ASSETS=['pyodide.asm.js','pyodide.asm.wasm','python_stdlib.zip','pyodide-lock.json'] as const;
const pyodideDirectory=resolve(dirname(fileURLToPath(import.meta.url)),'../node_modules/pyodide');
/** 让开发服务器与生产构建都从本地 npm 包提供 Pyodide,保持平台可离线部署。 */
function localPyodideAssets():Plugin {
let isBuild=false;
return {name:'local-pyodide-assets',configResolved(config){isBuild=config.command==='build';},configureServer(server){server.middlewares.use((request,response,next)=>{const name=request.url?.split(/[?#]/,1)[0].replace(/^\/pyodide\//,'');if(!name||!PYODIDE_ASSETS.includes(name as typeof PYODIDE_ASSETS[number])){next();return;}response.setHeader('Content-Type',name.endsWith('.wasm')?'application/wasm':name.endsWith('.zip')?'application/zip':name.endsWith('.json')?'application/json':'text/javascript');response.end(readFileSync(resolve(pyodideDirectory,name)));});},buildStart(){if(isBuild)for(const name of PYODIDE_ASSETS)this.emitFile({type:'asset',fileName:`pyodide/${name}`,source:readFileSync(resolve(pyodideDirectory,name))});}};
}
export default defineConfig({
root: 'web_platform', base: './', plugins: [react()], publicDir: 'public',
build: {outDir: '../web-platform-dist', emptyOutDir: true, target: 'es2022'},
worker: {format: 'es'},
server: {open: true, fs: {allow: ['..']}},
preview: {headers: {'Cache-Control': 'no-store'}},
test: {globals: true, environment: 'jsdom', setupFiles: './src/test/setup.ts', include: ['src/**/*.test.ts', 'src/**/*.test.tsx']}
root:'web_platform',base:'./',plugins:[react(),localPyodideAssets()],publicDir:'public',
build:{outDir:'../web-platform-dist',emptyOutDir:true,target:'es2022'},
worker:{format:'es'},
server:{open:true,fs:{allow:['..']}},
preview:{headers:{'Cache-Control':'no-store'}},
test:{globals:true,environment:'jsdom',setupFiles:'./src/test/setup.ts',include:['src/**/*.test.ts','src/**/*.test.tsx']}
});