Vue3中使用pnpm workspace来实现monorepo(pnpm是快速、节省磁盘空间的包管理器。主要采用符号链接的方式管理模块)
全局安装pnpm
创建packages文件夹,用来存放所有的包
搭建monorepo环境,创建pnpm-workspace.yaml文件
- 表示pnpm下载的所有的包都应用在packages下面得模块中
此时如果我们用pnpm安装包会报错
- 我们不能直接安装,我们现在运行的命令在命名空间的根部,我们需要指定下载的包是否作为多个模块之间共享的模块
- -w表示我就是把这个模块作为一个根目录下的共享模块
创建.npmrc文件
- 这是一个npm配置文件,支持你可以继续使用幽灵依赖,比如vue依赖某个模块,你可以直接使用这个模块,但是可能有一天vue不再使用这个模块,这个模块就会失效,做这个配置就是可以支持你继续这样直接使用这个依赖。
下载ts相关依赖
在根模块的packages下创建reactivity文件,cd到这个模块中
初始化包
包起个名字,我们这里跟vue官网保持同步
在生成的package.json中配置选项buildOptions
- 配置name后,包被引入后会在当前脚本中生成一个全局变量
- formats,打包后的格式,global表示可以在全局引用的,也就是浏览器通过script标签引用的,cjs表示可以node中使用,esm-bundler表示在浏览器中使用
同理,我们在packages下创建shared文件夹,共享模块,配置同reactivity
我们需要进行一个打包配置,统一打包必须有统一入口。在reactivity文件夹下创建src文件夹,下面创建index。同理shared下也创建相同的文件
解决模块间相互引用的问题,关联reactivity和shared模块
- 初始化ts
- 在配置文件中配置
- baseUrl表示告诉它以当前路径为基准
- path表示你的路径是@vue/*,那么就去packages下模块中的src里找
比如我们在shared文件下的src下的index.ts里导出一个方法
我们在reactivity里就可以这样引入
打包
根目录下创建一个文件夹script,下面创建dev.js文件
package.json配置开发模式打包命令
- 我们可以传一些参数指定打包的模块以及打包的格式
dev.js脚本
首先通过minimist包来解析获取命令行参数
告诉它打的是哪个包以及打包的格式
找到对应包的package.json
判断打包格式
指定打包目录
用esbuild打包
- 现在主流开发用esbuild打包,生产用rollup
- esbuild打包速度非常快,利于开发。rollup更方便打成各种格式