SvelteKit 找不到使用节点构建运行的音频文件



我有一个API(位于/src/routes/api/bell/+server.ts),它返回一个随机音频文件作为base64。
我的音频文件位于/src/lib/audio(我也尝试过/src/lib/sever/audio)。

我使用raddirSyncreadFileSyncfs读取并返回一个随机文件。在代码:

export const GET = (async () => {
const files = fs.readdirSync('$lib/audio');
const randomFile = files.at(Math.floor(Math.random() * files.length));
const audioBase64 = fs.readFileSync('$lib/audio/' + randomFile, { encoding: 'base64' });
return json(audioBase64);
}) satisfies RequestHandler;

我现在正在尝试使用' adapter-node '进行部署。

运行' node build '并触发API抛出

Error: ENOENT: no such file or directory, scandir '$lib/server/audio'.


我试着:

  • 将音频文件的位置更改为:/src/lib/sever/audio。这样,它们至少看起来包含在.svelte-kit/output/server/_app/immutable/assets/[name].mp3

    的构建中。
  • Using vitesimport.meta.glob。这样我就可以得到随机路径,但我不知道如何在不使用fs的情况下返回文件。

  • 使用import '[filename]?raw'导入音频文件并将其转换为base64。我没有尝试过这个,但我找到了关于这个的线程,它似乎不工作,不适合我的情况,我可能不知道目录中的所有文件。

有谁知道为什么fs不工作或如何'vite only'解决方案看起来像?

如果其他人有这个问题,这是我的工作。

我有我的文件在/src目录,但似乎SvelteKit希望你把文件,如音频和图像在/static目录。

在你的代码中你甚至不需要像/static/img/waveform.svg那样引用它你只需要输入/img/waveform.svg

旧答案

好了,我想我找到解决办法了。

在vite的客户端上使用fs是不允许的(逻辑上),在服务器上是可能的(我认为这可能是一个问题,但只是为了摆脱它,它不是,vite甚至在一些例子中使用fs)。

但是在构建时,vite向文件添加了一些散列,因此fs无法找到它们。

我把我的音频目录添加到我的vite.config.ts:

export default defineConfig({
plugins: [sveltekit()],
build: {
rollupOptions: {
output: {
assetFileNames: '$lib/audio/[name][Extension]'
}
}
}
});

我仍然不确定vite现在把它们放在哪里以及fs如何处理路径,因为这仍在变化,就像位于_app/immutable的图像一样。我猜有一个映射在后台使用。

所以如果有人知道更多关于一个完成的构建,我仍然很感兴趣。


UPDATE # 1:

没有工作,因为sveltekit覆盖了它。即使我在svelte.config.ts中添加了vite配置,它似乎也会这样做。我现在有了一个使用vitesimport.meta.glob的解决方案。不幸的是,我最终得到的路径不再是相对的了。

我打算明天发布一个代码片段。(我还在计划这件事,只是没有时间)

相关内容

  • 没有找到相关文章

最新更新