一个将内联 SVG 通过 Canvas 渲染到微信小程序的原生组件(支持 2D Canvas)。
- 直接传入完整 SVG 字符串:
- 属性:
<weapp-svg-adapter svg="<svg viewBox='0 0 24 24'><path d='M...Z'/></svg>" width="24" height="24" />
- 属性:
- 支持 TS,内置基础 SVG 标签/属性解析:svg/g/rect/circle/ellipse/line/polyline/polygon/path。
- 支持命令:M/m L/l H/h V/v C/c S/s Q/q T/t A/a Z/z;支持 translate/scale/rotate 与 viewBox 缩放。
- 支持样式继承:fill、stroke、stroke-width、stroke-linecap、stroke-linejoin、stroke-miterlimit、stroke-dasharray、stroke-dashoffset、currentColor。
- 安装(npm):
npm i weapp-svg-adapter
- 在工具 - 构建 npm(微信开发者工具),并在“设置 > 实验性”开启“使用 2D Canvas”(或在真机支持 2D Canvas 的环境运行)。
- 在页面/组件中引入:
{ "usingComponents": { "weapp-svg-adapter": "weapp-svg-adapter/weapp-svg-adapter" } } - 模板中使用:
<weapp-svg-adapter svg="<svg viewBox='0 0 24 24'><path d='M3 12L21 12' stroke='currentColor'/></svg>" width="24" height="24" />
注意:wxml 属性值需要进行转义(< 变成 <)。若字符串较长建议放在 JS 中 setData 传入。
- JS 中 setData 传值(推荐,避免转义):
this.setData({
svg: '<svg viewBox="0 0 24 24" fill="none" stroke="#111" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M3 12L21 12"/></svg>'
})- svg: string 完整 SVG 字符串
- width: number 组件宽度 px(默认 24)
- height: number 组件高度 px(默认 24)
- fill: string 默认填充色(默认 #000)
- stroke: string 默认描边色
- 解析器为轻量实现,已支持大部分常见命令与描边样式,但暂不支持:文本、渐变/滤镜、外链、复杂 CSS 选择器等。
- A/a 弧线通过贝塞尔近似转换,极端弧度可能有微小误差。
- 建议在设计图标时尽量使用基本几何/路径命令以获取最佳效果。
- 画布为空白:确认已开启“使用 2D Canvas”或在真机运行;基础库需支持 2D Canvas node。
- 仅描边不显示:检查是否 fill="none" 且设置了 stroke/stroke-width;也可通过组件属性 stroke 覆盖默认值。
- 尺寸不对:保证传入 SVG 拥有正确的 viewBox;组件会依据 viewBox 缩放到 width/height。
- 构建
npm run build
- 产物在
miniprogram_dist/,包含 wxml/wxss/json 与 index.js 与类型声明。
- 自动版本与发布:已配置 Release Please + GitHub Actions。
- 合并到 main 后,Release Please 会创建/更新发版 PR(包含版本号与 CHANGELOG)。
- 合并发版 PR 后,会创建 GitHub Release;发布触发 CI 执行 npm publish。
- 配置 Secrets:在仓库 Settings > Secrets and variables > Actions 中新增:
NPM_TOKEN:你的 npm 发布 token(npmjs.org 个人设置中生成,权限 publish)。
- 手动发布(可选,本地需登录 npm):
npm login npm publish --access public
MIT