时间:2021-05-26
前言
前段时间9月21日参加了在成都举办的第五届FEDAY, 印象比较深刻的是白鹭引擎首席架构师@王泽分享的《框架开发中的基础设施搭建》 ,提到了在下一代白鹭引擎中使用到monorepo模式,以用来管理多个模块,协调各个模块之间的依赖更新。
正好在国庆期间10月5日尤大公开了vue3.0已完成的源码,也是采用了monorepo管理模式,看来monorepo确实有其独到的优势,再加上以前在项目中遇到过相关的痛点,所以深入地了解了一下这种模式,本文将基于vue3.0讨论如何通过monorepo模式来管理代码的。
什么是 monorepo?
monorepo是一种将多个package放在一个repo中的代码管理模式,摒弃了传统的多个package多个repo的模式。
目前 Babel, React, Angular, Ember, Meteor, Jest等许多开源项目都使用该种模式来管理代码。
解决的问题
带来的问题
如何实现 monorepo?
目前业界最佳实践是采用yarn workspace + lerna 来实现,vue3.0也是采用两者结合的方式来实现。
yarn workspace可以实现在一个项目中实现多个模块的依赖新增和共用,而lerna的功能则更完善,不仅可以管理多个模块,还有清除模块node_modules,发布模块到npm,自动更新模块间版本依赖,并支持全量发布和根据改动单独发布等功能。
yarn官方推荐用yarn来处理依赖安装,用lerna来处理依赖更新和发布问题。
下面开始基于monorepo模式来搭建一个仿vue3.0的项目
1. 全局安装 yarn 和 lerna
2. 初始化项目
3. 添加yarn workspace配置
4. 添加模块内容
5. 安装相关依赖
项目中一般只会用到以下3种安装形式
5.1 给根项目安装依赖(一般是公用的开发工具)
5.2 给package安装外部npm包
5.3 给package安装内部npm包
至此已经完成了项目的基础搭建(打包等工程化内容略过,本文主要介绍monorepo相关),似乎主要是yarn在工作,lerna没有没有派上用场,下面来介绍lerna在哪些地方可以赋能vue3.0。
lerna介绍
A tool for managing JavaScript projects with multiple packages.
一个在js项目中用来管理多个package的工具。
主要是便于开发者更加高效简便地管理package本身,依赖,发布。
1. 初始化项目
2. 安装依赖
如果需要重新安装依赖,切记在删除项目根路径的node_modules前进行git提交保存,因为monorepo模式是以软链接的形式来实现内部 package 引用的,直接删除整个node_modules的同时会把所有package的文件删掉,难以恢复!
建议永不进行删除整个node_modules的操作,可以进入node_modules全选后再取消勾选内部package软链接再删除。
// 给所有 package 安装依赖,在对于的目录生成 node_modules,并在 node_modules 中为内部package生成软链接$ lerna bootstrap// 默认会使用 npm 安装,但是本项目使用 yarn,可以指定使用 yarn$ lerna bootstrap --npm-client=yarn // 或者在 lerna.json 配置 {"npmClient": "yarn"}// 上述安装方式如果不同package之间安装了同一个npm包,会造成重复安装,增加安装时间和项目体积// 可以利用 node_modules 向上查找的特性,将所有依赖安装到项目根路径的 node_modules 中,lerna 加上 --hosit即可$ lerna bootstrap --hosit// 使用lerna bootstrap --npm-client=yarn --hoist// 会有冲突,报错--hoist is not supported with --npm-client=yarn, use yarn workspaces instead------------------------------------------------$ yarn // 推荐!! 用 yarn workspace 特性替代 lerna bootstrap3. 清除pacakge中多余的node_modules
4. 查看所有pacakge
5. 查看有改动的pacakge
6. 推送到git和发布到npm(重要)
monorepo demo 链接
总结
本文介绍了vue3.0中monorepo管理模式的实现,通过yarn workspace和lerna两者相结合,达到了在一个repo 中高效便捷地管理多个package的目的。
在我们日常工作中可能没有开发白鹭引擎,vue这类大型框架的需求,但是这不代表我们用不到该模式,下面我总结了几种适合monorepo管理模式的场景:
参考资料
框架开发中的基础设施搭建
Vue 3 源码导读
基于lerna和yarn workspace的monorepo工作流
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言:在vue3.0中使用element框架,因为element是支持vue2.0的,他推出的支持vue3.0的版本叫element-plus官网入口:点我进入
前言随着我们vue3.0的出现,我们的ui组件库也有了一些变化,像我们的旧版的element-ui已经不能在vue3.0中使用了,如果要使用element的话需
Vue变化检测Object使用DefineProperty、数组使用方法拦截实现。最近,Vue3.0将采用ES6Proxy的形式重新实现Vue的变化检测,在官方
实现跨域共3个步骤:1,vue3.0根目录下创建vue.config.js文件;module.exports={devServer:{proxy:{'/api'
熟悉vue的人都知道在vue2.x之前都是使用object.defineProperty来实现双向数据绑定的而在vue3.0中这个方法被取代了1.为什么要替换O