资讯动态

Farm:用 Rust 重写的 Vite 兼容极速 Web 构建工具

发布时间:2026/10/13 9:27:11 来源:尧图企业网站定制
前端构建构建工具开发工具【免费下载链接】farmExtremely fast Vite-compatible web build tool written in Rust项目地址https://gitcode.com/gh_mirrors/fa/farm点击查看免费下载Farm 是一个完全用 Rust 编写的、与 Vite 兼容的 Web 构建工具定位为下一代构建工具。它把编译核心下沉到 Rust 层同时保留 JavaScript 生态的灵活插件系统用于解决大型项目中开发服务器请求过多、开发与生产不一致、代码分割不灵活等痛点。阅读本文你将掌握 Farm 的核心设计动机、主要特性、快速启动方式以及它在源码层面的实现依据能够在实际项目中评估并落地使用。为什么需要 Farm三大痛点Farm 的诞生源于现有构建工具的两类问题webpack 等工具太慢而 Vite 这类新工具在大型项目中仍有明显短板。官方 README 明确列出 Vite 的三个痛点开发期请求数量巨大当单个页面有成百上千个模块时浏览器需要发起大量请求页面刷新时的加载性能严重下降甚至可能耗时数秒开发与生产不一致开发和生产使用不同的策略与工具链导致线上问题难以调试代码分割不灵活难以精确控制产物 bundle 的划分。Farm 的目标是针对性地解决这些问题并凭借 Rust 实现的高性能来又快又好。这一设计动机与 RFC-001 Architecture 中的 workspace 组织方式一脉相承核心 crates 全部用 Rust 编写确保编译性能。核心特性一览Farm 目前已是1.0 stable 并生产可用。根据 README其特性矩阵包括特性说明⚡ 极速用 Rust 编写毫秒级启动 React/Vue 项目大多数场景下 HMR 更新在 20ms 内完成⚡ 增量构建默认启用模块级持久缓存模块在未变化前不会被重复编译 完全可插拔且兼容 Vite一切皆插件开箱支持 Vite 插件支持编译期插件Rust 插件、JavaScript 插件与 SWC 插件、运行时插件与服务器插件⚙️ 强大开箱编译 JS/TS/JSX/TSX、CSS、CSS Modules、HTML 与静态资源官方提供 React、Vue、Sass、Less、PostCSS 等编译插件⏱️ 懒编译Lazy Compilation动态导入的资源仅在请求时才编译加速大型项目构建只需写一个dynamic import被导入模块在执行前不会被编译 部分打包Partial Bundling自动将项目打包为少量合理 bundle既加快资源加载又不损失缓存粒度 一致性开发环境所见即生产环境所得 兼容性同时支持旧版ES5与现代浏览器其中有三点需要特别强调Vite 插件直用自 Farm v0.13 起Vite 插件可以直接在 Farm 中使用持久缓存默认开启自 Farm v0.14 起磁盘持久缓存默认启用生产优化完整已实现 tree shake 与 minification 等全部 Web 构建工具能力官方称已成功迁移企业级项目到 Farm。快速开始创建项目Farm 提供了官方的项目脚手架使用你喜欢的包管理器即可一键创建# with npm npm create farmlatest # with yarn yarn create farmlatest # with pnpm pnpm create farmlatest该脚手架对应仓库中的 packages/create-farm 目录。仓库的 package.json 同时显示Farm 官方要求的 Node 版本为20、pnpm 为9且使用pnpm作为包管理器packageManager: pnpm9.4.0并通过preinstall钩子强制 only-allow pnpm。典型配置文件结构创建一个项目后其核心配置入口为farm.config.ts或farm.config.mjs。以下是一个综合了常用配置项的示例参考 examples/react/farm.config.js 与 examples/vite-adapter-vue/farm.config.tsimport { defineConfig } from farmfe/core; import react from farmfe/plugin-react; export default defineConfig((env) { return { compilation: { sourcemap: true, persistentCache: { // 自定义缓存目录默认在 node_modules/.farm/cache cacheDir: node_modules/adny/cache, }, presetEnv: false, minify: false, progress: false, runtime: { isolate: true, }, output: { path: dist, }, partialBundling: { targetMinSize: 200 * 1024, enforceTargetMinSize: true, groups: [ { name: vue-pack, test: [node_modules/vue, node_modules/vue-router], }, ], }, }, server: { port: 4000, proxy: { ^/(api|login|register|messages): { target: https://petstore.swagger.io/v2, ws: true, }, }, }, plugins: [react({ useAbsolutePath: true }), farmfe/plugin-sass], }; });深入源码Farm 为什么这么快Rust 原生核心与双插件体系Farm 的编译核心位于 crates/compiler编译上下文与数据结构位于 crates/core。在 crates/compiler/src/lib.rs 中Compiler::new会按优先级注册一批内置 Rust 插件script meta、runtime、script、partial bundling、html、css、static assets、json、define、resolve并按配置条件追加 lazy compilation、tree shake、minify、mangle exports、polyfill、progress、file size 等插件最后再追加外部插件适配器。这种核心编译在 Rust 内完成、插件系统横跨 Rust 与 JavaScript的架构正是其性能来源。同时 Cargo.toml 的 workspace 声明了完整的插件目录crates/*、rust-plugins/*、rust-ecosystem/*其中 crates/plugin_tree_shake、crates/plugin_partial_bundling、crates/plugin_minify、crates/plugin_lazy_compilation 等均为编译管线中的独立 crate。模块级持久缓存从 v0.14 起持久缓存默认启用。在 packages/core/src/config/normalize-config/normalize-persistent-cache.ts 中可以清晰地看到其默认行为默认缓存目录为node_modules/.farm/cache若未显式配置undefined或true会填充buildDependencies: []、moduleCacheKeyStrategy: {}、envs: {}并启用内置缓存键策略globalBuiltinCacheKeyStrategy默认覆盖define、buildDependencies、lockfile、packageJson、env五类define配置、package.json中的关键字段type、name、exports、browser、main、module以及package-lock.json/yarn.lock/pnpm-lock.yaml锁文件的变化都会被纳入缓存失效判定缓存目录最终通过path.resolve(resolvedRoot, ...)归一化到绝对路径。其效果正如 README 所说任何模块在变化之前不会被编译两次。而增量更新的实现则在 crates/compiler/src/update/mod.rs通过diff_and_patch_module_graph模块图差异与补丁、patch_module_group_graph模块组图补丁、regenerate_resources受影响资源重新生成三步完成 HMR 更新只有受影响模块组才会被重新渲染。懒编译Lazy Compilation懒编译插件在 crates/plugin_lazy_compilation/src/lib.rs 中实现其priority()返回i32::MAX即优先于所有其他插件执行。它通过虚拟模块后缀.farm_dynamic_import_virtual_module常量DYNAMIC_VIRTUAL_SUFFIX拦截动态导入dynamic import的模块在真正执行之前不会被编译从而为大型项目显著加速。对应配置项为compilation.lazyCompilation见 packages/core/src/types/binding.ts。部分打包Partial Bundlingcompilation.partialBundling的核心参数源码定义见 packages/core/src/types/binding.ts参数默认值作用targetConcurrentRequests25初始加载或动态资源加载时Farm 尽量使资源数量接近该值targetMinSize20KB每个生成资源压缩前的最小体积targetMaxSize1500KB每个生成资源压缩前的最大体积groups-一组应被打包在一起的模块如{ name, test: string[], groupType?: mutable/immutable, resourceType?: all/initial/async }enforceResources-强制始终位于同一 bundle 的模块匹配数组immutableModules[node_modules]匹配不可变模块的正则数组实现上crates/compiler/src/generate/partial_bundling.rs 先分析模块图生成 ModuleGroupGraph再生成 ResourcePotMap而 crates/plugin_partial_bundling/src/lib.rs 中的算法步骤为①生成 module buckets 并按模块组分组②按模块组生成 resource pots。官方设计文档见 RFC-003 Partial Bundling仓库内对应测试快照位于 crates/compiler/src/generate/snapshots。开发与生产一致性一致性目标在配置归一化中体现为同一套配置同时驱动 dev 与 build。核心命令类型dev / build / watch / preview定义于 packages/core/src/config/types.ts且output.targetEnv见 packages/core/src/types/binding.ts决定了产物面向的运行时环境可选值包括browser、node、node16、node-legacy、browser-es2015、browser-es2017、browser-esnext、library等。Farm 会按目标环境自动降级语法并注入 polyfill这从机制上保证了开发所见即生产所得。Vite 插件兼容生态无缝衔接自 v0.13 起Farm 可以直接使用 Vite 插件。实现机制是 packages/core/src/plugin/js/vite-plugin-adapter.ts 中的VitePluginAdapter——它把 Vite 插件基于 Rollup hook 语义适配为 Farm 的 JS 插件仅从 vite 导入类型而非实际依赖 vite同时通过ViteDevServerAdapter提供 dev server 层面的兼容。在配置中Vite 插件统一放在vitePlugins数组里并且可以为插件声明 filters匹配的模块路径才会被处理。examples/vite-adapter-vue/farm.config.ts 展示了同时使用多个 Vite 插件的完整示例vitejs/plugin-vue、vitejs/plugin-vue-jsx、unplugin-auto-import、unplugin-vue-components等function configureVitePluginVue() { return { vitePlugin: vue(), // 未匹配的模块路径将被跳过 filters: [!node_modules, node_modules/my-ui], }; } export default defineConfig({ compilation: { persistentCache: false, output: { path: build }, partialBundling: { targetMinSize: 200 * 1024, enforceTargetMinSize: true, groups: [{ name: vue-pack, test: [node_modules/vue] }], }, }, plugins: [sass(), less({ lessOptions: { javascriptEnabled: true } }), postcss()], vitePlugins: [ ViteSvgLoader(), VueRouter(), configureVitePluginVue, vueJsx(), AutoImport({ resolvers: [ElementPlusResolver({ importStyle: sass })] }), Components({ resolvers: [ElementPlusResolver({ importStyle: sass })] }), ], });浏览器兼容与 ES5 支持Farm 同时支持旧版ES5与现代浏览器。这一能力由三部分协同提供均可在 crates/compiler/src/lib.rs 的插件注册逻辑中验证presetEnvcompilation.presetEnv布尔或{ include, exclude, options, assumptions }类型见 packages/core/src/types/binding.ts启用时会注入 crates/plugin_polyfill 插件script.targetcompilation.script.target可指定es3、es5、es2015直至esnext的语法目标targetEnvoutput.targetEnv的browser-legacy等值组合决定语法降级与 polyfill 的注入策略。三者配合即可实现现代浏览器走高效产物、旧浏览器自动降级的差异化构建。基准测试性能对比Farm 在其 benchmark 中宣称相对同类工具有显著速度优势README 表述为约20x快于 webpack、10x快于 Vite具体方法细节见官方性能对比仓库。仓库 assets 目录下保留着对应的基准测试截图开发态热启动与常规构建这里展示其中一张供参考Farm benchmark 性能对比图开发热启动场景.jpg)需要注意的是性能数据受项目规模、硬件与基准方法影响建议结合自身项目实测。仓库中的 bench 目录与 e2e 测试scripts/test-e2e.mjs、e2e可用于复现与验证部分场景。参与贡献与社区Farm 仓库欢迎社区贡献贡献指引见 CONTRIBUTING.md中文版见 CONTRIBUTING.zh-CN.md。其插件生态分布在仓库内的 rust-plugins、js-plugins 与 rust-ecosystem 目录官方文档站点源码位于 websiteDocusaurus 项目包含 docs 与多语言 i18n 文档。如果想要深入源码可以重点阅读 crates/compiler、crates/core 与 packages/core 三个目录。小结Farm 的核心思路可以概括为Rust 核心保证性能插件化保证灵活Vite 兼容保证生态。其源码仓库同时展示了编译管线的完整实现模块图构建、增量更新、部分打包、tree shake、minify、JS/Rust 双语言插件体系、Vite 插件适配层以及完善的示例examples 下包含 React、Vue、SSR、多页面、Tailwind 等数十个可直接运行的项目。对于追求构建速度、又不想离开既有 Vite 插件生态的团队Farm 是一个值得评估的替代方案。赞分享前端构建构建工具开发工具【免费下载链接】farmExtremely fast Vite-compatible web build tool written in Rust项目地址https://gitcode.com/gh_mirrors/fa/farm点击查看免费下载相关推荐Farm下一代极速Web构建工具Farm下一代极速Web构建工具 项目介绍 Farm是一款由Rust编写的极速Web构建工具专为现代Web开发而设计。它不仅与Vite兼容还解决了Vite前端构建构建工具开发工具napari高级可视化技巧10个提升图像分析效率的实用方法napari高级可视化技巧10个提升图像分析效率的实用方法 napari是一款快速、交互式的多维图像查看器专为Python环境设计能够帮助科研人员和数据分数据可视化桌面应用科研Farm 核心架构解析Rust 如何重塑现代构建工具Farm 核心架构解析Rust 如何重塑现代构建工具 Farm 是一个基于 Rust 开发的极速 Vite 兼容 Web 构建工具它通过创新的架构设计实现了前端构建构建工具开发工具上一篇Red Panda Dev-C 代码解析器源码剖析后台线程如何高效解析 MinGW-w64 头文件符号下一篇mlpack 树型策略TreeType Policy完全指南从空间树定义到遍历剪枝的源码级解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑