{T}

组件库实战:组件的本地开发模式和发布到 NPM

这篇文章完整记录了一个前端组件 md-wx 的诞生过程。我们从 0 开始,在 AI 的协助下,一步步实现了组件的功能、优化了用户体验、添加了类型支持,并最终成功地将它发布到了 NPM 上。

通过这个实战案例,我们想展示在当前的 AI 时代,开发者是如何与 AI 进行高效协作的。我们会看到 AI 在快速生成代码、实现功能方面的强大能力,也会遇到 AI 的“知识盲区”,例如对 UI/UX 的理解不足、缺乏工程化思维等。

更重要的是,本文将展示开发者如何在整个流程中扮演“舵手”的角色:提出准确的需求、审查和修正 AI 的产出、处理复杂的工程问题,并最终对产品的质量负责。这不仅是一个技术教程,更是一次关于未来软件开发新模式的探索。


阶段七:从“能用”到“好用”——组件的导出与可配置性

此阶段的目标是让我们的组件不仅仅是一个孤立的功能,而是可以被外部应用轻松集成、可配置的模块。这要求我们设计合理的 API,并对组件功能进行优化。

AI 的初步尝试

我们向 AI 下达了任务指令,这个任务包含了 “完成组件 API 设计和导出功能,实现设置面板显示/隐藏控制”。AI 迅速响应,理解了我们的意图,并开始执行任务。

它分析了现有的组件结构,设计了 Props 接口,创建了入口文件,并实现了对设置面板的显示控制。整个过程高效且符合逻辑。

执行完成后,我们初步检查了代码层面的改动,一切看起来都合乎规范。

不合预期的 UI 表现

然而,当我们预览实际效果时,问题出现了。设置面板虽然可以显示和隐藏,但它的位置悬浮在了预览区的下方,这严重影响了整体布局的美观性和可用性。我们期望它能精准地浮动在预览组件的右上角。

如果我们的任务中有明确要求是位于右上角,最终的结果可能会符合预期,看了下我们的需求中没有这个描述,所以 AI 也就随意发挥了。它完成了 “显示” 这个功能,却没有 “在何处、以何种方式显示才最合适” 的上下文。

精细化调优 UI

为了修正这个问题,我们给 AI 提供了更明确的指令,要求它修改定位方式,将设置面板浮动到预览组件的右上角,并且只显示图标以保持界面简洁。

在 AI 完成初步修改后,我们发现当鼠标悬浮时,面板仍然有轻微的晃动效果。这是一个非常细微的交互问题,但会影响用户的操作体验。我们使用 Trae IDE 的“选择元素”功能,精准定位到目标 div,并向 AI 指明需要移除这个多余的动效。

现在设置面板达到了我们预期的效果:简洁、美观,且交互自然。

这个过程清晰地揭示了 AI 的一个瓶颈:它能构建功能的骨架,但真正赋予其灵魂、使其体验出色的,是开发者对用户体验的深刻理解和对细节的不懈追求。


阶段八:本地开发与测试

这个阶段我们需要提供一套标准的本地开发和测试流程。这涉及到构建配置、依赖管理和清晰的开发文档,后续我们在别的项目中也会使用。

指导 AI 搭建开发环境并优化文档

这个任务要求 AI 为项目配置 npm link 支持,并编写本地开发指南。AI 修改了 Vite 配置文件,并生成了一份初步的文档。

但 AI 生成的初始文档往往是将所有信息杂糅在一起,结构混乱。于是,我们进行了第二次介入,要求 AI “重新组织文档结构”

最终,我们得到了份结构清晰、内容专注的文档。

API 使用指南:

本地开发指南:

端到端闭环验证

文档和配置完成后,最后一步是进行端到端验证,确保组件能在真实的新项目中被成功引用。创建一个和 md-wx 同级的新文件夹,将 API 使用文档 移入进去,然后让 AI 创建一个全新的 Vite + React 测试项目,并通过 npm link 引入我们的组件。

code
@file 是 md-wx 组件的使用指南,请用 React + Vite 写一个应用,以本地组件的方式引用 md-wx  的预览组件,默认要展示设置面板信息。

测试项目成功运行,预览效果与预期完全一致。这标志着我们的组件开发形成了一个完整的闭环:从功能实现、UI 优化、工程化配置到最终的集成测试。

这个端到端的验证流程,需要将多个任务(创建项目、链接依赖、编写测试代码)串联起来,形成一个完整的上下文。目前,这同样超出了 AI 的能力范围,需要开发者进行全局的规划和指导。

介绍下 npm link,便于大家遇到问题时能做一些排查。

npm link 是 Node.js 生态中一个强大的工具,它允许开发者在本地模拟包的发布和安装过程,从而极大地简化了本地模块的开发和调试。其核心原理是创建符号链接(Symbolic Link or Symlink),将本地的开发项目链接到全局或另一个本地项目中,避免了反复发布到 npm 仓库的繁琐流程。

工作流程

npm link 的工作流程分为两步:

第一步:在组件项目 (md-wx) 中创建全局链接

首先,我们需要在组件项目(即 md-wx)的根目录下执行以下命令:

bash
# 进入 md-wx 项目根目录
cd path/to/md-wx

# 创建全局链接
npm link

这个命令会在你的系统全局 node_modules 目录下创建一个符号链接,该链接指向你当前的 md-wx 项目。执行完毕后,md-wx 就变成了一个全局可用的包,就像你通过 npm install -g md-wx 安装了一样,但它的源文件是你本地的项目。

第二步:在测试项目中链接组件

接下来,在你需要使用这个组件的测试项目中,执行以下命令:

bash
# 进入你的测试项目根目录
cd path/to/your-test-project

# 链接 md-wx 组件
npm link md-wx

这个命令会在当前测试项目的 node_modules 文件夹下,创建一个指向第一步中创建的全局符号链接的符号链接。这样一来,测试项目就直接引用了你本地的 md-wx 源码。

至此,链接过程完成。你在 md-wx 项目中的任何代码修改,都会实时反映到测试项目中,无需重新安装或构建,极大地提高了开发效率。

问题排查与解除链接

如果组件引用失败,可以从以下几点排查:

  • 权限问题:确保你有创建符号链接的权限。在 Windows 上可能需要以管理员身份运行终端。
  • 链接是否成功:可以检查全局 node_modules 目录和测试项目的 node_modules 目录,确认符号链接是否已正确创建。
  • 依赖冲突:当组件和测试项目有共同的依赖(例如 React)时,可能会因为 npm link 导致依赖层级问题,出现两个不同版本的实例,从而引发错误(如 React 中的 “Invalid hook call”)。这是 npm link 的一个常见痛点,需要谨慎处理。

当你完成了本地开发,想要解除这个链接时,可以执行:

bash
# 在测试项目中解除链接
cd path/to/your-test-project
npm unlink md-wx

# (可选)在组件项目中解除全局链接
cd path/to/md-wx
npm unlink

修复一个类型问题

在完成 “阶段八:本地开发与测试” 之后,我们将这个组件应用到了另一个项目 md-wx-vscode 中。这时,我们发现了一个新的问题。

md-wx 组件本身是一个纯 JavaScript 库,它没有提供类型定义文件。虽然这在纯 JavaScript 项目中不影响使用,但在 md-wx-vscode 这样的 TypeScript 项目中,缺少类型定义会导致编译错误和警告,也无法享受类型提示带来的开发便利。为了在项目中使用,我们不得不采取一些临时的“Hack”手段来绕过类型检查,但这显然不是一个合理的长期解决方案。

一个健壮的、可供外部使用的组件,应该自带完整的类型定义。因此,我们需要回到 md-wx 项目本身来修复这个问题。

我们再次求助于 AI,向它下达了指令:

我们这个组件是要给外部应用使用的,应提供完整的类型定义文件,适配外部服务的一些强类型语言。

AI 理解了我们的意图。它开始全面分析项目,检查 package.json 的配置,遍历 src 目录下的所有组件、Hooks 和工具函数,以理解完整的对外接口。

最终,AI 成功地生成了类型定义文件,并更新了项目配置,在报告中清晰地列出了它的工作成果。

这里有一个重要的经验分享:开发者需要对 AI 生成的代码进行审查

在 AI 完成任务后,我们可以通过 AI Chat 面板下方的文件列表,清晰地看到所有改动。在这次任务中,AI 除了生成必要的类型文件,还额外创建了一个 examples/typescript-example.tsx 文件。经过检查,我们发现这个示例文件的内容在 README.md 中已经存在,属于冗余信息。因此,在最终接受 AI 的修改时,我们可以主动拒绝这个不必要的文件。

这个步骤提醒我们,AI 是强大的工具,但它有时会因为缺乏完整的上下文或自身模型问题,而产生冗余。开发者在最后“确认”环节的把关,是保证项目整洁、高效的关键。

意外操作与 AI 答疑

在审查 AI 的修改时,我们可能会不小心点错,比如拒绝掉一个必要的文件。遇到这种情况不用担心,我们可以直接告诉 AI 发生了什么,让它重新操作。

例如,在为项目添加类型支持时,如果不小心删除了 tsconfig.json 文件,我们可以直接告诉 AI:“我刚才不小心把 tsconfig.json 文件删除了,如果一定需要,就再加回来吧”。AI 会理解并重新创建这个文件。

同时,如果你对 AI 的某个操作有疑问,也应该直接向它提问。这能帮助我们更好地理解项目,也能验证 AI 操作的合理性。

还是以 tsconfig.json 为例。我们可能会疑惑:“这是一个 JS 项目,为什么会需要这个文件?” 我们可以把这个问题抛给 AI。AI 会给出详细的解释:虽然是 JS 项目,但因为我们添加了类型定义文件 (index.d.ts),tsconfig.json 的作用是支持类型检查、提供更好的开发体验,并确保类型定义的正确性。

通过这种对话,我们不仅解决了问题,还学到了知识。把 AI 当作一个可以随时请教的“同事”,是高效利用 AI 的一个重要技巧。


发布组件到 NPM

我们的组件现在功能完善,配置齐全,类型定义清晰。最后一步是把它发布到 NPM 上,让全世界的开发者都可以使用。

什么是 NPM?

对于不熟悉 Node.js 生态的开发者来说,我们先简单介绍一下 NPM。

NPM 全称是 Node Package Manager,它是世界上最大的软件注册表 (Software Registry)。你可以把它想象成一个巨大的在线代码仓库,里面存放着海量的、可重用的 JavaScript 代码包(也叫“模块”或“库”)。

NPM 主要有两个作用:

  1. 作为包管理器:开发者可以通过 npm 命令行工具,轻松地下载 (npm install)、更新和管理项目所需的第三方代码。
  2. 作为代码共享平台:开发者也可以将自己编写的代码打包,发布到 NPM 上,供他人使用。

我们接下来要做的,就是第二点:将 md-wx 组件发布到 NPM,让它成为一个可以被公开使用的包。

准备工作

在发布之前,你需要做两件事:

  1. 注册一个 NPM 账号:如果你还没有账号,需要去 npmjs.com 官网注册一个。

  2. 在命令行登录:打开终端,运行下面的命令,然后根据提示输入你的用户名、密码和邮箱。

    bash
    npm login
  3. 输入命令 npm whoami 查看是否登录成功。如果登陆成功后会显示用户名。

发布步骤

第一步:更新版本号

每次发布新版本前,都需要更新 package.json 文件里的 version 字段。这很重要,NPM 不允许你发布一个已经存在的版本。你应该遵循 语义化版本 (Semantic Versioning) 规范来更新版本号。

例如,从 1.0.0 更新到 1.0.1

json
// package.json
{
  "name": "md-wx",
  "version": "1.0.1",
  // ...
}

第二步:检查 package.json

发布前,最好再检查一下 package.json 文件,特别是 files 字段。这个字段的作用是指定哪些文件会被包含在发布包里。这是一个白名单,只有列在这里的文件和文件夹才会被上传到 NPM。

这非常重要,因为我们只想把构建好的、可直接使用的文件发布出去,而不是整个项目的源码。一个典型的配置如下:

json
// package.json
{
  "name": "md-wx",
  "version": "0.0.1",
  "main": "./dist/md-wx.umd.js",
  "module": "./dist/md-wx.es.js",
  "types": "./index.d.ts",
  "files": [
    "dist",
    "index.d.ts",
    "README.md"
  ],
  // ...
}

在这个例子中:

  • "dist": 包含了所有构建后的 JS 和 CSS 文件。
  • "index.d.ts": 我们的类型定义文件。
  • "README.md": 项目的说明文档,会在 NPM 官网上展示。

通过这个配置,可以确保像 srcvite.config.js 等源文件和开发配置文件不会被发布上去。在前面的步骤中,AI 已经帮我们把这些都设置好了。

第三步:构建项目

我们的项目是使用 Vite 构建的,源码在 src 目录。我们需要先运行构建命令,生成最终发布到 NPM 的 JavaScript 和 CSS 文件。这些文件通常在 dist 目录下。

bash
# 运行构建命令
npm run build

第四步:执行发布

所有准备工作就绪后,运行下面的命令就可以把组件发布到 NPM 了。

bash
npm publish

如果命令执行成功,没有报错,那么恭喜你!你的组件已经成功发布。几分钟后,你就可以在 NPM 网站上搜到它,别人也能通过 npm install 来使用了。如果包名已经被占用,NPM 会提示错误,你需要回到 package.json 修改包名。


总结

我们从一个想法开始,最终将一个功能完善、体验良好、配置齐全的组件成功发布到了 NPM。这个过程清晰地展示了现代 AI 协同开发的完整图景。

AI 在这个过程中扮演了“高效执行者”的角色,它极大地加速了编码和信息处理的速度。但同时我们也看到,从“能用”到“好用”,再到“可靠”的每一步跨越,都离不开人类开发者的主导。无论是对用户体验的精细打磨、对项目工程化的严谨配置,还是对最终产品质量的把关,人的智慧和经验始终是项目的核心。

未来,开发者的核心竞争力将不再是单纯的编码能力,而是提出正确问题、拆解复杂任务、管理 AI 产出并进行创造性整合的能力。这本实战案例中前面我们花费了两个章节来设计项目所必要的文档,都会后续的代码能够按照预期执行奠定了一定的基础。

拥抱 AI,并学会与它高效协作,将是每一位开发者的必修课。希望这个案例能让大家有收获。