mcpField
A
artifacts-builder

artifacts-builder

github.com/shipshitdev设计与 UI38159 次安装今天更新
代码仓库

关于 artifacts-builder

artifacts-builder 是用于构建 claude.ai artifacts 的开发技能,面向制作可分享交互式页面的开发者。它提供 React 项目初始化与单文件 HTML 打包流程,并将本地资源内嵌到产物中。

主要功能

  1. 01初始化 React 与 TypeScript 项目
  2. 02配置 Tailwind CSS 与 shadcn/ui
  3. 03打包为单文件 HTML
  4. 04内嵌 HTML 与 CSS 引用的本地资源
  5. 05打包失败时保留旧产物

适用场景

  1. 01创建可在 claude.ai 对话中分享的 artifact
  2. 02将 React 页面打包为独立 HTML 文件

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/shipshitdev/skills --skill artifacts-builder

安装后在 Claude Code 中输入/artifacts-builder确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

LICENSE.txt
plugin.json
README.md
scripts/
bundle-artifact.sh
init-artifact.sh
inline-local-assets.mjs
node-version-check.sh
tests/
dump-dom.mjs
test_bundle_artifact.py
test_init_guard.py
test_inline_local_assets.py
test_node_version_check.py

详细介绍

Artifacts 构建器

要构建 claude.ai artifacts,请按以下步骤操作:

  1. 使用 scripts/init-artifact.sh 初始化前端仓库
  2. 编辑生成的代码来开发你的 artifact
  3. 使用 scripts/bundle-artifact.sh 将所有代码打包到单个 HTML 文件中
  4. 向用户展示 artifact
  5. (可选)测试 artifact

技术栈:React 19 + TypeScript + Vite + Tailwind CSS v4 + shadcn/ui(Radix),使用 Bun 安装和运行。打包:vite-plugin-singlefile。

要求:Bun 和 Node.js 20.19+ 或 22.12+(Vite 的最低要求;初始化脚本会拒绝低于此版本的 Node.js)。

设计与样式指南

非常重要:为避免所谓的“AI 垃圾感”,请避免过多使用居中布局、紫色渐变、统一的圆角和 Inter 字体。

快速开始

步骤 1:初始化项目

运行初始化脚本以创建新的 React 项目(如果项目名称已存在且目录非空,脚本会拒绝创建):

bash scripts/init-artifact.sh <project-name>
cd <project-name>

这将创建一个配置完整的项目,其中包含:

  • ✅ React + TypeScript(通过 bun create vite)
  • ✅ Tailwind CSS v4,采用 CSS 优先模式:在 src/index.css 中使用 @import "tailwindcss",在 @theme inline 中定义 tokens,使用 @tailwindcss/vite 插件,不使用 tailwind.config.*
  • ✅ 已初始化 shadcn/ui(components.json、OKLCH 主题变量、cn 工具、tw-animate-css),并在 src/components/ui 中包含完整的组件集
  • ✅ 已在 tsconfig 和 Vite 中配置路径别名(@/)
  • ✅ 使用 Button 和 Card 的入门文件 src/App.tsx

之后可使用 bunx shadcn@latest add <component> 添加或更新组件。

步骤 2:开发你的 artifact

要构建 artifact,请编辑生成的文件。

步骤 3:打包为单个 HTML 文件

要将 React 应用打包为单个 HTML 成品:

bash scripts/bundle-artifact.sh

这会创建 bundle.html,这是一个将所有 JavaScript、CSS 和依赖项内联在一起的自包含成品。可以在 Claude 对话中直接将此文件作为成品分享。

要求:项目根目录中必须有一个 index.html。

脚本的作用:

  • 如果缺少 vite-plugin-singlefile、parse5 和 css-tree,则将这些精确锁定版本的包安装为开发依赖,并使用锁避免同一项目中的并发运行互相冲突
  • 写入 vite.singlefile.config.ts,扩展你的 vite.config.*,并将所有 JS、CSS、字体和资源内联到 index.html
  • 使用该配置运行 bunx vite build,并为每次运行指定独立的 --outDir(对象式、Promise 式或函数式的 vite.config.* 均可使用;即使保留的自定义 vite.singlefile.config.ts 将 build.outDir 写死,也会遵循该配置)
  • 将 HTML 或 CSS 引用的文件(图像、字体、图标、有效的 srcset/imagesrcset 候选项、链接的样式表,以及无论扩展名为何都按 CSS 处理的 @import 目标,还有相对于样式表 URL 目录解析的这些文件自身的 url() 依赖项)内联为数据 URI,保留 #fragments,并在无法内联本地引用时失败,同时列出这些引用
  • 使用 parse5 解析 HTML(浏览器级标记化:恢复 <!--> 注释、支持任意大小写和无引号属性,以及 &copy、&#128; 等字符引用),并将其写回,使其解析后得到相同的 DOM(保留 pre、textarea 和 listing 的前导换行符,以及 doctype 标识符)。CSS 使用 css-tree 的 CSS Syntax 3 标记器进行标记化:url()、URL()、u\72l()、@import/@IMPORT 和 image-set 字符串均会被识别,而 content:"url(x)" 和注释不会;CSS 转义遵循规范(\61 后接 NBSP 时会保留 NBSP)。格式错误的 url() 标记会导致打包失败。描述符无效的 srcset 候选项(0w、1x 2x、100w 2x 等)会像浏览器一样被丢弃,但缺失的有效候选项会导致失败
  • 每次运行都在私有临时工作目录中构建,避免并发运行发生冲突。首先将每个引用的文件复制到私有快照目录(权限模式为 0700,之后会删除),逐个遍历路径组件,并拒绝构建目录和 public/ 中的符号链接、硬链接文件及非普通文件;内联时仅读取快照,因此在内联期间替换父目录无法注入其他字节
  • 写回 HTML,使其解析后得到相同的 DOM,并通过重新解析输出进行检查(文档模式、命名空间、属性,以及每个 script 和 style 元素):重写后的 CSS 字符串会对 < 和 > 进行转义,数据 URI 片段会进行百分号编码;任何差异(例如 <plaintext> 元素)都会导致打包失败,而不是改变页面
  • 使用锁目录串行化依赖安装,并在其中记录锁的所有者(pid 和启动时间);如果运行被终止后留下锁,则会检测并接管
  • 只有在所有步骤都成功后才替换 bundle.html,因此构建失败不会破坏之前的打包文件

威胁模型:此隔离机制可防范项目中提交的符号链接和硬链接(以及恶意页面、样式表或 public/ 目录树可引用的任何内容)。它无法防范在脚本运行期间并发篡改快照复制过程的本地攻击者。

仅在 JavaScript 中以硬编码路径字符串引用的文件不会被检测到:请从代码中导入这些文件(Vite 会将其内联),或在 HTML 或 CSS 中引用它们。

步骤 4:与用户分享成品

最后,在对话中将打包后的 HTML 文件分享给用户,以便他们将其作为成品查看。

步骤 5:测试/可视化产物(可选)

要测试/可视化产物,请使用可用工具(包括其他技能或 Playwright、Puppeteer 等内置工具)。通常应避免提前测试产物,因为这会延长用户看到完成产物的等待时间。如果用户有要求或出现问题,可在展示产物后再进行测试。

参考资料

评论

支持 Markdown