为什么需要 Farm?
随着 web 项目规模的扩大,构建性能已经成为主要瓶颈,对于一个庞大的项目,使用 webpack 编译可能需要 10min 甚至更多,一次 hmr 更新可能需要 10s 甚至更多,严重降低了研发效率。
因此我们急需极速的构建工具,解决项目编译性能问题。然后 vite/snowpack 这样的 unbundled 工具应运而生,此类工具主要有下面三个特性:
- 使用原生 ESM,在 dev server 启动时不对源文件进行编译和打包,源文件在入口模块执行时才会通过浏览器请求 dev server 编译,编译后的产物返回给浏览器
- HMR 时,只重新编译一个模块,这样 HMR 的时间约等于一个模块的编译时间
- 对外部依赖(如 node_modules 下的依赖)进行预打包
这使得 dev 服务器热启动和 HMR 非常快,但 vite 等工具使用的 Unbundled 模式并不完美,对于大型项目来说仍然存在很大的问题:
- 大量的模块请求:对于一个大型项目,使用上述策略 1、2,首次启动可能需要加载数千个模块,使用原生模块系统加载数千个模块会导致浏览器卡住甚至崩溃。虽然 Dev Server 的启动快了,但是请求时的模块的首次编译依然会耗费大量时间,会有数十秒起步的白屏,编译时间只是转移了,并没有消失。
- 开发和生产之间的不一致