可能很多同学还不知道 Farm , 先给大家介绍一下, Farm 是一个基于 Rust 的 Web 构建工具, 类似 webpack 和 vite,但更快。 Farm 用 resolve, load, transform 把所有的 asset (js/jsx/ts/tsx、css/sass/less、html、静态资源、json 等),并将它们打包成一系列可部署文件。 Farm 作为一个速度极快的构建工具,可帮助您更快的构建出 web / nodejs 应用程序。
接下来就进入正题, 那么如何从已有的 vite 项目迁移到 Farm 呢 ?
从 vite 迁移到 farm 其实非常简单, 因为 farm 内置了对 vite 插件的兼容, 所以您只需要做的是将 vite.config.ts 转换成 farm.config.js。
但是需要注意的是
我们先从基础项目来体会一下从 vite 迁移到 Farm 有多简单
首先还是我们熟悉的创建 vite 项目
pnpm create vite
我们选一个 Vue 项目模版, 创建好项目之后, 我们的 vite.config.ts 应该是这样的
import { defineConfig } from 'vite'import vue from '@vitejs/plugin-vue'export default defineConfig({ plugins: [vue()],})
那么把大象放进冰箱一共需要三步
pnpm install @farmfe/core @farmfe/cli -D
import { defineConfig } from '@farmfe/core'import vue from '@vitejs/plugin-vue'export default defineConfig({ vitePlugins: [vue()],})
然后我们在控制台执行 npx farm start 控制台就可以看到以下命令
执行构建命令 npx farm build
这样就大功告成啦, 是不是非常简单。
接下来我们来迁移一个比较复杂的项目, vue-pure-admin 是一个全面ESM+Vue3+Vite+Element-Plus+TypeScript 编写的一款后台管理系统, 并且模块数量算是比较大, 那么我们使用 Farm 来迁移这个项目, 来进一步体现出 Farm 的优势. 以及迁移的成本到底有多低
首先我们先克隆一下 pure-admin 的仓库代码, 然后查看一下项目的 vite 配置文件, 并提示出迁移所需要修改的地方
import { getPluginsList } from "./build/plugins";import { include, exclude } from "./build/optimize";import { type UserConfigExport, type ConfigEnv, loadEnv } from "vite";import { root, alias, warpperEnv, pathResolve, __APP_INFO__} from "./build/utils";export default ({ mode }: ConfigEnv): UserConfigExport => { const { VITE_CDN, VITE_PORT, VITE_COMPRESSION, VITE_PUBLIC_PATH } = warpperEnv(loadEnv(mode, root)); return { base: VITE_PUBLIC_PATH, root, resolve: { alias }, // 服务端渲染 server: { // 端口号 port: VITE_PORT, host: "0.0.0.0", // 预热文件以提前转换和缓存结果,降低启动期间的初始页面加载时长并防止转换瀑布 warmup: { clientFiles: ["./index.html", "./src/{views,components}/*"] } }, plugins: getPluginsList(VITE_CDN, VITE_COMPRESSION), // https://cn.vitejs.dev/config/dep-optimization-options.html#dep-optimization-options optimizeDeps: { include, exclude }, build: { // https://cn.vitejs.dev/guide/build.html#browser-compatibility target: "es2015", sourcemap: false, // 消除打包大小超过500kb警告 chunkSizeWarningLimit: 4000, rollupOptions: { input: { index: pathResolve("./index.html", import.meta.url) }, // 静态资源分类打包 output: { chunkFileNames: "static/js/[name]-[hash].js", entryFileNames: "static/js/[name]-[hash].js", assetFileNames: "static/[ext]/[name]-[hash].[ext]" } } }, define: { __INTLIFY_PROD_DEVTOOLS__: false, __APP_INFO__: JSON.stringify(__APP_INFO__) } };};
farm 配置基本平替 vite 配置, 我们再来看一下迁移到 farm 所需要修改的配置文件,由于对 css 的处理 farm 和 vite 的处理方向上的差异,所以我们只需要把一些 css 的插件配置替换成 farm 的插件, 其他的 vite 插件完全可以复用
import { getPluginsList } from "./build/plugins";import { type UserConfigExport, type ConfigEnv, loadEnv } from "@farmfe/core";import { root, alias, warpperEnv, __APP_INFO__ } from "./build/utils";import postcss from "@farmfe/js-plugin-postcss";import sass from "@farmfe/js-plugin-sass";export default ({ mode }: ConfigEnv): UserConfigExport => { const { VITE_CDN, VITE_PORT, VITE_COMPRESSION, VITE_PUBLIC_PATH } = warpperEnv(loadEnv(mode, root)[0]); return { compilation: { output: { publicPath: VITE_PUBLIC_PATH, targetEnv: "browser-es2015", filename: "static/[ext]/[name]-[hash].[ext]", assetsFilename: "static/[ext]/[name]-[hash].[ext]" }, resolve: { alias }, script: { plugins: [ { name: "@swc/plugin-remove-console", options: { exclude: ["error"] }, filters: { moduleTypes: ["js", "ts", "jsx", "tsx"] } } ] }, externalNodeBuiltins: false, define: { __INTLIFY_PROD_DEVTOOLS__: false, __APP_INFO__: process.env.FARM_FE ? __APP_INFO__ : JSON.stringify(__APP_INFO__) } }, root, // 服务端渲染 server: { // open: true, port: VITE_PORT }, plugins: [ sass({ legacy: true }), postcss(), { name: "remove-css-filter-plugin", priority: 0, transform: { filters: { resolvedPaths: ["element-plus/dist/index.css"] }, async executor({ content }) { return { content: content.replace(/filter:\s*alpha\(opacity=0\);/g, "") }; } } } ], vitePlugins: getPluginsList(VITE_CDN, VITE_COMPRESSION) };};
我们可以看到 vite 插件完全复用, 需要修改的地方仅仅是一些编译输出的属性, 整体最大的修改点只有这些,我在 vue-pure-admin 项目提了一个 pr, 还有一些设计差异的小细节大家可以在这里 查看 尽管从 Vite 迁移到 Farm 需要进行一些调整和适配,但是这个过程并不复杂,而且可以通过优化提升项目的性能和开发效率。因为确实迁移很简单, 所以本篇文章只是简单的介绍一下 Farm 目前的可用度,随着 Farm 的不断发展和完善,相信它会成为更多项目的首选构建工具。
注:因为 vite 对于源代码是请求时编译,所以此处加上了 “项目可访问时间”(即 “热启动时间” + “页面加载时间”),作为另一个指标来综合对比性能。所以 Farm 在热启动比 vite 快 5 倍左右
farm 已经具有了 所有开发调试 发布 也有很大的提升空间
Farm 开源已经一年多了, 也已经正式的发布了 1.0 版本, 已经达到了生产可用的状态, 不仅仅是从 vite 中迁移, 在 webpack 中迁移, 团队中也做了非常多的尝试, 迁移成本都很低, Farm 下一步计划基于 Farm 打造出下一代 SSR 框架, 也希望可以有更多的同学参与进来, 共同学习进步。
未来,我们将继续撰写更多的文章,深入介绍 Farm 的各项功能以及特性和原理解析,帮助大家更好地理解和使用下一代的构建工具,可以对前端工程化以及代码解析与编译的原理理解之后, 可以更加深入地了解现代前端开发的核心概念和技术,并掌握构建高效、稳定的前端项目的关键技能。让我们共同期待未来的探索和发现,共同探讨前端技术的前沿话题,为构建更加美好的 Web 世界贡献一份力量。
链接:https://juejin.cn/post/7352837711339814963