
1. 信创迁移中的真实困境公式编辑这块硬骨头最近陆续帮几个客户做站点迁移几乎每一家都绕不开同一个问题公式编辑怎么办这事儿搁普通CMS站点上根本不算事但凡是涉足教育、科研、工程技术这类领域的老站点基本上都积累了成百上千篇带数学公式的内容从高等数学到量子力学从结构力学到信号处理满了屏的积分符号和希腊字母。一旦迁移到信创环境最先暴露的往往不是服务器性能不是数据库兼容而是这些早就老态龙钟的公式插件。我说的信创环境指的是基于国产处理器和国产操作系统的整条技术栈。这些年国产化替代推进得很猛底层芯片、操作系统、数据库、中间件都在换血。问题在于应用层的生态配套速度远远跟不上底层的迭代速度。WordPress本身是PHP应用跑在国产Linux发行版上通常问题不大PHP的跨平台性还是相当靠谱的。真正让人头疼的是那些依赖特定JavaScript库、特定字体渲染、甚至特定浏览器插件的公式编辑功能。举一个实际的场景。某地方高校的公开课平台用的是WordPress多站网络结构两百多个站点里有三分之一是理工科院系在维护日常发布的教学内容里大量使用LaTeX格式的数学公式。迁移之前用的是某款经典公式编辑插件能编辑、能预览、能渲染老师们用了七八年早就形成了肌肉记忆。迁移到某国产服务器平台之后发现公式在编辑器里能输入但发布后页面上的公式全是乱码再不就是一个公式渲染成一个巨大的红叉。折腾了一周最终结论是原来那款插件的核心渲染库用的是WebAssembly编译产物对指令集架构有硬性依赖在国产芯片上没法运行。这就是典型的信创兼容性问题而且这类问题不是靠修修补补能解决的得在架构层面就做好选型。我今天就把这几年在信创环境里处理WordPress公式编辑的完整思路整理出来从方案选型到部署配置从踩坑实录到性能调优尽量把能说清楚的都说清楚。2. 公式编辑的方案分层先搞清楚自己的站点属于哪一档2.1 轻量传输层方案只存语法不存渲染结果公式编辑这件事单从技术实现路径来看其实可以拆成三个独立环节输入编辑、存储传输、前端渲染。成熟的做法是这三个环节各自选型不要被某一个全家桶方案绑死。从信创兼容的角度讲最稳妥的路线是编辑时用LaTeX语法输入存储时只存LaTeX源码渲染时在浏览器端用纯JavaScript库完成。这套路线的最大优点是把渲染压力全部移到浏览器端服务器端不承担任何公式渲染计算对CPU架构完全不敏感。我调查过目前还在正常维护的几个主流方案可以说MathJax和KaTeX是当前两座绕不开的大山。MathJax的兼容性极佳远古浏览器都能跑缺点是加载体积大、渲染速度慢尤其公式密集的页面会出现明显的白屏等待。KaTeX的渲染速度是MathJax的好几倍体积也小得多但它的兼容性稍微挑剔一点对较老的浏览器不支持。在信创环境里用户的浏览器很可能是在国产操作系统上跑的适配版Chromium或者是360等双核浏览器的兼容模式这给前端方案选型增加了不少变数。另一个你没得选的关键点是信创环境的浏览器普遍禁用了部分本地字体接口。公式渲染依赖的并非普通文本字体而是专门的数学字体像TeX的Computer Modern、Latin Modern还有STIX系列。MathJax因为是纯JavaScript的排版引擎它有一套自带的web字体方案从服务器拉取字体文件到浏览器端渲染不太依赖操作系统内置字体。这就是它在信创环境里更稳的根本原因。既然MathJax渲染依赖从服务器加载字体那问题就变成了服务器能不能稳定、快速地把字体文件吐出来在国产服务器上这又牵扯到静态资源的缓存策略、CDN回源、压缩传输等一系列问题后面我会详细展开。2.2 重交互编辑方案桌面级体验背后的兼容风险如果站点不光是展示公式还需要频繁的在线编辑那轻量方案就不够用了。这类站点通常是教学平台或题库系统需要的是类似桌面Office里公式编辑器的体验所见即所得。目前主流的实现方式有两类一类是基于MathQuill的富文本公式编辑器它把LaTeX语法和可视化编辑流畅地结合到一起光标移动、选择删除都跟着直觉走另一类是直接把LATEX源码编辑器和右侧实时预览做在一起相当于在浏览器里嵌了一个迷你版TeX系统。这两种方案在普通x86服务器上没有任何问题但在信创环境里我遇到过几个很典型的坑。MathQuill在部分国产浏览器的兼容模式下选区获取会出现异常表现为光标移到公式里就消失了或者选中公式一部分的时候整个公式跟着闪。这其实是浏览器对ContentEditable区域的原生Selection API实现不够标准导致的。LATEX源码编辑器这类的方案问题相对少一些尤其是基于CodeMirror或Monaco的这两款编辑器都自带完整的语法高亮和光标管理逻辑不太依赖浏览器的ContentEditable行为。这里我必须补一句经验之谈凡是要信创环境重度使用的公式编辑场景优先考虑纯源码编辑加预览的方案别迷信可视化编辑。老师们嘴上说要可视化实际用起来尤其是输入的公式一旦开始变复杂纯源码编辑配合及时预览的效率反而更高。把LaTeX源码区做得大一点预览放在右侧或下方滚动跟手体验完全不输可视化编辑。2.3 可信部署的隐形门槛自建服务与离线资源包信创环境有一个和公网常规环境很不一样的特点很多内网环境是物理隔离的根本没有外网访问权限。这意味着一切依赖公共CDN的方案都不可用包括Google Fonts、jsDelivr、unpkg这些都要排除。你可能觉得这不算什么大问题换个内网源不就行了。真到实施的时候就明白了麻烦事一串接一串MathJax的字体包好几十兆KaTeX也有十来兆这些资源文件要完整搬运到内网服务器上还得保证路径全部相对化否则一个绝对路径就全瞎了。更隐性的门槛是版本锁定。在外网环境里插件和前端库升级是自动的CDN上永远是维护方发布的最新版本就算某个版本有问题官方也会很快修复。内网隔离环境可没有这个待遇资源包搬进去就是孤岛一旦有安全漏洞或兼容性问题就得组织一次人工升级流程。我见过有个单位MathJax版本三年没动过后来因为渲染库里的一个xss漏洞被打整个系统临时下线整改。所以我的建议是在内网环境部署公式编辑功能第一件事就是把所有前端库版本写死并建立内网更新机制哪怕一年更新一次也行。WordPress生态里还有一个经常被忽略的麻烦插件市场拉取和更新需要连接WordPress官方服务器内网环境默认是禁止这种外联的。所以很多国产化项目干脆放弃了插件市场直接用自定义插件满足需求或者把官方插件整体打包到内网自己的更新源里。公式编辑这种功能如果也被打包在某个插件里它的前端静态资源是否同步打包完整就成了能否在信创环境顺利工作的关键。3. 选型拆解MathJax与KaTeX在信创场景下的详细对比3.1 渲染机制的差异决定了兼容性边界MathJax和KaTeX虽然都是前端公式渲染方案但底层思路完全是两回事。MathJax从3.0版本开始全面拥抱WebAssembly加速但它保留了完整的纯JavaScript回退路径浏览器不支持WASM的时候自动切换回JS模式。这个设计在信创环境里特别重要因为某些国产芯片的浏览器虽然号称支持WASM实际跑起来会出现内存溢出的诡异情况。MathJax的回退机制能兜底不至于公式直接崩掉。KaTeX则完全是另一条路线它从头到尾都是纯JavaScript渲染策略。没有WASM优化也就不存在指令集架构的兼容性问题。但KaTeX为了追求极致的渲染速度对HTML/CSS的要求相对严格一些老旧的国产浏览器版本对CSS变量支持不完整会出现公式里的分数横线渲染偏了半个像素、上下标层次错乱这类肉眼可见的问题但好在公式不会不见只是长得丑。3.2 性能表现的真实差异密集公式页面的生死之战用真实数据说事。我曾经在一台国产CPU服务器上做过一次压力测试配置是某国产四核处理器、16GB内存跑着Nginx加PHP。测试页面上一共挂了80个公式包含积分、求和、矩阵这种重型结构。MathJax的完整渲染时间大概在4.2秒首屏只出来一半公式后面那些是滚动到可视区域的时候才渲染的这是MathJax的懒加载特性能明显提升首屏感知速度。KaTeX在同样页面上的完整渲染时间是1.1秒几乎是一瞬间全部出来。差异非常显著但代价是KaTeX在低端CPU上渲染时主线程会被长时间占用浏览器滚动会出现肉眼可察觉的掉帧。这个差异在面对密集型公式页面时是决定性的。比如某理工科课程的课件页一页PPT内容转成网页后密密麻麻全是公式MathJax的懒加载策略反而成了优势它把渲染压力打散了浏览器不卡。KaTeX则是一次性把全部公式渲染完CPU弱的机器上浏览器会有持续两三秒的假死感。所以我的结论是查询密集型知识库网站上KaTeX更合适课件、讲义这种长篇大论用MathJax更稳。3.3 和编辑器插件的集成深度WordPress生态里现成的公式支持插件多多少少都能和MathJax或KaTeX联动。但信创环境里选插件有一个额外的筛选条件插件的作者是否还在活跃维护。很多经典插件最后一版是五六年前更新的它们的默认配置里写死了指向某个公共CDN的地址你必须能钻进插件源码里去改这些资源地址。我踩过的坑是某款经典公式插件里硬编码了某个版本的MathJax CDN地址修改它得直接改动插件文件。问题是插件一更新就会覆盖掉你的改动。正确做法是用WordPress的wp_enqueue_script机制配合勾子去替换资源URL或者直接把CDN地址换成内网地址后锁定插件版本禁止自动更新。前者优雅但需要写代码后者省事但有风险。考虑到信创环境里维护人员的技术水平参差不齐我更推荐后者锁定插件版本把改动写在单独的mu-plugin里这样即使有人手动点了更新改动也不会丢因为mu-plugin优先级最高是强制加载的。4. 信创环境中落地WordPress公式编辑完整配置步骤4.1 环境准备与前置检查先别急着装插件。在信创环境里部署任何东西第一步永远是检查基础环境公式编辑这种依赖前端渲染库的功能尤其如此。我建议按这个顺序排查确认PHP版本和扩展。WordPress 6.x建议PHP 7.4以上实测国产平台的PHP 8.1和8.2兼容性都不错。别用PHP 8.0官方已经放弃维护而且和某些老插件有兼容问题。检查OpenSSL扩展。内网环境经常用的是自签名证书PHP的OpenSSL扩展缺失会直接导致WordPress后台无法正常白屏。确认Nginx或Apache的静态资源MIME类型配置正确。尤其要确保.woff2、.ttf、.wasm这些文件不会被错误拦截。MathJax 3.x的字体文件是woff2格式Nginx默认配置不一定包含这个MIME类型需要在配置里显式加上。把可写目录权限捋一遍wp-content目录及其子目录对Web用户必须有写权限很多国产系统默认的安全策略会对wp-content/uploads做只读限制公式编辑器上传图片会静默失败。4.2 部署MathJax到内网完整操作记录最干净的做法是放弃插件直接在主题里手动引入MathJax。这样可控性最强也方便锁定版本。我的推荐流程是在能访问外网的机器上下载MathJax 3.2.2版本的完整包注意是包含es5目录的完整包别只下精简版精简版会缺失部分字体导致国内内网环境下某些生僻数学符号渲染不出来。把整个mathjax文件夹上传到服务器的/var/www/html/wp-content/mathjax目录或者任意一个Web能访问的静态目录。在WordPress主题的functions.php里注册前端资源function custom_mathjax_enqueue() { wp_enqueue_script(mathjax, /wp-content/mathjax/es5/tex-chtml.js, array(), 3.2.2, true); wp_add_inline_script(mathjax, window.MathJax { tex: { inlineMath: [[\\(, \\)]], displayMath: [[\\[, \\]]] }, options: { skipHtmlTags: [script, noscript, style, textarea, pre, code], ignoreHtmlClass: no-mathjax }, startup: { ready: () { MathJax.startup.defaultReady(); MathJax.startup.promise.then(() { document.querySelectorAll(mjx-container).forEach(el { el.style.overflowX auto; el.style.maxWidth 100%; }); }); } }, loader: {load: [[tex]/ams, [tex]/noerrors, [tex]/noundefined]} };, before); } add_action(wp_enqueue_scripts, custom_mathjax_enqueue);这里有几个细节很关键。inlineMath和displayMath决定了哪些符号会被当作公式边界默认配置里通常包含$...$但这在中文文章里会引起大量误判因为中文文本里到处都有$符号比如金额。我一般只保留\\(...\\)和\\[...\\]两种边界后端输出文章内容时编辑器自动把用户输入的$...$转换为\\(...\\形式。skipHtmlTags这个选项也很重要如果你不加MathJax会把代码块里的LaTeX内容也渲染成公式造成灾难性后果。ignoreHtmlClass则是提供一个开关某个段落加个no-mathjax类就可以明确告诉MathJax这段别碰。在编辑器里插入公式时用古腾堡编辑器或经典编辑器都可以只要输出内容里包含LaTeX源码。需要特别注意的是内容里的反斜杠必须全角转义否则PHP输出时会丢反斜杠。这个坑我遇到过不止一次用户辛辛苦苦写的公式保存进数据库再读出来时所有反斜杠都没了原因往往是编辑器的某些过滤钩子做了stripslashes操作。解决办法是在保存内容时用wp_slash或esc_sql处理或者写一个简单的自定义函数在the_content过滤器里对公式部分做反转义处理。4.3 为内网环境配置KaTeX方案如果你想要更快的渲染速度KaTeX是更优选。部署逻辑和MathJax类似先在能访问外网的环境下载KaTeX的dist包只保留dist目录下的东西上传到内网服务器然后在functions.php里注册function custom_katex_assets() { wp_enqueue_style(katex, /wp-content/katex/dist/katex.min.css, array(), 0.16.9); wp_enqueue_script(katex, /wp-content/katex/dist/katex.min.js, array(), 0.16.9, true); wp_enqueue_script(katex-auto, /wp-content/katex/dist/contrib/auto-render.min.js, array(katex), 0.16.9, true); wp_add_inline_script(katex-auto, document.addEventListener(DOMContentLoaded, function() { renderMathInElement(document.body, { delimiters: [ {left: \\\\(, right: \\\\), display: false}, {left: \\\\[, right: \\\\], display: true} ], throwOnError: false, strict: false }); });); } add_action(wp_enqueue_scripts, custom_katex_assets);throwOnError: false非常关键。公式写错了、渲染失败了页面只会显示红色报错文本不会导致整个页面白屏。strict: false则是关闭KaTeX对语法不规范的报错信创环境里的老旧文章格式五花八门有些公式本来就不符合KaTeX的严格语法但内容本身是有价值的不能让渲染失败毁了整篇文章。4.4 输入端的适配让编辑器默认输出安全格式公式编辑器的选型和配置同样重要。如果直接用文本编辑器输入LaTeX源码对普通用户是很不友好的尤其是文科背景的管理员他们连\frac{}{}都容易写错括号。所以我们需要在前端编辑器里嵌一个公式输入工具我实际推荐的做法是在编辑器工具栏加一个按钮点击弹出小窗口里面是一个简化的LaTeX输入区和一个实时预览区。这个不需要额外的重型库只要引入MathJax或KaTeX就能实现成本极低。逻辑是输入区每次keyup触发预览区的重新渲染确认无误后把源码插入编辑器。这个工具的实现不复杂。我把完整代码挂在一个独立的mu-plugin里不打算在这里贴全部但核心思路可以讲清楚用mce_external_plugins过滤器给TinyMCE注册一个外部插件插件JS里在工具栏添加一个自定义按钮点击打开一个模态框模态框里左右分栏左边textarea输入LaTeX源码右边div做预览每次输入触发预览区域重新调用MathJax.typesetPromise()或katex.render点击确认时把源码以\\(...\\)包裹后插入编辑器内容中。这活儿看着简单但有几个细节要注意。预览区域的样式要覆盖MathJax默认的mx容器否则预览区显示正常插入编辑器后因为样式隔离又变样了。另外输入区要关闭浏览器自动拼写检查否则一整排红色波浪线会严重影响输入体验。在textarea上加spellcheckfalse是必须的。5. 踩坑实录字体加载、数据库迁移和插件更新的连锁问题5.1 字体加载失败深入网络层排查有一次在某单位的内网部署环境中MathJax已经配置好了公式也能在编辑器预览里正常显示但发布后页面上却全是方框。方框是典型的字体渲染失败浏览器在尝试加载MathJax的web字体时被拦截了。我顺着排查了一遍。字体文件本身在服务器上确实存在直接在浏览器地址栏输入woff2文件的URL也能打开下载。问题出在HTTP响应头里的CORS设置。MathJax的字体加载是跨域请求的因为页面域名和静态资源域名往往是分离的页面跑在https://course.example.com静态资源在https://static.example.com而MathJax渲染公式时会通过fetch从静态域加载字体。如果静态域没有配置Access-Control-Allow-Origin浏览器会拦截字体请求页面回退到系统字体中文字符能显示但数学符号全是方框。解决方法是在Nginx静态资源配置里加上location /wp-content/mathjax/ { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods GET, OPTIONS; add_header Access-Control-Allow-Headers Content-Type, Authorization; expires 30d; add_header Cache-Control public, max-age2592000; }这里有个小陷阱Access-Control-Allow-Origin *是通配符看似没问题但如果你的站点启用了Cookie或需要鉴权头就用不了通配符得改成具体域名。好在MathJax字体加载不带Cookie所以通配符是安全的。顺带一提expires 30d加上去之后内网员工刷新页面的速度会明显提升因为字体文件会被浏览器缓存很久。5.2 老文章的公式内容在迁移后大面积损坏英特尔的x86平台迁移到国产平台通常不是只迁移服务器代码数据库也要跟着走。很多站点是从老的MySQL 5.6或5.7迁移到国产数据库或更新的MySQL 8.0系列的。一迁移完文章里公式全乱了。这个现象太常见了根因反而是字符集的锅。老站点的数据库很可能是latin1或utf8字符集而LaTeX源码里的\alpha、\beta这类ASCII字符还好真正致命的是希腊字母的Unicode表示形式比如α、β这种直接存成Unicode字符在latin1字符集下存储时会被拆成两个字节迁到新库之后字符集一旦不匹配就变成乱码或问号。排查和修复的方法是先检查字符集对齐SELECT table_name, table_collation FROM information_schema.tables WHERE table_schema 你的库名; SHOW CREATE TABLE wp_posts;如果发现wp_posts表的字符集是latin1或utf8而新库默认是utf8mb4那就要做字符集转换。最高效的做法是先把wp_posts及相关表备份用ALTER TABLE CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci转换转换后检查包含LaTeX源码的post_content字段确认反斜杠、花括号、尖括号都没有被转义或替换重新跑一遍MathJax渲染测试页面。这里有一个我已经踩熟了的坑unicode_ci排序规则虽然能正确存储数学符号但如果你原本用的是general_ci转换后索引可能失效导致查询变慢需要重新构建索引。5.3 插件自动更新的灾难兼容性被静默打破信创环境里批量管理WordPress站点的时候插件自动更新是真正的隐形杀手。某次运维巡检发现三个站点公式全挂了查了半天原因某个插件三天前自动更新到了新版本新版本里把MathJax从3.x升级到了4.x而4.x默认启用了WebAssembly渲染在国产CPU上这个WASM模块无法加载于是全站公式回到文本源码裸奔状态。这个问题的根源在于原生MathJax 4.x放弃了对老旧环境的回退支持而绝大多数WordPress公式类插件并不会检查浏览器或CPU对WASM的支持情况。在x86环境里这个升级是无感的到国产芯片上才爆炸。解决办法有两条路。稳的路给所有站点设置DISALLOW_FILE_MODS为true彻底禁止后台自动更新任何插件和主题把更新流程挪到测试环境验证后再手动推送到生产环境。更好一点的做法是在所有前端资源加载逻辑里加上版本检测如果MathJax版本号大于3.x就强制降级到3.x的静态资源。具体实现是用一个mu-plugin覆盖式地重新注册脚本源优先级压过原插件。5.4 编辑器内预览正常但前端不渲染作用域被污染最后再提一个排查起来能逼疯人的问题编辑器内公式预览完全正常发布后前端页面死活不渲染。这种问题通常是页面上还有其他JavaScript代码干扰了MathJax的初始化流程。最常见的是某个统计脚本或分析工具在DOMContentLoaded事件里做了document.write操作导致MathJax的启动时序错乱。排查思路打开浏览器控制台看有没有报错在Network面板里确认tex-chtml.js是否加载成功再检查MathJax的状态在控制台执行MathJax.startup.document看是否有状态信息。如果确定是脚本冲突最粗暴可靠的解法是在wp_enqueue_script里给MathJax脚本设置defer属性并放到页脚加载让MathJax在DOM建完之后再启动。另一个更干脆的方案是给MathJax脚本设置async然后手动触发typesetPromise让页面根据生命周期自己决定什么时候渲染公式从源头隔离其他脚本的干扰。我在实际项目中最终采取的方案是单独写一个只有几十行的mu-plugin专门托管MathJax的初始化逻辑不依赖任何主题和任何第三方插件所有资源和配置全部自己管理。这个方法虽然看起来冗余了但确实是在复杂的信创环境内保证公式功能长期稳定的最实用策略。6. 性能调优和功能扩展的方向公式渲染的最终体验不取决于首屏速度而取决于不同页面类型下的综合表现。就MathJax而言开启fastPreview机制后输入编辑器时可以用轻量替换快速展示近似效果在光标停止输入后再进行完整渲染。这个机制的实现要么升级到4.x系列要么用KaTeX的render配合防抖处理。在高并发环境下公式功能本身不构成性能瓶颈真正吃CPU的是页面整体渲染。Nginx开启gzip压缩尤其对woff2以外的文本类资源效果显著。PHP侧开启Opcache缓存PHP字节码能减少约30%的响应时间。数据库层面把含有大量公式的文章内容从text类型升级为longtext避免长文章被截断。对于公式特别多的页面建议开启Redis对象缓存因为WordPress的查询开销在复杂文章上会急剧上升。从扩展角度看如果能接受轻微的维护成本MathJax的自动渲染机制和KaTeX的renderMathInElement可以并存在同一个站内文章列表页用KaTeX快速渲染摘要里的小公式详情页用MathJax完整渲染正文里的重型公式。两种渲染器针对不同的内容密度做适配能换来真实可感知的性能提升。唯一的成本是两套前端库的静态资源都要维护磁盘空间倒是无所谓但升级流程得上心。最后说个切身的经验。信创环境的本质是一个长期演进的生态换完一批芯片、换完一批系统下一批组件又会是新东西。公式编辑这种看似不起眼的小功能其实是对整个技术栈兼容性的一次微体检从PHP到JavaScript从字体到数据库字符集任何一环有短板都会原形毕露。所以别想着上线后就撒手不管把公式功能的回归测试写进每次环境变更的上线清单里哪怕只是改了个Nginx配置也花一分钟打开一个公式页面看一眼。这个习惯能在关键的时候省下好几个通宵。7. 迁移过程中的组织协作谁说技术问题纯粹是技术问题7.1 摸清家底给老站点的公式内容做一次全面体检实战中最容易被低估的环节恰恰是最前期的现状摸底。很多单位说迁就迁备份完数据库就开跑公式格式问题到了生产环境才集中爆发。我的建议是在迁移前花两三天做一个全面的公式内容体检先把家底摸清楚能筛掉后面绝大部分排错事故。体检工作本质上是一次形式化扫描把所有历史文章内容导出用正则或写个PHP脚本识别公式类型统计LaTeX格式的公式占比、图片型公式占比、MathML格式占比。图片型公式是最需要警惕的它们虽然看起来整整齐齐但本质是静态PNG缩放后模糊也无法被屏幕阅读器访问。信创环境的很多业务场景比如教育平台对无障碍访问是有明确要求的图片型公式在合规层面就站不住脚。扫描结果里还应该包含公式中的字体编码信息。老的公式编辑器可能输出过一些特殊实体字符像#8734;这种HTML实体编码在新环境里可能会被过滤掉或渲染成乱码。了解这些风险点之后就可以在迁移方案里专门安排一个清洗环节提前用脚本批量替换。一次性做好这些事比事后文章被零散报障的体验要好得太多。7.2 内容方和技术方的共识公式是内容资产不是页面装饰品在这个问题上我最深的体会是公式编辑的兼容性表面是个技术问题根子里是个协作问题。内容管理员关心的是公式能不能正常输入和显示他们不关心底层是MathJax还是KaTeX也不关心数据库字符集。运维工程师关心的是系统稳定性、可维护性他们不希望为某一个插件单独做兼容性适配。这双方的需求往往是对着干的。我见过比较成功的沟通方式是把公式统一视为内容资产而不是页面装饰品。这意味着所有公式必须有可读的文本源码存在数据库里无论是LaTeX还是MathML格式而不是只有一张渲染后的图片公式所在的文章必须能导出、能回溯、能被搜索到公式的显示效果必须在迁移前后做逐项对比而不是“拷过去能跑就算成功”。把公式定性为内容资产还有一个直接的好处它强迫你选择存储层格式的正确方案。如果只把公式当作一个渲染装饰那么存储不存储源码都无所谓——但一旦牵扯到内容检索、编辑、二次加工源码的重要性就瞬间体现出来了。7.3 给迁移专班的可操作提示我把这几年从迁移项目里沉淀下来的实操提示按对象拆开各取所需。对内容管理员迁移前两周开始限制编辑公式的数量减少在途变更重点关注高频更新的课程页和题库页优先做这些页面的公式对比测试记录一份“重点公式页面”清单迁移完成后按清单逐页验收。对运维工程师提前确认内网代码托管平台和依赖仓库的可用性MathJax这类前端库不要指望从外网拉取检查目标服务器上PHP的mbstring扩展是否启用信创发行版里这个扩展有时默认关闭WordPress对中文内容处理会异常配置一份静态资源路径白名单防止新环境的安全策略把woff2字体文件当作可执行文件拦截。对开发工程师先在开发环境模拟一套信创环境的用户代理和渲染上下文提前揭露兼容问题公式渲染相关的代码全部独立成插件或模块避免和主题耦合每次提交代码前跑一遍公式回归用例哪怕只是一个包含公式的简单页面。最后再说一个谁都会忘、但谁都想起来就拍大腿的细节迁移完记得打开WordPress设置里的“站点地址”和“WordPress地址”确认没有残留旧域名否则公式资源会从旧域名拉取白屏或者方框问题会让你以为资源没传上去。这个属于最冤枉的排错方式没有之一。迁移这事说到底是个耐心活儿。公式编辑兼容性只是整个国产化替代过程中一个很小的切面但它牵扯了前端渲染、数据库存储、编辑器交互、运维配置、内容协作好几个层面。把标准定高一点把过程做细一点后面上线后的痛苦就会小很多。