SvelteKit用adapter-node部署后,node build运行时无法找到音频文件
问题解答
fs失效的原因
- Node.js的
fs模块仅能识别文件系统的实际物理路径,而$lib是SvelteKit提供的路径别名,Node.js运行时无法解析该别名。部署后构建产物的目录结构与开发阶段的源码结构完全不同,直接用$lib/audio作为路径自然找不到对应文件。 - 即便将音频文件移至
src/lib/server/audio,构建后文件的实际存放路径会发生变化,但代码中仍使用$lib/server/audio这个别名路径,fs依然无法识别并定位文件。
纯Vite解决方案
使用Vite的import.meta.glob批量导入音频文件并直接获取base64编码,Vite会在构建阶段自动处理资源路径与编码,确保运行时能正常访问内容。
修改/src/routes/api/bell/+server.ts代码如下:
import { json } from '@sveltejs/kit'; import type { RequestHandler } from './$types'; // 批量导入audio目录下所有文件,直接获取base64编码 const audioFiles = import.meta.glob('$lib/audio/*', { eager: true, as: 'base64' }); // 将对象转为数组,方便随机选取 const audioEntries = Object.entries(audioFiles); export const GET = (() => { // 随机选取一个音频文件的base64内容 const [, base64Content] = audioEntries[Math.floor(Math.random() * audioEntries.length)]; return json(base64Content); }) satisfies RequestHandler;
关键说明
eager: true:确保在服务器端同步加载所有匹配的音频文件,避免异步加载导致的运行时问题;as: 'base64':告诉Vite直接将音频文件编码为base64字符串,无需额外处理即可直接返回。
内容的提问来源于stack exchange,提问作者SleepingForge
相关产品推荐
相关产品推荐

