feat: 部署优化

This commit is contained in:
2026-06-14 21:24:11 +08:00
parent 7ea6c0d4f2
commit 083ede8b6d
6 changed files with 89 additions and 17 deletions

View File

@@ -7,13 +7,34 @@ const ortDistDir = path.resolve(__dirname, 'node_modules/onnxruntime-web/dist')
const vadDistDir = path.resolve(__dirname, 'node_modules/@ricky0123/vad-web/dist')
const publicDir = path.resolve(__dirname, 'public')
// 需要复制到 public 的静态资源
const staticFiles = [
// 需要复制到 public 的 VAD 模型/工作线程
const vadFiles = [
{ src: vadDistDir, name: 'silero_vad_legacy.onnx' },
{ src: vadDistDir, name: 'silero_vad_v5.onnx' },
{ src: vadDistDir, name: 'vad.worklet.bundle.min.js' },
]
// 需要复制到 public 的 ONNX Runtime WASM 文件(生产环境需要)
const ortFiles = [
{ src: ortDistDir, name: 'ort-wasm-simd-threaded.mjs' },
{ src: ortDistDir, name: 'ort-wasm-simd-threaded.wasm' },
{ src: ortDistDir, name: 'ort-wasm-simd.mjs' },
{ src: ortDistDir, name: 'ort-wasm-simd.wasm' },
{ src: ortDistDir, name: 'ort-wasm.mjs' },
{ src: ortDistDir, name: 'ort-wasm.wasm' },
]
/** 把所需文件复制到 public 目录(不存在则复制) */
function copyAssetsToPublic() {
for (const { src, name } of [...vadFiles, ...ortFiles]) {
const srcFile = path.join(src, name)
const destFile = path.join(publicDir, name)
if (fs.existsSync(srcFile) && !fs.existsSync(destFile)) {
fs.copyFileSync(srcFile, destFile)
}
}
}
export default defineConfig({
server: {
proxy: {
@@ -30,21 +51,15 @@ export default defineConfig({
react(),
{
name: 'serve-vad-assets',
// 1. 启动时将 VAD 模型/工作线程复制到 public
// 1. 启动时将 VAD 模型 + ORT WASM 复制到 public
configResolved() {
for (const { src, name } of staticFiles) {
const dest = path.join(publicDir, name)
if (!fs.existsSync(dest)) {
fs.copyFileSync(path.join(src, name), dest)
}
}
copyAssetsToPublic()
},
// 2. 中间件拦截所有 WASM 相关请求,从原始路径提供文件
// 2. 开发模式中间件拦截 WASM 相关请求,确保 MIME 类型正确
configureServer(server) {
server.middlewares.use((req, res, next) => {
const url = req.url?.split('?')[0] ?? ''
// 匹配任意路径下的 ort-wasm 文件(包括 .vite/deps/ 和根路径)
const wasmMatch = url.match(/\/(ort-wasm-simd-threaded\.(mjs|wasm))$/)
const wasmMatch = url.match(/\/(ort-wasm[\w-]*\.(mjs|wasm))$/)
if (wasmMatch) {
const fileName = wasmMatch[1]
const filePath = path.join(ortDistDir, fileName)
@@ -58,6 +73,17 @@ export default defineConfig({
next()
})
},
// 3. 构建阶段确保所有资源都在 dist 中
writeBundle() {
const distDir = path.resolve(__dirname, 'dist')
for (const { src, name } of [...vadFiles, ...ortFiles]) {
const srcFile = path.join(src, name)
const destFile = path.join(distDir, name)
if (fs.existsSync(srcFile) && !fs.existsSync(destFile)) {
fs.copyFileSync(srcFile, destFile)
}
}
},
},
],
})