编辑器优化
https://developers.weixin.qq.com/doc/subscription/guide/product/mp_editor_jsapi.html
https://developers.weixin.qq.com/doc/subscription/guide/product/plugin_spec.html
Let me read both docs rather than guess. Both docs are relevant to exactly what we’ve been fighting. Let me pull the official rule list to be precise: Both docs matter for exactly what we’ve been fighting. Let me record the actionable parts first: 这两篇一文一武,正好补上我们缺的两半:一篇是”怎么把内容送进编辑器”(写入侧),另一篇是”内容必须长什么样”(约束侧 + 官方校验器)。第二篇对我们今天就能用。
第一篇:mp_editor_jsapi —— 直接写入编辑器
它是挂在公众号编辑器页面 window.__MP_Editor_JSAPI__ 上的一组接口,面向”在编辑器里运行的第三方插件”(invoke 调用 / on 监听):
| 接口 | 能干嘛 |
|---|---|
mp_editor_set_content | 整篇内容替换成你给的富文本 HTML |
mp_editor_insert_html | 在当前位置插入 HTML(可 isSelect 选中插入内容) |
mp_editor_get_content | 读回全文富文本 |
mp_editor_set_selection | 按容器(或全文)设置选区 |
mp_editor_change_cover | 改封面,可直接给 2.35:1 与 1:1 的裁剪坐标(仅图文草稿) |
mp_editor_get_isready | 拿到 isReady / isNew(后四个功能接口要求 isNew=true) |
事件 contentchange / selectionchange | 内容/选区变化(选区事件带 domFragment 与偏移) |
对我们就是:把”复制 → 粘贴”升级成”直接写进编辑器”,绕开剪贴板与粘贴时的清洗不确定性,还能读回内容、监听改动(做成双向同步)。代价是需要一个”编辑器插件”的身份(这两页给的是接口规范,接入/上架流程没写在这里)。
另有一条互补的官方路线(这两页没提,但和我们已有能力正好接上):服务端草稿箱 API——直接把 HTML 写进草稿箱;我们已经做了公众号绑定(AppID/AppSecret),这条路不需要上架插件。秀米那类”同步到公众号”走的就是它。
第二篇:plugin_spec —— 约束 + 官方校验器(立刻可用)
它不是”插件怎么装”,而是文章 HTML/CSS 的合规规范,而且配套了官方校验能力:
- 线上接口:
POST http://mp.weixin.qq.com/article-bin/verify_article_structure,传content,回isValid+inValidInfo(width/height/ 其他,且每条违规带元素的outerHTML); - 开源仓
wechatjs/verify-article-structure-spec:verify_article_structure.md是规则真理源;cli/有check(puppeteer 真实浏览器量布局)和dedupe(真删掉冗余嵌套),能接 CI。npm 包还没公开,得从源码构建。
与我们最相关的几条(我已把规范原文抓下来放在 Temp/tb/verify_article_structure.md,836 行):
- 第 3 章「字体」:不建议设置任何
font-family(平台有优化过的默认栈)—— 这条直接命中我们:::text-style{font=…}转出来的复制 HTML 里带着font-family,按规范属于该收敛的写法。 - 1.4 width:固定宽度引发”居中不一致 / 溢出 / 不同屏占比不一”三类问题;
<img>建议带data-w(缺了会被判宽度违规或误报);整棵子树可用data-ignore-width豁免。 - 2.1 嵌套层级:同名标签 + 同内联样式 + 只含单个子节点的连续嵌套 ≤ 10 层(超出编辑器会自动精简)。
- 1.3
line-height过小会叠字(图片无缝拼接场景豁免)、1.5height:0在移动端整块不可见、1.8 别用<pre>包正文。 - 第 4 章 Dark Mode:颜色会被算法平衡、渐变背景会被转纯色;
data-no-dark、data-ignore-dm="low-contrast text-bg-gradient"是节点级豁免;并且不要用!important。
它顺带解释了我们踩的坑
规范只发”问题写法”清单、不发支持白名单,所以 display:grid 被吞不是偶然——第三方逆向整理的支持集里 display 只有 block/inline/inline-block/flex(没有 grid),而 flex-*、gap、object-fit 在支持集内,表格当然也在(跟我们实测一致)。于是有了三条可选路线:
- 马上做(便宜):把复制产物按规范收一遍——去掉
font-family、给<img>补data-w、深色模式视需要加豁免;并把官方check/dedupe变成我们的验证手段,不再靠”粘进去看看”。⚠️ 一条要你拍板:去掉font-family意味着放弃复制品里的字体区分(编辑器本就倾向用自己的默认栈,但你的字体选择器是显式意图)。 - 想做再做:拼图从表格换回 flex + gap(在支持集内),这样能拿回 4:3 裁切、与页面完全同构;表格留作兜底。
- 长期:走
mp_editor_jsapi插件 或 草稿箱 API,把”复制粘贴”整个换成”直接写入草稿箱”。
你想先从哪条走?我的建议是先做 ①,因为它能立刻把”排版对不对”从主观试错变成可跑的规则校验;②要不要换回 flex,最好等 ① 做完、你拿官方 check 跑一遍我们现在的表格产物再定。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!