这是我参与11月更文挑战的第3天,活动详情查看2021最后一次更文挑战
前言
前端代码管理方案可以溯源自NodeJS和NPM的发布(后续会将其与Python的pip、Conda,Rust的Cargo等做一个比较),后续的一体化前端框架或前端工程化方案几乎都是以npm为基础进行管理,但是为了弥补npm的不足之处和解决现代前端开发面对的问题,开发者提出了很多新的解决方案,接下来我们对这些情景和解决方案做一个概览。
前端包管理演进
NPM
npm使用package.json保存其语义化版本控制(semver)信息,其版本控制遵从主流的主版本号.次版本号.补丁版本号来标识,使第三方依赖库在不同机器、开发人员之间保持一致,这解决了前端包管理从0到1的问题。npm本身存在很多问题:比如版本控制并不会严格在每台机器上同步对应补丁版本的依赖库;大多数npm库的嵌套依赖关系很深等。这也导致了后续包管理方案的演进。
Yarn
yarn的提出主要是为了解决npm中补丁版本不一致的问题,使用yarn.lock文件固定了安装的版本号,而且在安装时采用并行安装的方式,提高了依赖包的安装速度。后续npm也加入了package-lock.json这一相同目的的功能。
pnpm
pnpm的介绍可以看这篇文章:关于现代包管理器的深度思考——为什么现在我更推荐 pnpm 而不是 npm/yarn?
pnpm安装的速度快、使用硬链接的方式安装使得占用磁盘空间小、解决了影子依赖问题,并天然支持monorepo(介绍见下条),并且能成本很低的替换npm和yarn,是现在前端开发的推荐工具。
monorepo和lerna
monorepo的介绍可以看这篇文章:现代前端工程为什么越来越离不开 Monorepo?
monorepo解决了前端项目臃肿和分工合作的问题,以lerna为实际工具的代表,目前在很多著名项目比如Babel中都有使用。
后记
值得一提的是,由于各大厂商的各司其职和不断发展,许多别的工具的优点会被采纳、融入进另外的包管理工具。比如npm效仿了yarn.lock,yarn2更新支持了pnpm,pnpm又天然支持monorepo。
开发者在使用时可能会对采用何种工具产生困惑,这些都需要深入了解并结合项目实际进行选取。总的来说笔者倾向于在开发中小型项目、新项目时采用尽可能新的技术,这样不仅利于自己知识的拓展和进步,也能体会到前端不断发展给人带来的思考。