随着Nuxt3项目的越建越多,逐渐出现了一些开发方面的麻烦事,比如:
- 每个项目单独安装依赖的话,node_modules包大致要500-800M左右,项目多的话占用空间成倍上升。
- Nuxt3加上Vue全家桶的产品更新都很快,每个项目版本不一致,项目多的时候也容易蒙圈。
- 自己做了一些Node包,不需要发布,也想随着Nuxt3的项目一起使用。
于是使用PNPM作为包管理器的前提下,使用PNPM自带的workspace,则完美的解决了这些问题。
第一种方式所有项目都跟随根项目共享一套Node_Modules
应用场景:比如我有4个项目,并且分了2个类别(客户网站,开源项目)
先看一下最终的目录结构
TestWeb // 总目录
├─ node_modules // 总的包目录
├─ clients // 这个分类的目录
│ ├─ apple
│ │ ├─ page
│ │ ├─ node_modules
│ │ └─ package.json
│ └─ huawei // 当前项目跟目录
│ ├─ public
│ ├─ node_modules // 当前项目的node包目录
│ └─ package.json
├─ projects
│ ├─ pj01
│ │ ├─ plugins
│ │ ├─ node_modules
│ │ └─ package.json
│ └─ pj02
│ ├─ components
│ ├─ node_modules
│ └─ package.json
├─ Readme.md
├─ .npmrc
├─ package.json
├─ pnpm-lock.yaml
└─ pnpm-workspace.yaml
具体操作如下:
- 新建一个总的跟目录名为:
webs
- 在webs目录下添加3个文件分别是:
pnpm-workspace.yaml
,.npmrc
,package.json
- 配置这3个文件(下面有示例)
- 配置好之后,cd到你的某个项目内安装依赖,如下:bash
# 这里根据你的需求安装依赖,最后记得要加-w # 加-w 安装依赖到总的跟目录下的node_modules,而不是当前项目的node_modules pnpm add nuxt sass -w
- 之后就可以尽情玩耍了。记得以后添加依赖都要加
-w
pnpm-workspace.yaml
的配置
yaml
# 每个子目录写一行,按下面类似格式去写。
packages:
- 'clients/**'
- 'projects/**'
# 如果你并不需要这么多分类,只想把你的三五七个项目放一起
# 就可以只写一个就行,名字你自己定,例如:
packages:
- 'pkgs/**'
下面看一下总的package.json
的配置和子项目的package.json
配置的区别
这个是总的package.json配置
json
{
"name": "webs",
"version": "0.0.3",
"description": "My Workspace",
"author": "Michael",
"scripts": { },
"dependencies": {
"element-plus": "^2.3.4"
},
"devDependencies": {
"eslint": "^8.40.0",
"nuxt": "^3.4.3"
},
"pnpm": {
//允许项目中使用已被废弃的软件包版本(相当于屏蔽warn警告)
"allowedDeprecatedVersions": {
"stable": "*",
"rollup-plugin-terser": "*",
"sourcemap-codec": "*",
"stringify-package": "*",
},
// 定义 PNPM 在解决软件包的对等依赖关系
"peerDependencyRules": {
// 忽略一些包的版本不同导致的警告
"ignoreMissing": [
"webpack",
"vite",
"vue"
]
}
}
}
这个是子项目的package.json
配置,在子项目中不需要在写版本号了,统一跟随总的package就好了。
json
{
"name": "apple",
"version": "0.0.1",
"description": "My Workspace",
"author": "Michael",
"scripts": { },
"dependencies": {
"element-plus": "*"
},
"devDependencies": {
"eslint": "*",
"nuxt": "*"
}
}
.npmrc的配置
bash
shamefully-hoist=true
shell-emulator=true
下面是单介绍一下PNPM是一种现代化的包管理工具,它支持使用Workspaces(工作区)来管理项目的依赖关系。Workspaces是一种将多个相关项目组织在一起的概念,其中每个项目可以有自己的依赖关系,同时还可以共享一些公共的依赖。
PNPM Workspaces的特点和用途如下:
- 多项目管理:PNPM Workspaces允许您在一个父级项目中同时管理多个相关的子项目。这对于大型项目、单体应用程序和分布式代码库非常有用,因为您可以将相关的代码组织在一起,并轻松管理它们的依赖关系。
- 共享依赖:PNPM Workspaces通过将公共依赖安装在父级项目中来提供共享依赖的功能。这意味着如果多个子项目都依赖于同一个软件包,那么该软件包只会在父级项目中安装一次,从而减少了磁盘空间的占用,并且可以更快地安装和更新依赖。
- 优化安装和更新:PNPM使用了一种称为“硬链接”的机制,它能够在安装和更新依赖时显著减少所需的磁盘空间和时间。它会将共享的依赖项链接到各个子项目中,而不是复制它们。这种机制使得依赖项的安装和更新变得非常高效。
- 并行安装:PNPM能够以并行的方式安装依赖项,这意味着它可以更快地完成安装过程。通过最大程度地利用系统资源,它可以同时处理多个依赖项的安装,从而提高开发效率。
- 易于使用和迁移:PNPM提供了一个简单易用的命令行界面,可以方便地初始化、安装、更新和构建项目。对于使用其他包管理工具(如npm或Yarn)的项目,迁移到PNPM也相对容易,因为PNPM支持大部分与npm和Yarn兼容的命令和配置。
总的来说,PNPM Workspaces通过提供多项目管理、共享依赖、优化安装和更新、并行安装等特性,可以帮助开发者更好地组织和管理复杂的项目结构,并提高开发效率。