跳到主要内容
FarmFarm
2.x(最新)
简体中文
Version: 2.x(最新)
本页目录

增量构建

从v0.14.0开始,Farm 支持将编译结果缓存到磁盘,这可以大大加快热启动/热构建的编译速度。当启用persistentCache时,编译时间可以减少高达80%。

冷启动(无缓存)和热启动(有缓存)的性能比较使用 examples/argo-pro:

Cold(without cache)Hot(with cache)diff
start1519ms371msreduced 75%
build3582ms562msreduced 84%

使用缓存

使用compilation.persistentCache 来启用/禁用缓存:

ts
import { defineConfig } from '@farmfe/core';

export default defineConfig({
  compilation: {
    persistentCache: true,
  },
});

将persistentCache为false以禁用缓存

缓存验证

缓存在尝试重用时会通过以下条件进行验证,如果以下任何条件发生变化,所有缓存都将失效

  • Env Object:由persistentCache.envs配置,默认为Farm Env Mode(process.env.NODE_ENV, process.env.DEV, process.env.PROD),参见 环境变量和模式。

  • lockfile:如果你的 lockfile (例如 pnpm-lock.yaml) 改变了,意味着有依赖项改变,缓存将失效。

  • 构建依赖项:由persistentCache.buildDependencies配置,如果任何 buildDependency 更改,所有缓存将失效。

  • Cache 命名空间:由persistentCache.namespace配置,不同命名空间下的缓存不会重复使用。如果要使所有缓存失效,可以配置不同的命名空间。

  • 内部缓存版本:Farm 内部维护一个缓存版本,如果 Farm 本身发生了变化,例如,影响 Farm 版本之间输出的渲染优化,Farm 将碰撞缓存版本,所有缓存将失效。

如果您的缓存不起作用,请查看上述条件以找出原因。如果缓存损坏,您还可以删除 node_modules/.farm/cache 以手动删除缓存。

自定义环境变量 (envs)

使用 persistentCache.envs 指定影响缓存键的额外环境变量键值对。当这些值中的任何一个发生变化时,缓存将完全失效:

ts
import { defineConfig } from "@farmfe/core";

export default defineConfig({
  compilation: {
    persistentCache: {
      envs: {
        MY_API_URL: process.env.MY_API_URL ?? '',
      },
    },
  },
});

全局内置缓存键策略 (globalBuiltinCacheKeyStrategy)

通过 persistentCache.globalBuiltinCacheKeyStrategy 控制哪些内置键影响缓存失效。默认情况下,define、buildDependencies、lockfile、packageJson 和 env 模式的变化都会使整个缓存失效。你可以按需禁用各个键:

ts
import { defineConfig } from "@farmfe/core";

export default defineConfig({
  compilation: {
    persistentCache: {
      globalBuiltinCacheKeyStrategy: {
        define: true,            // 当 define 配置变化时使缓存失效
        buildDependencies: true, // 当构建依赖变化时使缓存失效
        lockfile: true,          // 当 lockfile 变化时使缓存失效
        packageJson: true,       // 当 package.json 变化时使缓存失效
        env: true,               // 当环境模式变化时使缓存失效
      },
    },
  },
});

构建依赖项

构建依赖是可以影响编译过程或编译输出的依赖,例如插件或 config 文件。如果这些依赖中的任何一个发生了变化,所有缓存都将失效

构建依赖项可以是包名的文件路径,例如:

ts
import { defineConfig } from '@farmfe/core';
import path from 'node:path';

export default defineConfig({
  persistentCache: {
    buildDependencies: [
      // a file path
      path.resolve(process.cwd(), './plugins/my-plugin.js'),
      // a package name, note that this package must expose package.json
      'farm-plugin-custom-xxx',
    ],
  },
});

模块缓存密钥策略

Farm 提供了 2 种策略来控制如何生成模块缓存键:

  • timestamp: 检查模块的时间戳,如果更新时间戳没有变化,则跳过此模块的构建,具有最佳性能.
  • hash: 加载和转换后检查 content hash,如果内容没有变化,将跳过此模块的剩余构建.

默认情况下,timestamp和hash都是启用的

插件注意事项

当启用timestamp时,不会调用所有构建阶段钩子,如load和transform。因此,如果插件依赖于load和transform,并且没有实现 plugin_cache_loaded 和 write_plugin_cache 钩子,它可能无法按预期工作。例如,如果插件在load和transform中收集信息,所有在finish hook 时发出它们,它应该实现 plugin_cache_loaded 和 write_plugin_cache hook 来加载和写入缓存,否则它将无法按预期工作。

Farm 将设置timestamp为false 当 output.targetEnv是 node

100%

Drag or pinch to explore. Keyboard: + / − zoom, arrows pan, 0 resets, Esc closes.