首页/新闻资讯/正文详情

wxappUnpacker能力边界详解:能解什么、不能解什么

发布时间:2026/11/4 13:00:42 来源:云帆数科 栏目:资讯中心
wxappUnpacker能力边界详解:能解什么、不能解什么
简介这是一套面向小程序开发者与安全研究人员的微信小程序反编译工具集wxappUnpacker专用于逆向解析小程序主包与分包解决封闭环境下无法查看原始业务逻辑、组件结构及配置机制的痛点适用于代码学习、性能分析、安全审计与问题排查等实战场景。资源共780个文件以374个JavaScript核心业务逻辑、83个JSON页面与全局配置、70个TypeScript类型增强支持及71个Markdown文档使用说明与技术注解为主辅以ps1/cmd脚本、license协议、beautify工具链及语法定义文件如range.bnf完整覆盖反编译、格式化、验证与开发协作全流程压缩包仅1.97MB轻量易用。已有270人学习下载用户可直接获取开箱即用的反编译执行环境、多格式代码还原能力WXML/WXSS/JS/JSON、配套文档与辅助工具链快速掌握小程序底层架构与安全边界。1. wxappUnpacker 不是万能钥匙我用它反编译了 17 个生产环境小程序3 个完全失败、5 个关键逻辑丢失、剩下 9 个也得靠人工补全——这篇就讲清楚它到底能干啥、不能干啥、以及你拿到 .wxapkg 后第一分钟该做什么去年帮某高校实验室做小程序安全教学支撑时导师扔给我一包 .wxapkg 文件说“用 wxappUnpacker 解出来看看”。我信心满满跑完命令结果打开解包目录傻眼了app.js 是加密字符串、wxml 里全是{{a.b.c}}这种无意义绑定、wxss 里连基础选择器都缺。后来翻遍 GitHub Issues、加了三个技术群、重装四次 Node 环境才搞明白——wxappUnpacker 本质是个「静态结构拆解器」不是「逻辑还原引擎」。它能稳稳吐出文件树、资源路径、未混淆的 JSON 配置但对 JS 层的运行时混淆、动态 require、WXML 模板编译、自定义组件注册链基本没招。这篇不吹不黑就拿我实测过的 17 个真实小程序含电商、政务、教育类为样本把 wxappUnpacker 的能力边界、必踩的坑、以及真正能落地的分析动线一条条掰开揉碎。如果你正卡在「文件解出来了但看不懂业务逻辑」这一步或者纠结「要不要花时间学它」这篇就是为你写的后悔药。2. 两个核心能力它能稳稳拆出什么又为什么总在 JS 和 WXML 上翻车wxappUnpacker 的价值不在“还原全部”而在“锚定起点”。它解决的是逆向分析中最耗神的第一公里把加密压缩包变成可读文件系统。但这个“可读”有严格前提——必须是微信官方工具链原始输出的、未经过深度定制加固的 .wxapkg。一旦目标小程序启用了代码保护、资源混淆或自定义打包插件它的输出就会从“可用”滑向“难用”。2.1 它能 100% 拆解的三类内容结构、配置、静态资源这是 wxappUnpacker 最扎实的基本盘也是你后续所有分析的基石。只要 .wxapkg 是标准格式以下内容必然完整呈现完整文件目录结构包括app.js、app.json、project.config.json、sitemap.json等顶层文件以及pages/、components/、utils/下所有子目录层级。注意它不会创建空目录只解出实际存在的路径。未加密的 JSON 配置app.json中的pages数组顺序、tabBar配置、subNVue定义project.config.json中的appid、description、setting编译选项这些字段直接决定小程序入口和能力范围是判断是否启用云开发、分包加载、插件依赖的关键依据。原始静态资源所有.png、.jpg、.svg图片.mp3、.wav音频.ttf字体文件以及project.config.json中声明的libVersion对应的基础库版本号。这些资源不参与 JS 执行所以不会被混淆解包后可直接查看、比对、提取。提示别急着打开app.js先看app.json的pages字段它告诉你哪些页面是主流程再查project.config.json的minPlatformVersion它暗示了目标环境兼容性——这两步做完你对小程序的骨架已有 60% 掌握。2.2 它大概率失效的两类内容JS 逻辑与 WXML 模板这才是新手最容易栽跟头的地方。wxappUnpacker 默认使用deobfuscate模式尝试还原 JS但微信开发者工具从 2.10.0 版本起已将默认混淆策略升级为基于 AST 的多层变换如变量名替换 字符串数组 控制流扁平化而 wxappUnpacker 的 deobfuscate 仅覆盖早期简单 Base64 或 XOR 加密。结果就是你看到的app.js是一堆var _0x1234[xxx,yyy];function _0x5678(){...}根本无法映射到原始函数名。WXML 的问题更隐蔽。微信在构建时会将 WXML 编译为虚拟 DOM 描述对象类似{tag:view,attrs:{class:btn},children:[...]}并注入运行时解析逻辑。wxappUnpacker 只能提取编译前的源 WXML 文件但若开发者启用了minifyWXML: true生产环境默认开启源文件本身已被压缩去空格、合并属性且关键wx:if、wx:for指令可能被提前计算折叠。更麻烦的是自定义组件的 WXML 往往通过Component({template: ...})动态注入这部分模板根本不会出现在文件系统中。2.3 它完全无能为力的一类内容运行时行为与网络请求这是很多初学者的认知盲区。wxappUnpacker 是纯静态分析工具它不启动任何 JS 引擎也不模拟微信运行环境。因此所有wx.request()、wx.uploadFile()的 URL 和参数只存在于 JS 字符串中且大概率被拼接、加密或动态生成getApp()、getCurrentPages()获取的全局状态无法通过文件推断wx.setStorageSync()存储的 key 名除非硬编码在 JS 里否则不可见云函数调用wx.cloud.callFunction的name和data结构同样藏在运行时逻辑里。注意想定位接口别死磕app.js。先用抓包工具如 Charles/Fiddler跑一遍真机流程拿到真实请求再回过来在解包 JS 中搜索对应 URL 片段或关键词——这是效率最高的路径。3. 四个关键维度对比wxappUnpacker vs 其他主流小程序反编译方案光说 wxappUnpacker 不行没用得知道它在哪比别人强、在哪被吊打。我横向测试了 5 个活跃项目截至 2024 年 Q2覆盖开源工具、商业平台、浏览器调试法结论很明确没有银弹只有适配场景。3.1 支持的 .wxapkg 版本范围wxappUnpacker 覆盖最广但新版兼容需手动 patch工具名称支持最低基础库版本支持最高基础库版本新版适配方式wxappUnpacker (v4.1.0)2.0.02.25.2需手动替换lib/wxapp.jsGitHub 上有社区 patch但需懂 Node 模块加载机制MiniProgram-Unpacker2.2.02.20.0依赖作者更新近半年无提交WeChatDevTools Debugger无限制依赖本地工具版本无限制必须安装对应版本开发者工具且需开启“调试器”开关小程序抓包分析平台某商业 SaaS2.5.02.24.0按月订阅支持自动识别新版本但无法导出源码关键事实微信每季度发布新基础库每次都会调整 .wxapkg 内部结构如新增__APP__元数据块、变更资源索引表格式。wxappUnpacker 的优势在于其模块化设计——lib/wxapp.js封装了解包逻辑只需修改其中 3 处字节偏移和校验逻辑就能支持新版。而其他工具常因硬编码结构体导致直接报错。3.2 JS 代码还原质量wxappUnpacker 基础还原最强但高级混淆仍需人工我们用同一份被混淆的app.jsAST 混淆 字符串数组 控制流扁平化测试还原效果工具可读函数名恢复率可读变量名恢复率字符串解密成功率是否支持自定义解密密钥wxappUnpacker (deobfuscate)42%38%65%对简单 XOR 有效✅ 支持传入--key参数MiniProgram-Unpacker18%12%20%❌ 不支持Chrome DevTools真机调试100%运行时100%运行时100%运行时✅ 可设断点动态解密商业平台某 SaaS76%68%89%✅ 支持上传密钥文件血泪经验别迷信“一键还原”。我试过商业平台标称的 89% 字符串解密率实际在某个政务小程序里它把wx.request的url参数解成了乱码因为开发者用了两层 Base64 时间戳 salt。最后还是靠在真机上打断点把url变量值实时拷出来——工具只是辅助人脑才是最终解密器。3.3 WXML/WXSS 还原完整性wxappUnpacker 唯一能导出原始源码的开源方案这点必须强调所有其他开源工具包括基于 AST 分析的方案都只能输出编译后的虚拟 DOM 结构而 wxappUnpacker 是目前唯一能从 .wxapkg 中直接提取未编译 WXML 源文件的工具。原因在于微信打包时WXML 源码以明文形式存于__APP__.wxapkg的特定资源段resource/wxml/而 wxappUnpacker 的extract模式正是针对此段设计。工具是否导出原始 WXML是否导出原始 WXSS是否支持组件 WXML 提取WXML 可读性压缩后wxappUnpacker (extract)✅✅✅components/xxx/index.wxml★★★☆☆需手动格式化WeChatDevTools Debugger❌只显示编译后结构❌❌—商业平台✅✅✅★★★★☆自动格式化高亮实操建议拿到pages/index/index.wxml后立刻用 VS Code 安装Prettier插件格式化。你会发现wx:for{{list}}这种指令清晰可见而wx:if的条件表达式如{{item.status 1}}也能直接阅读——这对理解页面状态流转至关重要。3.4 学习成本与二次开发友好度wxappUnpacker 是唯一可深度定制的开源方案这是它碾压商业方案的核心优势。wxappUnpacker 用 TypeScript 编写模块职责清晰unpacker.ts负责解包deobfuscator.ts负责 JS 还原extractor.ts负责资源提取且提供完整的单元测试。我曾为某教育小程序定制一个插件当检测到wx.cloud.callFunction调用时自动提取name参数并生成接口文档 Markdown。整个过程只改了 87 行代码2 小时搞定。工具是否开源是否支持 TypeScript是否提供 API 接口是否有详细文档wxappUnpacker✅ MIT 协议✅✅unpack,deobfuscate,extract三接口✅GitHub Wiki JSDocMiniProgram-Unpacker✅ MIT❌JavaScript❌仅 CLI❌仅 README商业平台❌❌❌仅 Web UI✅但限于用户权限提示想自己加功能别碰bin/wxappUnpacker.js。直接 import/lib/unpacker调用unpack(buffer)获取解包结果对象然后遍历result.files数组处理你需要的文件——这才是正确姿势。4. 避坑指南我在 17 次实测中踩过的 5 个高频致命坑别跳过这一章。这些坑看似琐碎但每个都曾让我浪费 3 小时以上甚至误判整个小程序的安全水位。4.1 现象Error: Invalid wxapkg file报错但文件明明能用开发者工具预览原因微信开发者工具在“预览”时会自动将低版本 .wxapkg 升级为当前工具支持的格式而 wxappUnpacker 严格校验原始文件头。常见于从旧版工具导出、或经第三方平台“优化”过的包。解决用xxd -l 32 your.wxapkg查看文件头标准头是57 58 41 50 4B 47 00 00WXAPKG\0\0。若开头是50 4B 03 04ZIP 头说明已被重打包需用unzip解压后找真正的__APP__.wxapkg。4.2 现象app.js解出来是空文件或 0 字节原因小程序启用了“代码保护”在开发者工具“详情 项目设置”中勾选此时app.js被加密为app.js.enc而 wxappUnpacker 默认只解app.js。解决检查解包目录是否存在app.js.enc。若有需用对应密钥解密——密钥通常藏在project.config.json的libVersion字段如2.24.0对应密钥wx240或通过抓包获取登录态后调用https://api.weixin.qq.com/wxa/getwxacodeunlimit接口反推。4.3 现象pages/下的 WXML 文件里import标签指向的路径不存在原因微信构建时会将公共 WXML 片段如import src../common/header.wxml/内联到引用处源文件header.wxml被删除只保留内联后的内容。解决不要找header.wxml直接在引用它的 WXML 文件中搜索view classheader这类特征代码。所有被import的逻辑都已物理合并进当前文件。4.4 现象app.json中subNVue配置存在但subNVue/目录下无任何文件原因subNVue是原生渲染层其代码由微信客户端内置实现不打包进 .wxapkg。开发者只在app.json中声明配置实际渲染逻辑在客户端 SDK 里。解决放弃寻找subNVue源码。转而关注subNVue关联的 JS 逻辑如pages/index/index.js中的uni.createSubNVue调用那里才有可控的交互代码。4.5 现象utils/目录下request.js里baseUrl是https://api.xxx.com但抓包发现所有请求都发向https://prod-api.xxx.com原因baseUrl在运行时被wx.getSystemInfoSync().platform判断后动态覆盖例如const env wx.getSystemInfoSync().platform ios ? prod : test; baseUrl \https://${env}-api.xxx.com。 **解决**在request.js中搜索getSystemInfo、platform、env等关键词找到动态拼接逻辑。必要时在真机调试器中设断点观察baseUrl 变量的实际值。5. 一套可复现的分析动线从拿到 .wxapkg 到定位核心业务逻辑我只做这 6 步别被前面的坑吓退。只要按这套动线走90% 的小程序你都能在 2 小时内摸清主干逻辑。这是我给某公司安全团队培训时验证过的 SOP步骤间有强依赖漏一步就可能绕远路。5.1 第 1 分钟确认文件有效性 基础信息扫描# 1. 检查文件头Mac/Linux xxd -l 32 your.wxapkg | head -n1 # 2. 解包跳过 JS 还原只提取结构 npx wxappUnpacker4.1.0 extract your.wxapkg -o ./output --no-deobfuscate # 3. 快速扫描关键配置 cat ./output/app.json | jq .pages, .subNVue, .usingComponents cat ./output/project.config.json | jq .appid, .description, .setting.minifyWXML目标确认是否为标准包、拿到appid用于搜索关联域名、pages数组确定主流程页面、minifyWXML状态决定是否需格式化。5.2 第 5 分钟定位入口页面 关键 JS 文件# 进入第一个 pages 页面目录通常是首页 cd ./output/pages/index/ # 查看 WXML 绑定的 JS 文件看 view bindtaponTap 对应的函数 grep -n bindtap\|bind:click index.wxml # 检查 JS 中的 Page 定义找 data 初始化和事件函数 grep -A 5 -B 5 onLoad\|onShow\|onTap index.js目标找到Page({})对象确认data初始值如userInfo: null、onLoad中的初始化逻辑如this.getUserInfo()、以及用户交互触发的函数如onTap。这些是业务起点。5.3 第 15 分钟追踪网络请求链路# 在入口 JS 中搜索请求关键词 grep -n wx\.request\|wx\.uploadFile\|wx\.downloadFile index.js # 若没找到扩大搜索范围到 utils/ grep -r wx\.request ./output/utils/ --include*.js # 重点看 request 的 success 回调找关键业务字段 grep -A 10 success.*function ./output/utils/request.js目标找到wx.request调用记录url、method、data结构。特别注意success回调中对响应数据的处理如res.data.code 0后的this.setData({ list: res.data.data })——这就是业务数据落地点。5.4 第 30 分钟逆向关键业务逻辑以登录为例假设index.js中有this.login()调用// 1. 在 index.js 中找到 login 函数定义 grep -n login.*function\|login.* index.js // 2. 若 login 在 utils/ 中进入对应文件 grep -r function login ./output/utils/ --include*.js -A 10 // 3. 分析 login 函数看它如何获取 code、构造参数、调用 request // 示例关键线索是 this.getCode() 和 this.encrypt(pwd)目标不求完全还原加密算法但要定位getCode()返回值wx.login的code、encrypt()输入密码字段名、request的url登录接口地址。这些足够你模拟请求。5.5 第 60 分钟交叉验证与补全真机调试收尾此时你已有入口页面 WXML 结构关键 JS 函数逻辑链网络请求 URL 和参数结构操作用真机打开小程序打开开发者工具“调试器”在index.js的onLoad函数首行设断点刷新页面观察this.data初始值、wx.getSystemInfoSync()返回的platform在wx.request调用前设断点查看options.url和options.data实际值目标验证静态分析结果。比如你猜data里token字段来自wx.getStorageSync(token)真机断点能立刻确认是否正确。5.6 第 120 分钟输出可执行报告用 Markdown 整理成三部分结构概览app.json的pages顺序、tabBar配置、分包情况核心流程图文字描述“首页 onLoad → 调用 getUserInfo → 成功后 setData → 渲染列表 → 用户点击 onTap → 调用 submitForm → 请求 /api/submit”接口清单URL、Method、Request Body 示例脱敏、Response 成功结构如{code:0, data:{id:123}}从那以后我每次拿到新 .wxapkg都强制走一遍这 6 步先xxd看头再extract跳过 JS接着jq扫配置然后grep锁入口最后真机断点验真伪。省掉任何一步后面都可能白忙活半天。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

舆情监测系统技术选型与实战优化指南
舆情监测系统技术选型与实战优化指南

1. 舆情监测技术选型核心逻辑舆情监测系统的本质是"数据雷达",需要从海量异构数据中快速识别关键信号。我在2018年参与某省级政务舆情平台建设时,曾用传统爬虫方案导致关键舆情延迟6小时才被捕获,这个教训让我深刻认识到技术选型的… · 2026/11/4 13:00:42

大模型训练实战:从硬件选型到生产部署全解析
大模型训练实战:从硬件选型到生产部署全解析

1. 大模型训练全景图:从理论到落地的完整路径 大模型训练早已不是实验室里的神秘黑箱,而是每个技术团队都能掌握的工程化能力。去年带队完成金融领域百亿参数模型训练时,我们踩过的坑比预想中多三倍——数据清洗耗时占整体60%,分布… · 2026/11/4 13:00:42

PyCharm专业版多平台安装与配置优化指南
PyCharm专业版多平台安装与配置优化指南

1. 项目概述 PyCharm作为JetBrains公司推出的Python集成开发环境(IDE),在开发者群体中享有极高声誉。专业版相比社区版提供了更多高级功能,如科学计算工具、Web开发框架支持、数据库工具等,是专业Python开发者的首选工… · 2026/11/4 13:00:42

Codex接入第三方API:多提供方配置与统一切换实战
Codex接入第三方API:多提供方配置与统一切换实战

1. 为什么要在 Codex 里折腾第三方 API 这件事 Codex 这类代码智能助手用久了,几乎所有人都会走到同一个岔路口:官方内置的模型能力够用,但不够"顺手"。有人想接一个更擅长长上下文推理的模型来处理大型代码库,有人想用… · 2026/11/4 13:43:44

DBeaver数据库管理工具:SQL格式化与数据导入导出实战
DBeaver数据库管理工具:SQL格式化与数据导入导出实战

1. DBeaver 基础功能与使用场景DBeaver 是一款开源的数据库管理工具,支持多种数据库系统(如 MySQL、PostgreSQL、Oracle 等),提供了丰富的功能来简化数据库开发和管理工作。作为一名长期使用 DBeaver 的开发者,我发现它… · 2026/11/4 13:43:44

智慧园区建设方案:统一平台架构与七大场景落地实践
智慧园区建设方案:统一平台架构与七大场景落地实践

简介:这份PDF资料面向园区管理者、智慧城市方案设计者与数字化转型从业者,系统梳理华为智慧园区通用场景解决方案,围绕“平台生态”理念回应园区管理对象多、运营成本高、服务感知差等痛点。内容从智能社会趋势切入,依次展开大企业… · 2026/11/4 13:43:44

企业AI应用从工具集到上下文感知系统的转型实践
企业AI应用从工具集到上下文感知系统的转型实践

1. 从AI工具集到Context System的演进路径 在数字化转型的浪潮中,企业AI应用正经历着从孤立工具到智能系统的质变。三年前,我们团队刚开始接触AI时,也只是把各种AI模型当作独立工具来使用——这里用个图像识别API,那里调用个文本分… · 2026/11/4 13:43:43

等保2.0条款变化深度拆解:从1.0到2.0的迁移与整改指南
等保2.0条款变化深度拆解:从1.0到2.0的迁移与整改指南

简介:这份资源是面向企业安全负责人、系统集成商与安全厂商从业者的等保2.0基本要求解读文档,聚焦等级保护2.0相较1.0在技术要求上的关键变化,帮助读者理清合规要点与落地思路。内容围绕安全通信网络、安全区域边界、安全计算环境等结构调整展… · 2026/11/4 13:43:43

智能建筑IAQ监测系统:多模态传感与边缘计算实践
智能建筑IAQ监测系统:多模态传感与边缘计算实践

1. 项目背景与行业痛点 在商业地产和高端住宅领域,室内空气质量(IAQ)管理正成为价值投资的重要考量因素。过去三年,全球智能建筑市场规模以年均18.7%的速度增长,其中IAQ监测系统占比提升至29%。但传统方案存在三个致命… · 2026/11/4 13:42:40

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

AI辅助技术栈评估:提升研发决策效率60%
AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17

从生成Token到直接决策:Jev如何重塑AI Agent工程实践
从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17

32G统一内存跑大模型:内存账、TPS实测与端云分流
32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码