封装Vue组件库(四)、Yarn workspaces 和 lerna

2024-08-23 01:38

本文主要是介绍封装Vue组件库(四)、Yarn workspaces 和 lerna,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Yarn workspaces

介绍

workspaces 是工作区的意思。

下面是一个简单的 monorepo 的组件库项目结构,每个组件都依赖了一些第三方模块:

|- package.json
|- packages
|  |- button
|  |  |- package.json # 依赖lodash 4
|  |- form
|  |  |- package.json # 依赖lodash 4
|  |- formitem
|  |  |- package.json # 依赖async-validator
|  |- input
|  |  |- package.json # 依赖lodash 3
|  |- steps
|  |  |- package.json

最外层的文件夹里是脚手架 package.json,因为所有的包都有相似的行为,所以这里面放所有包所需要的开发依赖,例如 babel storybook jest等。

packages中下存放所有包,每一个包对应一个组件,不同的包可能有不同的运行依赖(例如上例)。

每个包的 package.json 文件记录自己的依赖,常规情况下,需要给没有给每一个包安装各自的依赖。

button和form拥有相同的依赖(lodash 4),这时会出现重复下载,占用硬盘的情况。

开启 yarn workspaces 之后可以在根目录中使用 yarn install 给所有的包统一安装依赖。

如果不同的包中引用相同的第三方包,这个第三方包只会下载一次,并把相同的依赖,提升到根目录的 node_modules 中减少重复。

如果不同的包引用的依赖版本不同(例如示例中的 lodash 4 和 lodash 3),只会把相同版本的 lodash 提升到根目录的 node_modules 中,input中会单独下载 lodash 3。

npm 不支持 workspaces,所以之前安装依赖都要使用 yarn。

monorepo的项目结构,一般都会配合 yarn workspace 来管理包的依赖。

开启

使用 yarn workspaces 的项目,根目录被称为 workspace root(工作区根目录)。

开启 yarn 的工作区只需要在项目根目录的 package.json 中添加这段代码:

"private": true,
"workspaces": ["packages/*"
]
  • private - 必须设置,作用是项目提交到 github 或 发布到 npm 的时候,禁止提交当前根目录的内容。
    • 当组件库开发完毕后,要发布到 NPM。工作区的根目录一般是脚手架,不需要发布。private 是为了防止意外把内容暴露出去。
  • workspaces - 一个数组,存储要管理的所有包的路径(也可以成为工作区 workspace),支持glob 通配符。
    • 设置工作区中子目录(根工作区中的子工作区),当前设置的是 packages 目录下的任意包。

    • 注意:由于使用通配符,如果这样使用./packages/*将会有问题,详细参考 Dots

使用

官方文档 yarn workspace

本文Yarn的版本是 v1.22.5。

使用 yarn workspaces 后无法直接 yarn add <pkg_name>yarn remove <pkg_name>,需要指定工作区。

  • 安装根工作区(workspace root)的依赖
    • 安装所有工作区都可以使用的依赖,不会被添加到包(子工作区)的 package.json 中
    • 例如:yarn add jest -D -W
    • jest - Facebook 的单元测试工具
    • -D - 作为开发依赖安装
    • -W - --ignore-workspace-root-check表示安装到工作区的根目录
    • 官方命令文档 或 使用 yarn help add在命令行查看
  • 给指定的工作区(包)安装单独的依赖
    • 安装某个包的依赖,不需要切换到这个包的目录下,直接在根目录执行命令
    • 例如:yarn workspace button add lodash@4
    • button - workspace_name 包名,package.json 中设置的 name,不是文件夹名
  • 给所有工作区安装依赖
    • 当项目从 git 仓库中下载后,直接执行 yarn [install] 就可以安装所有依赖
    • 包括每个包各自的依赖,不需要依次去每个包的目录下执行安装命令。
    • 如果多个包引入了相同的依赖,会走动把依赖的包提升到根目录的 node_modules 中,防止重复下载,节省硬盘空间,不需要存储在每个包的 node_modules 中。
    • yarn [install] 可以在项目根目录下执行,也可以在任何一个工作区目录下执行,效果一样。
  • 删除依赖
    • 工作区根目录:yarn remove <pkg_name> -W
    • 指定工作区:yarn workspace <workspace_name> remove <pkg_name>
    • pkg_name 依赖名,不加版本号
  • 执行指定工作区的 scripts 命令
    • yarn workspace <workspace_name> run <script_name>
    • 这样就不需要进入到工作区的目录才能执行它的脚本

这些命令建议在根目录执行

yarn workspace 管理包的流程示例

以上面的目录结构为例:

执行 yarn workspace input add lodash@3 ,当前项目中没有安装过 lodash@3,yarn默认会将其作为公共依赖提取,所以会优先在根目录下的 node_modules 安装 lodash 3.x.x。

然后执行 yarn workspace button add lodash@4 ,由于已安装了不同版本的 lodash,并且当前只有 button 依赖 lodash@4,所以会在 button 工作区目录下的 node_modules 安装 lodash 4.x.x。

接着执行 yarn workspace form add lodash@4,由于 lodash@4 被多个包依赖,并且 lodash@3 只被 input 依赖,所以会将 button 工作区安装的 lodash 4.x.x 提取到根目录的 node_modules 中,form 直接使用它。而原来的 lodash 3.x.x 被移动到依赖它的 input 目录下的 node_modules 中。

此时如果有一个新的包也安装 lodash@3,则根目录 node_modules 下的 lodash 又会替换为 lodash 3.x.x,依赖它的包中的 lodash 被提取,并且依赖 lodash@4 包的 node_modules 下重新包含 lodash 4.x.x。

当依赖数量发生变化,yarn 总会将依赖次数更多的那个版本提取到根目录 node_modules 下,而依赖其他版本的包则在自己目录下的 node_modules 中重复安装。

所以如果安装包的依赖时没有被提取到根目录,请查看根目录下是否已经安装了该依赖。

Lerna

介绍

假设组件库开发完毕,想要把所有组件提交到 Github 和 npm 上。

可以使用 Lerna,它可以统一发布项目中的所有包。

  • Lerna 是 babel 维护自己的 monorepo,并开源出的一个项目。
  • Lerna 是一种工具,用于优化使用git和npm管理多包存储库的工作流程。
  • 用于管理具有多个包的 JavaScript 项目。
  • 它可以一键把代码提交到 git 和 npm 仓库。
  • Lerna 也可以管理包的依赖,它可以选择使用 npm 还是 yarn,需要单独配置。
  • 如果使用 yarn,可以开启 yarn workspaces。
  • 一般会把 Leran 和 yarn workspaces 结合使用。
  • 使用 Lerna 发布,使用 yarn workspaces 管理包的依赖。

使用

  • 全局安装 yarn global add lerna

  • 初始化 lerna init

    初始化完毕会做几件事情:

    • 如果当前项目没有被 git 管理,会进行 git 初始化

    • 在项目根目录创建一个 lerna.json 的配置文件

    // lerna.json
    {// 所要管理的包的路径,默认是["packages/*"],不是从 package.json 获取的// 如果根目录中没有 packages,就会自动创建该目录"packages": ["packages/*"],// 当前项目初始化版本"version": "0.0.0"
    }
    • 在 package.json 中添加开发依赖(保证其他开发者使用时安装了lerna)
    {//..."devDependencies": {//..."lerna": "^3.22.1",}
    }
  • 发布项目 lerna publish

    • 首先要在 Github 上创建一个远程仓库
    • 还需要登录到 npm,发布npm还要保证是 npmjs 的镜像源
    • 然后再运行 lerna publish,可以同时把项目提交到 Github,并把所有的包发布到 npm
    # 检查npm是否登录
    npm whoami
    # 登录npm
    npm login
    # 查看npm镜像源是否是npmjs: https://registry.npmjs.org
    npm config get registry
    
    # 发布
    lerna publish
    # 选择提交的版本,根据需要选择
    ? Select a new version (currently 0.0.0) (Use arrow keys) # Patch(0.0.1)
    # 是否要提交这些包,把这些包从0.0.0的版本提升为0.0.1
    ? Are you sure you want to publish these packages? (ynH) # Y
    # 接着就会提交到github并发布到npm,如果npm上有同名的包就会发布失败。
    

    发布后,每个包下的 package.json 中的 version 被修改为新的版本号 0.0.1

    lerna 会以新的 version 创建 tag(例如当前就是 v0.0.1),并将这些改动提交到 git 和 npm。

注意:

  • 如果包的内容没有改动,lerna会提示lerna success No changed packages to publish,不会发布。
  • 包改动了,还需要提交commit,否则lerna识别不到它的更新,也不会发布。

learn publish 发布时还会在包的 package.json 中添加 gitHead 字段,存储一个 SHA。

但是我在执行命令的时候,虽然中途添加了这个字段,但最终又被移除了,目前不知道为什么。

庆幸的是,似乎没有影响到什么。

lerna publish 可以根据需要发布全部或部分包,具体参考官方文档 @lerna/publish

这篇关于封装Vue组件库(四)、Yarn workspaces 和 lerna的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1097992

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

【 html+css 绚丽Loading 】000046 三才归元阵

前言:哈喽,大家好,今天给大家分享html+css 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 📚一、效果📚二、信息💡1.简介:💡2.外观描述:💡3.使用方式:💡4.战斗方式:💡5.提升:💡6.传说: 📚三、源代码,上代码,可以直接复制使用🎥效果🗂️目录✍️

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo

HTML提交表单给python

python 代码 from flask import Flask, request, render_template, redirect, url_forapp = Flask(__name__)@app.route('/')def form():# 渲染表单页面return render_template('./index.html')@app.route('/submit_form',