You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何保留旧哈希构建文件并合并新文件而非删除?

解决SvelteKit adapter-static构建保留旧哈希文件的问题

首先,emptyOutDir配置不生效的核心原因是:adapter-static在构建流程中会优先执行自身的目录清空逻辑,直接覆盖了Vite的配置。要实现仅添加新构建文件、保留旧哈希文件的需求,可以试试以下两种方案:

方案一:修改Vite与适配器配置,禁用目录清空

在vite.config.js中明确禁用Vite的目录清空,同时调整adapter-static的配置避免强制清空:

import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vite';

export default defineConfig({
  plugins: [sveltekit()],
  build: {
    // 禁止Vite清空输出目录
    emptyOutDir: false
  }
});

接着在svelte.config.js中,给adapter-static添加strict: false配置(部分版本的适配器在严格模式下会强制清空目录):

import adapter from '@sveltejs/adapter-static';
import { vitePreprocess } from '@sveltejs/kit/vite';

/** @type {import('@sveltejs/kit').Config} */
const config = {
  preprocess: vitePreprocess(),
  kit: {
    adapter: adapter({
      // 禁用严格模式,避免强制清空目录
      strict: false
    })
  }
};

export default config;

注意:这个方案在部分SvelteKit版本中可能依然不生效,因为适配器内部的清空逻辑可能不受这些配置完全控制,这时可以用更稳妥的方案二。

方案二:自定义构建脚本,备份恢复旧文件

通过自定义脚本先备份旧的immutable目录,构建完成后再合并回去,确保旧文件不被删除:

  1. 安装fs-extra用于便捷的文件操作:
npm install fs-extra --save-dev
  1. 在项目根目录创建build.js脚本:
import fs from 'fs-extra';
import { build } from '@sveltejs/kit/vite';

async function runBuild() {
  const immutableDir = './build/_app/immutable';
  const tempBackupDir = './temp-immutable-backup';

  // 备份现有immutable文件(如果存在)
  if (await fs.pathExists(immutableDir)) {
    await fs.copy(immutableDir, tempBackupDir);
    console.log('已备份旧的immutable文件');
  }

  // 执行SvelteKit构建
  try {
    await build({ configFile: './vite.config.js' });
    console.log('构建完成');
  } catch (err) {
    console.error('构建失败:', err);
    // 构建失败时清理备份
    if (await fs.pathExists(tempBackupDir)) {
      await fs.remove(tempBackupDir);
    }
    process.exit(1);
  }

  // 合并备份的旧文件到新构建目录(不覆盖新文件)
  if (await fs.pathExists(tempBackupDir)) {
    await fs.copy(tempBackupDir, immutableDir, { overwrite: false });
    await fs.remove(tempBackupDir);
    console.log('已恢复旧的immutable文件');
  }
}

runBuild();
  1. 修改package.json中的构建命令:
"scripts": {
  "build": "node build.js"
}

这样每次构建时,会先把旧的哈希文件备份,构建完成后再把旧文件复制回去——新生成的哈希文件会保留,旧文件也不会被删除,完美解决你提到的旧会话录制无法显示、用户导航报错的问题。

额外注意事项

  • 哈希文件基于内容命名,新构建的文件不会和旧文件重名,合并后不会有冲突。
  • 定期清理过期文件:随着构建次数增加,immutable目录会越来越大,建议定期手动清理不再被引用的旧哈希文件(可通过分析日志或HTML中的引用关系判断)。

内容的提问来源于stack exchange,提问作者Corrl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:05:53