当前位置: 首页 > article >正文

【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.kler.cn/news/365862.html

相关文章:

  • 要做消息列表的颜色切换
  • 爬虫结合项目实战
  • 基于Java(SSM框架)+MySQL开发的小型英语学习网站
  • 使用Vue.js构建响应式Web应用
  • UE5之5.4 第一人称示例代码阅读2 子弹发射逻辑
  • Axios与Java Spring交互:RESTful API设计与实现全解析
  • 目前最新 Reflector V11.1.0.2067版本 .NET 反编译软件
  • R5:天气预测-探索式数据分析
  • Java中的设计模式:单例模式详解
  • VScode插件:前端每日一题
  • List线性表
  • 单片机_RTOS__架构概念
  • mongodb高可用副本集 docker版
  • linux下的进程等待(wait、waitpid)
  • Vue 3项目的性能监测和优化
  • 日常记录:es TransportClient添加证书处理
  • vscode 配置构建、调试QT项目
  • uniapp renderjs页面传值
  • 【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (七):MongoDB的设置
  • 虚拟化基础
  • java List<Map<String, Object>> 转 List<JSONObject> 的几种方式
  • Log4j和SLF4J在Java中打印日志的区别
  • Node.js是什么? 能做什么?
  • Harmony 开发与H5进行交互
  • OneNote不能拖动页面解决方案
  • docker-compose安装sentinel