微信分享必须后端签名,前端传URL需为origin+pathname+search,按jsapi_ticket/nonceStr/timestamp/url顺序SHA1加密;第三方SDK须懒加载,Web Share API需手势触发且微信不支持。

直接在 index.html 里硬塞社交 SDK 脚本,页面加载会变慢、LCP 恶化、微信签名还大概率失败——这不是配置问题,是加载方式错了。
微信分享必须后端签名,前端不能拼 signature
前端传给后端的 url 必须是 location.origin + location.pathname + location.search,不能用 location.href(hash 会被微信忽略,且签名校验严格到末尾斜杠都算不同 URL)。后端需按顺序拼接 jsapi_ticket、nonceStr、timestamp、url 四个字段,再做 SHA1 加密。常见错误包括:
-
appId和公众号后台「JS 接口安全域名」不一致 - 调试时用本地
http://localhost测试,但域名未备案 - SPA 页面路由变化后没重新调用
wx.updateAppMessageShareData() - 前端生成的
nonceStr或timestamp和后端签名时不一致
Twitter / LinkedIn 分享不用 JS,纯 URL Scheme 就够了
这两个平台完全不需要加载任何外部脚本,靠构造标准分享链接即可,性能零损耗、兼容性好、无隐私风险。关键点是编码必须完整:
- URL 用
encodeURIComponent(location.href),不能只编码参数部分 - 中文
text字段也要encodeURIComponent(),否则截断或乱码 - LinkedIn 的
https://www.linkedin.com/sharing/share-offsite/?url=...不读text参数,只取页面中和 - Twitter 的
via和hashtags参数要小写,且不能带#符号(hashtags=react,html正确,hashtags=#react会失效)
第三方 SDK 必须懒加载,禁止同步插入
微博、QQ、微信等 SDK 默认同步阻塞渲染,哪怕用户从不点按钮,也拖慢首屏。正确做法是监听用户交互后动态插入:
把任意文章或文档内容转换成精美的全屏翻页 HTML 演示文件(幻灯片风格)。当用户发来一篇文章、文档链接、Markdown 内容、或粘贴的文本,并且希望生成演示用的 HTML 时触发。支持任意内容来源:iWiki 链接、KM 链接、本地文件路径、直接粘贴的文本。生成的 HTML 文件保存到本地工作区,并通过企微直接发送给用户。触发词示例:帮我把这篇文章做成PPT、转成演示文档、生成HTML幻灯片、做个演示、转成可以演示的格式、article to deck、make a slide。
- 用
mouseenter或第一次click触发脚本加载,不是页面一开就document.write - 微信 JS 文件应通过
document.createElement('script')插入,并设async=false保证执行顺序 - 百度分享脚本已下线,别再用
bdimg.share.baidu.com;微博推荐直接跳转https://service.weibo.com/share/share.php - 所有外部脚本 URL 建议加版本号或时间戳参数(如
?v=202605),避免 CDN 缓存旧版导致兼容问题
Web Share API 是轻量替代方案,但有硬限制
现代浏览器(Chrome 61+、Edge 79+、Safari 16.4+)支持 navigator.share(),无需 SDK、不依赖后端、无跨域问题。但它不是万能补丁:
- 必须由用户手势触发(
onclick、onsubmit内调用),不能在fetch回调或setTimeout里调 - iOS Safari 目前仅支持分享到「信息」「邮件」「备忘录」等少数原生 App,无法指定微信或微博
- 不支持自定义分享卡片样式,
title和text是纯文本,不能带链接或图片(除非传Blob) - 微信内置浏览器完全不支持该 API,必须降级到二维码或 JS-SDK
最易被忽略的一点:所有分享逻辑必须检查运行环境。比如 window.wx 是否存在、navigator.share 是否为函数、当前是否在微信 WebView 中(用 ua.includes('MicroMessenger') 判断),否则按钮点了没反应,连错误都不会抛。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










