farm 懒编译技术通过按需编译策略,只在模块执行时编译动态导入代码,使大型项目启动时间优化近10倍、热更新达毫秒级,并支持路由分割、延迟加载与条件模块等场景。

直接用 BuildKit 的挂载缓存 + 分层 COPY + 多阶段构建,就能显著加速超大前端项目的物理编译(如 Webpack、Vite、Turbopack 等底层打包过程),关键是让依赖安装、构建工具缓存、产物生成三者各自命中缓存,互不干扰。
先分离依赖安装层,锁定 package.json 和 lock 文件
超大前端项目往往有数百个依赖,每次重装 node_modules 是最大瓶颈。必须把依赖声明文件单独拎出来,早于源码复制:
- COPY package.json package-lock.json ./(只复制这两个文件)
- RUN npm ci --no-audit --no-fund(或 yarn install --frozen-lockfile)
- 后续再 COPY . .(此时 node_modules 已存在,且不会因 src/ 或 README.md 变动而失效)
启用 BuildKit 并挂载构建工具缓存目录
现代前端构建器(如 Vite、Turbopack、SWC、ESBuild)会在本地生成缓存(.vite、.turbo、node_modules/.pnpm、.esbuild 等)。BuildKit 的 --mount=type=cache 可持久化这些目录:
- 在 RUN 指令中显式挂载:RUN --mount=type=cache,target=/app/node_modules/.pnpm,id=pnpm-cache npm run build
- 对 Turbopack:RUN --mount=type=cache,target=/app/.turbo,id=turbo-cache npx turbopack build
- 务必指定 id,避免 target 路径变更导致缓存丢失
多阶段构建剥离编译环境,复用中间镜像缓存
物理编译不需要运行时环境,也不该把 devDependencies、TypeScript 编译器、测试工具塞进最终镜像:
- 第一阶段(builder):基于 node:18-bullseye,安装全部依赖并执行 build,输出 dist/ 或 .output/
- 第二阶段(runner):基于 nginx:alpine 或 node:18-alpine-slim,仅 COPY --from=builder /app/dist /usr/share/nginx/html
- CI 中可加 --target builder 单独构建中间镜像,供多个分支共享缓存
用 .dockerignore 切断上下文污染
Docker 构建上下文哈希会包含所有未忽略的文件。哪怕 dist/ 目录里有个 500MB 的 sourcemap,也会让整个缓存失效:
- 在项目根目录写 .dockerignore,明确排除:node_modules, .git, dist, build, .next, .nuxt, .output, *.log, .env.*, .DS_Store, coverage
- 尤其注意排除 IDE 临时文件(如 .vscode、.idea)和 CI 生成物(如 artifacts/)
- 验证方式:docker build --no-cache -t test . && 查看 “transferring context” 行是否明显变小
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











