1实现原理 · 为什么它能做到
纯知识库型 skill:全部能力承载于 SKILL.md 单个 markdown(820 行 / 21.3KB),零脚本、零配置、零运行时。它自身不执行任何动作,只把 d3.js 的工程方法论以可复制代码块的形式交给宿主模型。
This skill provides guidance for creating sophisticated, interactive data visualisations using d3.js. D3.js (Data-Driven Documents) excels at binding data to DOM elements and applying data-driven transformations to create custom, publication-quality visualisations with precise control over every visual element. The techniques work across any JavaScript environment, including vanilla JavaScript, React, Vue, Svelte, and other frameworks.
用渐进披露控制上下文预算:主干 SKILL.md 只放选型判断 + 4 步工作流 + 常用图型,深水区(层级图/地理/联动刷选/动画全谱)下沉 3 份 references,模板下沉 assets,正文末尾显式指示按需读取。
To use these resources, read the relevant files when detailed guidance is needed for specific visualisation types or patterns.
跨框架宣称的实现方式是『把框架差异收敛为两条集成路径』:Pattern A 命令式操作 DOM(任何 JS 环境可用),Pattern B 只用 d3 算数据、渲染交还框架。
**Pattern A: Direct DOM manipulation (recommended for most cases)** Use d3 to select DOM elements and manipulate them imperatively. This works in any JavaScript environment:
输出纪律:要求所有绘图函数遵循同一骨架(空数据早退 → 清场 → margin convention → scale/axis → join 绑定),并用编号注释把这套骨架写成检查表,压缩模型自由发挥空间。
function drawVisualization(data) { if (!data || data.length === 0) return; const svg = d3.select('#chart'); // Or pass a selector/element svg.selectAll("*").remove(); // Clear previous render
版本被钉在 d3 v7:CDN 端点显式 v7,示例代码用 v7 API 风格(.join() 绑定、事件改为 handler 第一参数、无 d3.event),因此产出的代码对 v5/v6 旧项目不兼容。
<script src="https://d3js.org/d3.v7.min.js"></script>
把『非图型』的工程细节也写进正文而非留给模型猜:响应式(resize 监听 + ResizeObserver 双方案且返回 cleanup)、可访问性(role/title/desc)、性能降级(>1000 元素转 canvas)、常见故障排查。
### Accessibility Make visualisations accessible: ```javascript // Add ARIA labels svg.attr("role", "img") .attr("aria-label", "Bar chart showing quarterly revenue"); // Add title and description svg.append("title").text("Quarterly Revenue 2024"); svg.append("desc").text("Bar chart showing revenue growth across four quarters");
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| package | d3(npm 包,v7 API 面) |
| network | d3js.org CDN(d3 v7 min,产物可选的加载路径,无 SRI) |
| package | react(assets 模板 import) |
| package | tailwindcss(模板用 className 原子类,无显式 import,隐含样式依赖) |
4风险提醒 风险提醒:绿色 · 放心使用
- 产物侧供应链与版本漂移 — SKILL.md:39 的 CDN 引入未带 SRI,d3 v7 的补丁版本变化会直接进入用户页面;模板另引入 react 与 Tailwind 类名,模板代码在非 Tailwind 工程里会静默失样式。
- 示范代码的 DOM XSS 面 — SKILL.md:570 与 interactive-template.jsx:112-118 用 `.html()` 拼接未转义数据。图表数据若来自第三方或用户输入,模型照此示范产出的代码即可被执行注入;应改 `.text()` 或转义。
- 资源文件名写错导致取材失败 — SKILL.md:814-815 指 `chart-template.js`/`interactive-template.js`,实际为 `.jsx`。依赖模型读正文取文件的流程会失败,或诱发臆造模板内容。
- 跨框架覆盖被高估 — Vue/Svelte 无任何示例与模板(description 与 SKILL.md:818 的宣称超出交付物);这些环境的用户需自行改写,等于退回骨架示例。
- 维护与授权状态不明 — 仓库仅 1 个 commit(2025-10-17 创建,最后 push 2025-10-18),无 LICENSE,GitHub license=null。既无后续维护记录,也未授予明确再分发许可。
5第二遍独立确认
- [ok] official_desc 原文(frontmatter description) — SKILL.md:1-4 有完整 frontmatter,name: d3-viz、description 441 字符,已原文写入 meta.official_desc。
- [ok] 外部资源/网络端点清单 — 全目录 URL 扫描仅 1 条:https://d3js.org/d3.v7.min.js(SKILL.md:39)。无 fetch/d3.json/d3.csv/XMLHttpRequest 调用,无 API 端点、无 CLI 调用;地理图几何数据由调用方传入(d3-patterns.md:608-611),无 tile/topojson/atlas 拉取(grep topojson|us-atlas|world-atlas 零命中)。
- [ok] 凭证/环境变量读取 — grep process.env|API_KEY|token|secret|localStorage 全目录零命中(不区分大小写)。
- [ok] 脚本执行面 — 无 scripts/ 目录、无 package.json、无 shell/python 文件;两份 .jsx 是给宿主工程用的 UI 模板,不被 skill 执行。唯一 exec 相关字面命中为 references/d3-patterns.md:366 `defs.append("linearGradient")` 中的 `fs.`(假阳性),人工确认非文件系统调用。
- [discrepancy] 资源引用与实际文件名一致 — SKILL.md:814-815 写 `chart-template.js` / `interactive-template.js`,实际文件为 `assets/chart-template.jsx` 与 `assets/interactive-template.jsx`(React JSX)。模型按正文文件名读取 assets 会落空(`.js` 不存在),只能靠 glob 或猜后缀——这是第一遍照抄资源段时容易漏掉的错,第二遍以 find 结果纠正。
- [discrepancy] 『跨框架可用』宣称与模板实现一致 — SKILL.md:3(description)与 SKILL.md:10(Overview)宣称 React/Vue/Svelte/vanilla 全支持,SKILL.md:818 更称两份模板『work with vanilla JavaScript, React, Vue, Svelte』;但两份模板首行均 `import { useEffect, useRef, useState } from 'react'`(chart-template.jsx:1、interactive-template.jsx:1),且正文/模板使用 Tailwind 类名(chart-template.jsx:78,101 `className="chart-container"` / `className="p-8"`)。Vue/Svelte 在全文只出现于 description 与 Pattern B 注释,无任何示例代码——宣称覆盖面被高估,实际是 React+Tailwind 优先、vanilla 次之。
- [ok] 地理可视化能力是否真实(描述主张之一) — 主干 SKILL.md 无地理章节(第一遍据此可能误判为『宣称未兑现』),但 references/d3-patterns.md:594 起确有 `## Geographic visualisations`,含 Basic map with points 与 Choropleth 两个完整实现(d3.geoMercator + geoPath)。结论修正为:能力存在,但只在下沉文档里,主干不提示地理章节位置。
- [ok] d3 版本一致性 — CDN 显式 v7(SKILL.md:39),示例用 .join() 与事件形参写法(v7 语义);全文无 d3.event(v5 语义)残留。
6结论
e9922be6af3bb98d…e198c87d03