封装Vue组件库(二)、Monorepo 方式组织项目代码

本文主要是介绍封装Vue组件库(二)、Monorepo 方式组织项目代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Monorepo 方式组织项目代码

开发一个组件库,其中可能会有很多的组件。

当组件库开发完毕后,还要发布到NPM或私有仓库供其他人使用。

在使用 ElementUI 的时候,可以完整的引入,也可以根据需要按需引入部分组件以减少打包的体积。

按需引入还需要安装Babel的插件babel-plugin-component,配置.babelrc,比较麻烦。

组件库为了让用户使用方便,可以把每一个组件作为一个单独的包发布到 NPM 上,用户在使用的时候,可以只下载它需要的组件。

当然也可以把所有的组件打包到一起发布。

项目的组织方式

  • Multirepo(Multiple Repository) - 多仓库,每一个包创建一个单独的项目
    • 每个组件都需要一个仓库,都有自己的脚手架package.json,都要下载和管理自己的依赖,都需要单独进行发布。
    • 并且多个组件可能会有相同的依赖,避免不了重复下载这些依赖,还会占用硬盘空间
  • Monorepo(Monolithic Repository) - 一个项目仓库中管理多个模块/包
    • 这种方式只创建一个项目,根目录以脚手架为主
    • 主要内容(所有组件)都放在根目录下的一个统一的目录下,一般命名为 packages。
    • 每个组件在这个目录中配置一个子文件夹
    • 所有的组件都可以放在根目录下的一个统一的目录下,这个目录可以叫做 packages。
      • 使用monorepo的时候,要把所有的包(组件)放到根目录下一个指定的文件夹下
      • 这个文件夹一般命名 packages,也可以叫其他名字
    • 每一个组件在这个目录中配置一个子文件夹,设置为包。
    • 因为所有组件的管理方式都比较类似,相关的配置可以放在根目录。
    • 不同的组件可能会有相同的依赖,这时只需下载一份。
    • 将来的测试、打包、发布也可以在当前项目进行统一的管理。
    • 这样管理项目,对组件库开发来说更方便。
    • 通过monorepo的方式组织代码的结构,可以让每一个包,都可以单独测试,单独发布,以统一管理它们的依赖。

Monorepo 介绍

Monorepo 是项目代码的一种管理方式。

这种方式在一个项目仓库(repo)中管理多个模块/包(package)。

根目录以脚手架为主,主要内容(所有开发的模块,对组件库来说就是组件)都放在根目录下一个统一的目录下,一般命名为 packages。

每个组件在这个目录中配置一个子文件夹,作为一个包,它们遵循比较统一的目录结构。

将来可以通过一些工具管理这些包,还能管理其他工作,例如打包、发布、测试等。

因为所有组件的管理方式都比较类似,相关的配置可以放在根目录。

  • 配合 lerna 或 yarn workspaces 可以管理每个组件的依赖,相同依赖避免重复安装。

  • 将来的测试、打包、发布也可以在当前项目进行统一管理。

  • 并且可以让每一个包都可以单独测试、单独发布,以统一管理它们的依赖。

这个方式管理项目,对组件库开发来说更方便。

很多知名的开源库都是使用这种方式来管理项目的,例如 Vue3、React、Babel 等。

查看这些项目,根目录的内容以脚手架为主,主要内容都在 packages 目录中,分多个 package 进行管理。

|- packages
|  |- pkg1
|  |  |- package.json
|  |- pkg2
|  |  |- package.json
|- package.json

vue3 源码结构

vue-next

package.json
{// 禁止把当前的包发布到NPM,Vue3 发布的是packages下的所有包"private": true,// yarn workspacesworkspaces: ["packages/*"]// ...
}
packages

packages 目录下的内容就是 Vue3 的源码,每一个文件夹就是一个包。

Vue3 把不同功能的代码放到不同的包中进行管理。

  • compiler-xxx 存储和编译器相关的代码
  • reactivity 响应式相关代码
  • runtime-xxx 运行时相关代码

这些包可以单独发布,使用者可以单独去下载使用。

查看单独的包

随便查看一个包的结构(例如 packages/compiler-core):

  • __tests_ 存储测试相关的代码
  • src 当前包的源码
  • LICENSE 版权,内容是开源协议的描述
  • README.md
  • api-extractor.json 配置文件
  • index.js 打包时候的入口
  • package.json
// package.json
{// 将来发布到NPM展示的名字"name": "@vue/compiler-core",// 版本号"version": "3.0.0-rc.10",// 描述"description": "@vue/compiler-core",// 包的入口"main": "index.js",// ...
}

其他的包的目录结构都一样。

使用monorepo管理项目的时候,应尽可能让每一个包的目录结构都是相同的,这样方便将来的管理。

React 源码结构

packge.json

与Vue3中的package.json一样,都包含这两个属性:

{// 禁止把当前的包发布到NPM,Vue3 发布的是packages下的所有包"private": true,// yarn workspacesworkspaces: ["packages/*"]// ...
}
packages

React也是把不同的功能放到不同的包,也可以单独发布到NPM使用。

包的结构

例如查看 packages/create-subscription

  • npm
  • src 源码
  • README.md
  • index.js 打包入口
  • package.json

按照Monorepo的方式组织代码结构

在项目根目录创建 packages 文件夹,这个文件夹下存放所有要开发的组件。

每一个组件对应一个文件夹,每一个文件夹就是一个可以单独发布到NPM的包。

包的结构:

  • packages
    • button - 组件名
      • __test__ - 存放测试相关代码
      • dist - 打包的目录
      • src - 存放源码(.vue文件)
      • index.js - 打包的入口文件
        • 定义组件的install方法,内容是注册组件
        • 导出组件
        • 这样就提供了插件安装和单独注册两个方式去使用这个组件
      • LICENSE - 版权信息(MIT)
      • package.json - 组件的描述信息
      • README.md - 组件的文档

最终效果如:

在这里插入图片描述

之后可以使用plop基于模板快速生成包结构。

这篇关于封装Vue组件库(二)、Monorepo 方式组织项目代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

idea设置快捷键风格方式

《idea设置快捷键风格方式》在IntelliJIDEA中设置快捷键风格,打开IDEA,进入设置页面,选择Keymap,从Keymaps下拉列表中选择或复制想要的快捷键风格,点击Apply和OK即可使... 目录idea设www.chinasem.cn置快捷键风格按照以下步骤进行总结idea设置快捷键pyth

Linux镜像文件制作方式

《Linux镜像文件制作方式》本文介绍了Linux镜像文件制作的过程,包括确定磁盘空间布局、制作空白镜像文件、分区与格式化、复制引导分区和其他分区... 目录1.确定磁盘空间布局2.制作空白镜像文件3.分区与格式化1) 分区2) 格式化4.复制引导分区5.复制其它分区1) 挂载2) 复制bootfs分区3)

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

解决idea启动项目报错java: OutOfMemoryError: insufficient memory

《解决idea启动项目报错java:OutOfMemoryError:insufficientmemory》:本文主要介绍解决idea启动项目报错java:OutOfMemoryError... 目录原因:解决:总结 原因:在Java中遇到OutOfMemoryError: insufficient me

MyBatis中的两种参数传递类型详解(示例代码)

《MyBatis中的两种参数传递类型详解(示例代码)》文章介绍了MyBatis中传递多个参数的两种方式,使用Map和使用@Param注解或封装POJO,Map方式适用于动态、不固定的参数,但可读性和安... 目录✅ android方式一:使用Map<String, Object>✅ 方式二:使用@Param

SpringBoot返回文件让前端下载的几种方式

《SpringBoot返回文件让前端下载的几种方式》文章介绍了开发中文件下载的两种常见解决方案,并详细描述了通过后端进行下载的原理和步骤,包括一次性读取到内存和分块写入响应输出流两种方法,此外,还提供... 目录01 背景02 一次性读取到内存,通过响应输出流输出到前端02 将文件流通过循环写入到响应输出流

java敏感词过滤的实现方式

《java敏感词过滤的实现方式》文章描述了如何搭建敏感词过滤系统来防御用户生成内容中的违规、广告或恶意言论,包括引入依赖、定义敏感词类、非敏感词类、替换词类和工具类等步骤,并指出资源文件应放在src/... 目录1.引入依赖2.定义自定义敏感词类3.定义自定义非敏感类4.定义自定义替换词类5.最后定义工具类

SpringBoot实现图形验证码的示例代码

《SpringBoot实现图形验证码的示例代码》验证码的实现方式有很多,可以由前端实现,也可以由后端进行实现,也有很多的插件和工具包可以使用,在这里,我们使用Hutool提供的小工具实现,本文介绍Sp... 目录项目创建前端代码实现约定前后端交互接口需求分析接口定义Hutool工具实现服务器端代码引入依赖获