
wxa-plugin-canvas
工具微信小程序海报生成组件,通过 JSON 配置快速生成朋友圈分享海报,支持图片、文字、方块、线条等元素的灵活排版与合成。
★ 3,183🕒 最近更新 2026-07
Canvas海报分享图片生成微信小程序
特性
- JSON 配置驱动的海报渲染引擎
- 支持图片/文字/方块/线条等元素
- 二维码自动生成与嵌入
- 异步海报生成(不阻塞 UI)
- 自定义像素比(pixelRatio)控制清晰度
- 图片预下载(preload)避免渲染空白
- npm 安装 + 微信开发者工具构建
- 21 个 npm 版本持续迭代
详细文档
wxa-plugin-canvas#
资源概述#
wxa-plugin-canvas 是微信小程序生态中最流行的海报生成组件(3,183 ⭐ / 487 forks / Apache-2.0)。它通过 JSON 配置驱动 Canvas 渲染,让开发者无需手动绘制 Canvas 即可生成精美的朋友圈分享海报——支持图片、文字、矩形块、线条等元素的灵活组合排版。
- GitHub:jasondu/wxa-plugin-canvas(3,183 ⭐ / 487 forks)
- npm:
wxa-plugin-canvas@1.1.12(21 个版本) - License:Apache-2.0
- 状态:维护模式(最后提交 2024-05,组件功能稳定完整,社区仍广泛使用)
该组件解决了小程序「生成分享海报」这一高频需求的痛点:原生 Canvas API 绘制海报代码量大、调试困难、容易出错。wxa-plugin-canvas 将海报抽象为 JSON 配置对象,开发者只需描述「在哪里放什么元素」,组件自动完成 Canvas 绘制和图片导出。
设计规范#
组件架构#
组件采用「声明式配置 + 命令式调用」模式:
- 声明式:通过
posterConfig对象描述海报布局(尺寸、背景、元素列表) - 命令式:通过组件实例方法
this.create()异步触发渲染
配置结构#
posterConfig = {
width: 750, // 画布宽度(rpx)
height: 1200, // 画布高度(rpx)
backgroundColor: '#fff',
debug: false, // true 时显示 Canvas 调试
pixelRatio: 2, // 像素比,越大越清晰
preload: true, // 预下载图片
blocks: [...], // 矩形块(背景、圆角、阴影)
texts: [...], // 文字(字体、颜色、行高、对齐)
images: [...], // 图片(URL、裁剪、圆角)
lines: [...] // 线条
}
元素层级#
渲染顺序为 blocks → images → texts → lines(按数组顺序绘制,后绘制的在上层)。
审核规范#
作为工具组件本身无需审核。使用该组件的小程序需注意:
- downloadFile 域名:海报中引用的图片 URL 必须添加到小程序后台的 downloadFile 合法域名列表
- 图片版权:确保海报中使用的图片、字体、素材拥有合法授权
- 内容合规:生成的海报内容需符合小程序内容审核规范
开发指南#
快速上手#
1. 安装
npm i wxa-plugin-canvas -S --production
在微信开发者工具中:工具 → 构建 npm。
2. 页面 JSON 注册组件
{
"usingComponents": {
"poster": "wxa-plugin-canvas/poster"
}
}
3. WXML 使用组件
<poster id="poster" config="{{posterConfig}}" bind:success="onPosterSuccess" bind:fail="onPosterFail">
<button>点击生成海报</button>
</poster>
4. JS 配置海报
Page({
data: {
posterConfig: {
width: 750,
height: 1200,
backgroundColor: '#fff',
debug: false,
images: [
{
x: 30,
y: 30,
width: 690,
height: 400,
url: 'https://example.com/cover.jpg'
}
],
texts: [
{
x: 30,
y: 460,
baseLine: 'top',
text: '标题文字',
fontSize: 36,
color: '#333',
lineHeight: 50
}
],
blocks: [
{
x: 30,
y: 600,
width: 690,
height: 80,
backgroundColor: '#f5f5f5',
borderRadius: 8
}
]
}
},
onPosterSuccess(e) {
const { errMsg, path } = e.detail
console.log('海报生成成功:', path)
// path 为生成的临时图片路径
},
onPosterFail(e) {
console.error('海报生成失败:', e.detail)
}
})
异步生成海报#
// 获取组件实例后调用 create 方法
onGeneratePoster() {
const poster = this.selectComponent('#poster')
poster.create(this.data.posterConfig)
}
常见陷阱#
- 图片域名未配置:忘记将图片 URL 域名添加到 downloadFile 合法域名,导致图片加载失败、海报空白。
- 异步生成时缺少 id:使用
this.selectComponent('#poster')必须确保组件设置了id="poster"。 - rpx 单位:配置中坐标和尺寸均使用 rpx,不是 px。开发者需按 750rpx = 屏幕宽度换算。
- 图片跨域:小程序 Canvas 不支持跨域图片,必须通过 downloadFile 下载到本地后再绘制。
- 文字换行:text 元素需设置
lineHeight和width才能自动换行,否则文字溢出。 - Canvas 版本:组件使用旧版 Canvas API(canvas-id),如需使用新版 Canvas 2D(type="2d")需自行适配。
生态资源#
推荐框架#
- 原生微信小程序(首选,组件为原生设计)
- Taro / uni-app:可通过组件引用方式适配,但需处理小程序原生组件在跨端框架中的使用方式
相关工具#
- mp-html:富文本渲染组件,与 wxa-plugin-canvas 配合可在海报中渲染 HTML 内容
- miniprogram-ci:CI/CD 工具,可用于自动化测试海报生成结果
社区资源#
- GitHub Issues — 常见问题与解决方案
- 掘金教程 — 作者分享的组件原理与实现细节
- npm 包 — 21 个版本迭代
版本更新#
- v1.1.12(当前最新):稳定版本,功能完整
- 更新历史:共发布 21 个 npm 版本,从 v0.x 迭代到 v1.1.x
- 最后提交:2024-05-08(功能稳定后停止频繁更新)
- 状态:维护模式——组件功能已覆盖海报生成的核心需求(图片/文字/方块/线条/二维码),社区仍有大量活跃用户
- 替代方案:如需更现代的方案,可考虑基于新版 Canvas 2D API(type="2d")自行封装或使用 wxml-to-canvas 等新工具
- 最后核实:2026-07-23

