/** * Next应用配置。为webpack与Turbopack安装相同ReactFlow编译扩展,并给带内容摘要的图标分片设置长期缓存。 * 此处只配置应用编译/响应头,不改变headless SDK导出或服务端数据协议。 */ import type { NextConfig } from "next"; /** StrictMode显式开启开发检查,poweredByHeader关闭Next标识响应头;其余保持框架默认行为。 */ const config: NextConfig = { reactStrictMode: true, poweredByHeader: false, /** 在现有规则后追加匹配ReactFlow ESM入口的loader,再返回原配置对象,保留框架其它规则。 */ webpack(config) { // 规则只按路径匹配,不按客户端/服务端分支;loader 自身再检查安装版本和四段源码锚点。 config.module.rules.push({ test: /[\\/]@xyflow[\\/]react[\\/]dist[\\/]esm[\\/]index\.(?:mjs|js)$/, use: [{ loader: require.resolve("./scripts/loaders/xyflow-retained.cjs") }], }); return config; }, // Turbopack使用条件路径匹配同一个入口;单独配置以免切换构建器时丢失保留节点扩展。 turbopack: { rules: { "*": { condition: { path: /[\\/]@xyflow[\\/]react[\\/]dist[\\/]esm[\\/]index\.(?:mjs|js)$/ }, loaders: ["./scripts/loaders/xyflow-retained.cjs"], }, }, }, /** 只给版本目录内带12位十六进制摘要的JSON分片配置一年immutable缓存,文件内容变化应生成新文件名。 * 不对图标目录manifest、页面或全部JSON一概设置immutable。 */ // 这里只匹配 URL 外观,不重新读取文件验证摘要;重生成文件名和旧资源保留由资源脚本/发布流程负责。 async headers() { return [{ source: "/canvas-icons/:version/:asset([a-z0-9-]+-[a-f0-9]{12}\\.json)", headers: [{ key: "Cache-Control", value: "public, max-age=31536000, immutable" }], }]; }, }; export default config;