什么是Monorepo,如何构建一个简单的Monorepo项目
Admin 2022-08-11 群英技术资讯 1182 次浏览
今天小编跟大家讲解下有关“什么是Monorepo,如何构建一个简单的Monorepo项目”的内容 ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了相关资料,希望小伙伴们看了有所帮助。Monorepo这个词你应该不止一次听说了,像Vue3、Vite、ElementPlus等优秀开源项目都是使用Monorepo的方式管理项目,且这里说到的这几个项目都是采用pnpm作为包管理工具。
这篇文章就使用pnpm构建一个简单的Monorepo方式管理的项目。
Q:什么是Monorepo?
A:Monorepo是一种项目管理方式,就是把多个项目放在一个仓库里面,可以参考神三元大佬的一篇文章:现代前端工程为什么越来越离不开 Monorepo?,这篇文章中介绍了Monorepo的概念、收益以及MulitRepo的弊端。
Q:什么是pnpm?
A:pnpm就是一个包管理工具,原生支持Monorepo,比npm和yarn更快一些,其他的可以参考官网和另一篇文章:为什么现在我更推荐 pnpm 而不是 npm/yarn?
现在我们就开始使用pnpm来构建一个Monorepo,在正事开始之前,你先需要保证你的电脑中具有Node.js,我的版本的是16.9.0。
首先你需要有pnpm这个工具,安装的话可以从官网找方法,或者直接使用npm安装,命令如下:
npm i pnpm -g
现在我们开始搞事情。
第一步,创建一个项目的根目录,这里就叫monorepo-demo,咋创建都可,这里使用的是命令:
mkdir monorepo-demo
第二步,初始化package.json,这个没啥说的,命令如下:
pnpm init
这里我对内容做了一点修改,package.json的内容如下:
{
"name": "monorepo-demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"type": "module",
"keywords": [],
"author": "ywanzhou",
"license": "MIT"
}
这里我主要添加了一个type字段,这里我使用ESModule模块化规范。
第三步,创建pnpm-workspace.yaml文件,这个文件定义了工作空间的根目录,内容如下:
packages: - 'packages/ **'
现在我们就可以在packages中创建多个项目了,目录结构如下:
monorepo-demo ├── package.json ├── packages │ ├── components │ │ ├── index.js │ │ └── package.json │ ├── core │ │ ├── index.js │ │ └── package.json │ ├── utils │ │ ├── index.js │ │ └── package.json ├── pnpm-lock.yaml └── pnpm-workspace.yaml
第四步,编写每个项目的package.json,其实主要是编写一下名称,方便以后使用,这里我的如下:
{
"name": "@packages/components",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"type": "module",
"license": "ISC",
"dependencies": {
"lodash": "^4.17.21",
"@packages/utils": "workspace:^1.0.0"
}
}
剩余的两个名称分别为@packages/core和@packages/utils。
其实到这基本工作就准备好了,现在介绍一下如何安装依赖,如何在packageA中引用packageB。
就这个demo来说,我们如果在根目录下安装依赖的话,这个依赖可以在所有的packages中使用,如果我们需要为具体的一个package安装依赖怎么办?
cd到package的所在目录嘛?漏,大漏特漏,我们可以通过下面这个命令:
pnpm --filter <package_selector> <command>
例如我们需要在@packages/components安装lodash,命令如下:
pnpm -F @packages/components add lodash
-F等价于--filter
现在我们在往@packages/utils中安装一个dayjs,命令如下:
pnpm --filter @packages/utils add dayjs
现在我们就来实现package间的相互引用,首先我们在@packages/utils/index.js中写入如下内容:
import dayjs from 'dayjs'
export function format(time, f = 'YYYY-MM-DD') {
return dayjs(time).format(f)
}
然后我们执行如下命令:
pnpm -F @packages/components add @packages/utils@*
这个命令表示在@packages/components安装@packages/utils,其中的@*表示默认同步最新版本,省去每次都要同步最新版本的问题。
安装完成后@packages/components/package.json内容如下:
{
"name": "@packages/components",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"type": "module",
"license": "ISC",
"dependencies": {
"@packages/utils": "workspace: *",
"lodash": "^4.17.21"
}
}
然后我们在@packages/components/index.js写入如下内容:
import { format } from '@packages/utils'
console.log(format(new Date()))
然后我们在项目根目录运行如下命令
node packages/components
即可打印出当前的日期。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
今天来给大家简单的聊一聊Rx响应式编程,对于Rx响应式编程的学习,Observable的内容是需要掌握了解的,因此下面小编就给大家来介绍一下Observable,有这方面学习需要的朋友可以参考。
本文我们来来接怎样实现更容易扩展的JavaScript进度管理方式,下文有很详细的原理介绍及测试,对大家学习和工作都有一定的参考价值,感兴趣的朋友就继续往下看吧。
这篇文章主要为大家详细介绍了Vue dialog模态框的封装方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
JavaScript本地存储与会话存储的实现介绍 目录 一.简单介绍 二.localStorage本地存储 三.sessionStorage会话存储 总结 一.简单介绍 本地存储和会话存储的目的,是将所输入的文件存入到浏览器中,在需要的时候,直接调用,但是本地存储和会话存储有着一定的区别,本地存储,在不主动删除的情况下,会一直保留在浏览器中,会话存储是,当前保存的内容,页面刷新还会保留在浏览器中,但是关闭页面在打开时,会发现没有数据了.这是他们两的用处和区别. 二.localStorage本地存储 如下代码 我们先给button一个监听事件,让
这篇文章主要介绍了vue 组件基础知识的相关资料,帮助大家更好的理解和使用vue的组件,感兴趣的朋友可以了解下
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008