关于 artifacts-builder
artifacts-builder 是用于构建 claude.ai artifacts 的开发技能,面向制作可分享交互式页面的开发者。它提供 React 项目初始化与单文件 HTML 打包流程,并将本地资源内嵌到产物中。
主要功能
- 01初始化 React 与 TypeScript 项目
- 02配置 Tailwind CSS 与 shadcn/ui
- 03打包为单文件 HTML
- 04内嵌 HTML 与 CSS 引用的本地资源
- 05打包失败时保留旧产物
适用场景
- 01创建可在 claude.ai 对话中分享的 artifact
- 02将 React 页面打包为独立 HTML 文件
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ shipshitdev/ skills --skill artifacts-builder安装后在 Claude Code 中输入/artifacts-builder确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSE.txtplugin.jsonREADME.mdscripts/bundle-artifact.shinit-artifact.shinline-local-assets.mjsnode-version-check.shtests/dump-dom.mjstest_bundle_artifact.pytest_init_guard.pytest_inline_local_assets.pytest_node_version_check.py详细介绍
Artifacts 构建器
要构建 claude.ai artifacts,请按以下步骤操作:
- 使用
scripts/init-artifact.sh初始化前端仓库 - 编辑生成的代码来开发你的 artifact
- 使用
scripts/bundle-artifact.sh将所有代码打包到单个 HTML 文件中 - 向用户展示 artifact
- (可选)测试 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(浏览器级标记化:恢复<!-->注释、支持任意大小写和无引号属性,以及©、€等字符引用),并将其写回,使其解析后得到相同的 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 等内置工具)。通常应避免提前测试产物,因为这会延长用户看到完成产物的等待时间。如果用户有要求或出现问题,可在展示产物后再进行测试。
参考资料
- shadcn/ui:https://ui.shadcn.com/docs(另请参阅此市场中的
shadcn和tailwind技能)