【NPM】工程化依赖包/库开发 之 常见开发结构/模式及特点

在开发 npm 包时,主流的开发结构和模式有一定的共性,这些结构和模式主要是为了提高可维护性、扩展性以及代码质量。

以下是几种常见的 npm 包开发结构和模式:

一、package 结构

下面介绍常见的 package 结构及特性

1. 单一包结构 / 模式

这种单一包结构/Monolith(单仓单包)模式,适用于开发一个独立的 npm 包,代码和依赖相对简单。

目录结构:

my-package/
├── src/                 // 源代码目录
│   ├── index.ts         // 入口文件
│   ├── utils/           // 工具函数目录
├── tests/               // 测试代码
│   └── index.test.ts
├── dist/                // 编译后的输出目录(一般不会加入到源码管理)
├── package.json         // npm 配置文件
├── tsconfig.json        // TypeScript 配置文件
├── README.md            // 包文档
├── .eslintrc.json       // ESLint 配置
└── .prettierrc          // Prettier 配置

关键特性:

  • 适用于中小型 npm 包项目。
  • 使用工具如 ESLintPrettier 来规范代码风格。
  • 使用 JestVitest 等工具进行单元测试。
  • 使用 TypeScript 来提供类型支持。
  • dist/ 目录通常是通过构建工具(如 BabelTypeScript 编译器)生成的发布代码。

构建工具:

  • Rollup:常用的打包工具,适合小型库,支持生成 UMDESM 等多种格式。
  • esbuild:超快的 JavaScript 打包工具,适合追求编译速度的场景。
  • Vite:虽然更常用于开发应用,但也可以用于 npm 包的快速开发。

2. 多包结构 / 模式

这种多包结构/Monorepo(单仓多包)模式,适用于开发包含多个模块或工具的 npm 包项目,尤其是大型项目或库。

目录结构:

my-monorepo/
├── packages/
│   ├── package-a/
│   │   ├── src/
│   │   ├── package.json
│   ├── package-b/
│   │   ├── src/
│   │   ├── package.json
├── node_modules/
├── package.json         // 根 package.json 文件
├── pnpm-workspace.yaml  // pnpm workspace 配置
├── tsconfig.json        // 根 tsconfig 文件
└── README.md

关键特性:

  • Monorepo 管理多个相互依赖的包,比如 React Babel 都采用这种模式。
  • pnpmYarn WorkspacesLerna 通常用于管理依赖关系和工作空间。
  • 每个包(package-apackage-b)可以有自己独立的 package.json 文件,但通过统一的工具管理。
  • 通常支持共享工具链,如 ESLintPrettierJest 等。

构建工具:

  • Lerna:经典的 Monorepo 管理工具,用于管理版本、依赖、发布等。
  • Turborepo:新兴的高性能 Monorepo 管理工具,支持并行任务执行。
  • pnpmYarn workspaces:用于管理工作空间的依赖和共享依赖

二、特性包(库)的开发特点

以下介绍几个常见的特性依赖包的开发特点

1. UI 组件

开发 UI 组件库,侧重样式管理和文档演示。

目录结构:

my-ui-library/
├── src/
│   ├── components/        // 组件目录
│   ├── index.ts           // 入口文件
├── themes/                // 主题和样式文件
│   ├── default.scss       // 默认主题样式
├── stories/               // Storybook 文件
│   └── Button.stories.tsx
├── dist/                  // 打包输出目录
├── package.json
├── tsconfig.json
├── README.md
├── .storybook/            // Storybook 配置
└── .eslintrc.json         // ESLint 配置

关键特性:

  • 使用 SassLessCSS-in-JS 来管理样式。
  • 使用 StorybookVitePress 生成组件文档及可视化展示。
  • 使用 RollupVite 进行打包,通常会输出多种格式(ESMCJS)。
  • 组件通常是按需加载的,因此需要支持树摇优化(tree-shaking)。

2. 函数

开发此类包/库,主要提供的是工具函数或 API,可以采用较为简洁的目录结构。

目录结构:

my-utility-library/
├── src/
│   ├── index.ts         // 函数库的主入口
│   ├── utils/           // 各种工具函数
├── tests/
│   ├── index.test.ts    // 单元测试
├── dist/                // 打包输出目录
├── package.json
├── tsconfig.json
├── README.md
├── .eslintrc.json       // ESLint 配置
└── .prettierrc          // Prettier 配置

关键特性:

  • 核心是函数的实现,通常强调小而美的设计。
  • 强调类型安全性,通常会有 TypeScript 的完整支持。
  • 单元测试非常重要,确保函数逻辑的准确性

3. 插件

这种模式适用于开发针对其他框架或系统的插件(如 Babel 插件、Webpack 插件)。

目录结构:

my-plugin/
├── src/
│   ├── index.ts         // 插件的核心代码
├── tests/
│   ├── plugin.test.ts
├── dist/
├── package.json
├── tsconfig.json
└── README.md

关键特性:

  • 针对特定框架或工具提供扩展功能。
  • 插件类库通常包含对目标工具的钩子或配置函数。
  • 需要有较好的文档支持,帮助用户理解如何集成和使用。

三、常见工具链

  • TypeScript:用于类型安全的开发。
  • Rollup / Vite / Parcel / esbuild:打包工具,根据项目大小选择合适的工具。
  • Jest / Vitest:用于编写单元测试。
  • ESLint / Prettier:用于代码质量和风格的检查。
  • pnpm / Lerna:用于依赖管理和 Monorepo 管理。

四、总结

  • 选择合适的结构和模式,取决于 npm 包的规模、功能以及未来的扩展性需求。
  • 对于中小型库,单包结构即可满足;
  • 而对于大型项目或多个包组成的项目,Monorepo 模式更为合适。
  • 根据具体情况选择相应的工具和开发模式,是提高开发效率和代码质量的关键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/456570.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

金融工程--pine-script 入门

背景 脚本基本组成 策略实现 实现马丁格尔策略 初始化变量:定义初始资本、初始头寸大小、止损百分比、止盈百分比以及当前资本和当前头寸大小等变量。 更新头寸:创建一个函数来更新头寸大小、止损价格和止盈价格。在马丁格尔策略中,每次亏…

micro-app【微前端实战】主应用 vue3 + vite 子应用 vue3+vite

micro-app 官方文档为 https://micro-zoe.github.io/micro-app/docs.html#/zh-cn/framework/vite 子应用 无需任何修改,直接启动子应用即可。 主应用 1. 安装微前端框架 microApp npm i micro-zoe/micro-app --save2. 导入并启用微前端框架 microApp src/main.ts …

【Ubuntu】Virtualbox下lamp集群分布式搭建Wordpress

WordPress是一种使用PHP语言开发的开源内容管理系统(CMS),也常被用作博客平台。 开发语言:PHP 数据库:MySQL、mariadb(或其他兼容的数据库系统) 授权方式:GNU通用公共许可证下发布&a…

【JavaEE】【多线程】单例模式

目录 一、设计模式1.1 单例模式1.1.1 饿汉模式1.1.2 懒汉模式 1.2 线程安全问题1.3 懒汉模式线程安全问题的解决方法1.3.1 原子性问题解决1.3.2 解决效率问题1.3.3 解决内存可见性问题和指令重排序问题 一、设计模式 在讲解案例前,先介绍一个概念设计模式&#xff…

C++ 模版和继承

目录 一.模版 1.模版的基本概念 a.函数模版 b.类模板 c.模版的实例化 d.class 和 typename的区别 e.非类型模版参数 2.模版的特化 a.全特化 —— 参数类型全部特殊化处理 b.半特化 —— 部分参数特殊化处理 c.偏特化——对某些类型的进一步限制(实例化时传…

GD32学习知识点累计

时钟系统 GD32f427主频最高位240MHZ(但是只能到200M),GD32给的函数外接25MHZ晶振配置主频为200MHZ,APB1最高频率为60HZ配置为主频的4分频为50MHZ,APB2最大为120MHZ配置为主频的2分频为100MHZ 定时器 无论什么定时器最大频率为200M…

安全见闻---清风

注:本文章源于泷羽SEC,如有侵权请联系我,违规必删 学习请认准泷羽SEC学习视频:https://space.bilibili.com/350329294 安全见闻1 泷哥语录:安全领域什么都有,不要被表象所迷惑,无论技术也好还是其他方面…

AI带货主播框架的搭建!

AI带货主播,作为新兴的技术应用,正在逐渐改变电商行业的面貌,通过利用人工智能技术,AI带货主播能够模拟真实主播的行为,与用户进行互动,推荐商品,提升购物体验。 本文将介绍如何搭建一个AI带货…

处理Hutool的Http工具上传大文件报OOM

程序环境 JDK版本: 1.8Hutool版本: 5.8.25 问题描述 客服端文件上传主要代码: HttpRequest httpRequest HttpUtil.createPost(FILE_UPLOAD_URL); Resource urlResource new UrlResource(url, fileName); httpRequest.form("file&q…

self-supervised learning(BERT和GPT)

1芝麻街与NLP模型 我們接下來要講的主題呢叫做Self-Supervised Learning,在講self-supervised learning之前呢,就不能不介紹一下芝麻街,為什麼呢因為不知道為什麼self-supervised learning的模型都是以芝麻街的人物命名。 因為Bert是一個非常…

实战-任意文件下载

实战-任意文件下载 1、开局 开局一个弱口令,正常来讲我们一般是弱口令或者sql,或者未授权 那么这次运气比较好,直接弱口令进去了 直接访问看看有没有功能点,正常做测试我们一定要先找功能点 发现一个文件上传点,不…

中酱集团:黑松露酱油,天然配方定义健康生活

在如今的大健康时代,人们对于美食的要求越来越高。不仅美味,更要健康。在健康美食的生态链中,有一个名字正逐渐成为品质与美味的代名词——中酱集团。而当中酱集团与黑松露酱油相遇,一场味觉的革命就此拉开帷幕。 中酱集团&#x…

【产品应用】旋转式贴标机一站式解决方案

针对贴标机行业设备,立迈胜公司拥有智能控制器、一体化伺服电机、减速机等系列产品,可以轻松解决传统电机接线不便、占用空间、自重过大、部件繁杂等问题,帮助贴标机制造商实现设备精准控制、运行稳定的同时,保证生产流程高效产出…

开发运维警示录-20241024

开发警示录 1、作为开发,不要私自修改业务人员给的SQL语句,虽然个人感觉SQL很冗余,效率低等。 2、开发前,要明确需求,必要时通过图和文字形成文档与需求方确认、留痕。 3、开发复杂的业务逻辑代码前,先疏通…

oracle数据库---PL/SQL、存储函数、存储过程、触发器、定时器job、备份

PL/SQL 什么是 PL/SQL PL/SQL(Procedure Language/SQL)是 Oracle 对 sql 语言的过程化扩展,指在 SQL 命令语言中增加了过程处理语句(如分支、循环等),使 SQL 语言具有过程处理能力。把SQL语言的数据操纵能…

瑞芯微的 展会总结

首先是我感兴趣的产品: 摄像头的 墨水瓶的。 android 盒子,使用的是rk3588s 然后是瑞芯微AI在做什么:  在对 音频 视屏的输出 进行补充。 比如,视频拍了一张图片很模糊,那么他们用AI算法&am…

基于Multisim红外接近报警电路设计(含仿真和报告)

【全套资料.zip】红外接近报警电路设计Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 标题:红外接近报警电路 红外报警器是当前利用电子技术制作而成的防盗报警器&#xff0c…

Sei 生态迎首个 MMORPG 游戏伙伴 Final Glory,开启新篇章

​“随着 Final Glory 拓展至 SEI Network,SEI 生态也迎来了首款 MMORPG 游戏” 链游赛道新贵 Final Glory Final Glory 是建立在 MateArena 引擎上的 MMORPG 游戏,作为目前行业内首个斥巨资打造的 AAA 级 MMORPG 全链游戏,在面向市场后即引发…

PostgreSQL两节点用keepalived实现主备的高可用架构

使用keepalived实现PostgreSQL数据库两节点主备的高可用架构部署详解 环境配置和规划部署PostgreSQL的主备流复制架构keepalived介绍安装部署keepalived数据库配置配置keepalived相关参数文件启动keepalived模拟故障切换问题记录实践建议 看腻了就来听听视频演示吧(…

Java 多线程(八)—— 锁策略,synchronized 的优化,JVM 与编译器的锁优化,ReentrantLock,CAS

前言 本文为 Java 面试小八股,一句话,理解性记忆,不能理解就死背吧。 锁策略 悲观锁与乐观锁 悲观锁和乐观锁是锁的特性,并不是特指某个具体的锁。 我们知道在多线程中,锁是会被竞争的,悲观锁就是指锁…