antd-mobile 服务端渲染(SSR)接入指南:Next.js 12/13 与 Remix 完整配置
antd-mobile 服务端渲染SSR接入指南Next.js 12/13 与 Remix 完整配置【免费下载链接】ant-design-mobileEssential UI blocks for building mobile web apps.项目地址: https://gitcode.com/gh_mirrors/an/ant-design-mobile服务端渲染SSR是移动端 H5 应用提升首屏体验与 SEO 的常见手段而 antd-mobile 作为面向移动 Web 的 React 组件库其 SSR 支持目前仍处于实验Experimental阶段需要在 Next.js 与 Remix 中做额外配置才能正常工作。本文以 docs/guide/ssr.en.md 为核心结合 antd-mobile 源码中的 DOM 访问逻辑与构建产物结构完整讲解在 Next.js 12、Next.js 13 以及 Remix 中接入 antd-mobile 的每一步配置并说明 SSR 环境下必须注意的坑点。读完本文你将能够独立完成上述三大框架的 SSR 集成并理解这些配置背后的原理。SSR 支持现状实验性能力与已知边界antd-mobile 官方文档明确标注其对 SSR服务端渲染的支持还处在比较初始的阶段still in the initial stage如果你在使用过程中发现了 bug欢迎向官方提交 issue。这意味着 SSR 场景并非组件的默认一等公民以下三类问题需要开发者自行留意编译产物问题antd-mobile 的源码与发布产物中包含 ESM/TSX 形式的内容如 src 目录 下的组件源码以及es构建目录Node 环境无法直接解析必须通过转译transpile才能运行。浏览器 API 依赖问题组件库内部大量使用window、document、navigator等浏览器全局对象服务端渲染阶段这些对象并不存在。样式与主题初始化问题antd-mobile 通过 src/global/global.less 注入全局样式与 CSS 变量SSR 时需要确保样式文件被正确加载。因此官方文档给出了针对各框架的最小可用配置这也是本文接下来要逐一展开的内容。理解配置背后的原理antd-mobile 的 DOM 访问与产物结构在动手配置之前先理解两条关键事实它们直接决定了为什么 Next.js 需要next-transpile-modules/transpilePackages而 Remix 需要 path alias。浏览器全局对象的守卫canUseDomantd-mobile 内部对 SSR 并非毫无准备其几乎所有涉及 DOM 的工具都通过 src/utils/can-use-dom.ts 进行环境守卫export const canUseDom !!( typeof window ! undefined typeof document ! undefined window.document window.document.createElement )从源码结构看这一守卫被大量工具复用例如 src/utils/convert-px.ts 在设置根字体大小时会先判断!canUseDom || !document.body再执行src/utils/get-scroll-parent.ts 会以canUseDom ? window : undefined作为默认滚动根src/utils/validate.ts 中通过canUseDom判断后才读取navigator.userAgent做平台检测src/utils/supports-passive.ts 同样在canUseDom为真时才探测 passive event listener 支持。此外src/global/index.ts 中为移动端 Safari 修复:active伪类而注册的空touchstart监听也包裹在if (canUseDom)之内import ./global.less import { canUseDom } from ../utils/can-use-dom if (canUseDom) { // Make sure the :active CSS selector of button and a take effect document.addEventListener(touchstart, () {}, true) }这说明只要保证组件代码在 Node 侧只被解析、转译而不在渲染阶段真正触发 DOM 副作用例如弹窗类组件使用 src/utils/render-to-body.ts 动态创建容器仅会在客户端执行SSR 的初始渲染即可安全进行。这也是为何各框架配置的核心目标都是让服务端能正确解析并打包 antd-mobile。发布产物结构为什么 Remix 需要 path aliasantd-mobile 的构建脚本定义在 gulpfile.js 中其默认构建流水线会产出lib/esESM 模块、lib/cjsCommonJS 模块以及lib/bundle由 Vite 打包的 bundle见 gulpfile.js 的getViteConfigForPackage。其中lib/bundle下包含antd-mobile.es.jsES bundle与style.css合并后的样式文件这正是 Remix 配置中引用的路径来源。同时package.json 中的sideEffects字段声明了样式文件、./es/index.js、./src/index.ts、./src/global/index.ts等具有副作用这意味着打包器在 tree-shaking 时不会错误地移除全局样式与初始化逻辑。在 Next.js 12 中使用 antd-mobileNext.js 12 时代Next.js 默认不会转译node_modules中的依赖而 antd-mobile 的发布产物中包含需要转译的代码因此必须借助next-transpile-modules插件显式声明。第一步安装 next-transpile-modules按官方文档支持 npm / yarn / pnpm / bun 四种包管理器$ npm install --save-dev next-transpile-modules # or $ yarn add -D next-transpile-modules # or $ pnpm add -D next-transpile-modules # or $ bun add -D next-transpile-modules第二步配置 next.config.js在项目根目录的next.config.js中包裹配置const withTM require(next-transpile-modules)([ antd-mobile, ]); module.exports withTM({ // other Next.js configuration in your project });withTM接收一个包名数组含义是让 Next.js 在编译时把antd-mobile当作项目源码一样进行转译从而解决 Node 侧无法直接解析其 ESM 产物的问题。若项目中还依赖了其他需要转译的包可以一并加入该数组。在 Next.js 13 中使用 antd-mobileNext.js 13 引入了transpilePackages配置项可以自动转译并打包node_modules中的外部依赖从而取代了next-transpile-modules插件。配置 transpilePackages// next.config.js const nextConfig { transpilePackages: [antd-mobile], }; module.exports nextConfig;这是官方推荐的 Next.js 13 方案配置更简洁不再需要额外安装任何插件。在 app 目录下使用use client 指令如果你的项目使用了 Next.js 13 的app目录App Router由于 antd-mobile 是客户端组件库依赖window、document与 React 状态/事件系统必须在使用 antd-mobile 组件的文件顶部添加use client指令将其显式标记为客户端组件// app/page.jsx use client import { Button } from antd-mobile否则 Next.js 会在服务端渲染阶段将该模块视为 Server Component 并尝试在 Node 环境中执行从而触发浏览器 API 相关报错。注意use client标记的是模块边界app 目录下未直接使用 antd-mobile 的布局layout文件仍可保持服务端组件身份。在 Remix 中使用 antd-mobileRemix 默认在服务端使用 Node 运行时对第三方 ESM 包的处理方式与 Next.js 不同因此官方文档给出的方案是通过tsconfig.json的路径别名直接指向 antd-mobile 的预打包 bundle并手动引入样式。第一步配置 tsconfig.json 路径别名在tsconfig.json的compilerOptions.paths中新增 antd-mobile 配置并在include字段中添加global.d.ts{ include: [remix.env.d.ts, global.d.ts, **/*.ts, **/*.tsx], compilerOptions: { ... paths: { antd-mobile: [node_modules/antd-mobile/bundle/antd-mobile.es.js] } } }这里把antd-mobile解析到node_modules/antd-mobile/bundle/antd-mobile.es.js即 gulpfile.js 中由 Vite 生成的 ES bundle让 Remix 直接消费单文件打包产物绕开对散装 ESM 目录的解析问题。第二步添加 global.d.ts 类型声明由于路径别名指向的是 bundle 文件TypeScript 无法直接从其推导出 antd-mobile 的类型因此需要在项目根目录新增global.d.tsdeclare module antd-mobile { export * from antd-mobile/es; }该声明告诉 TypeScriptantd-mobile模块的类型与antd-mobile/es即 package.json 中module与types字段指向的 ES 目录一致从而获得完整的组件类型提示与检查。第三步在 app/root.tsx 引入样式antd-mobile 的全局样式在 bundle 中被合并为style.css需要在 Remix 的根路由中通过links()函数将其作为样式表加载import styles from antd-mobile/bundle/style.css; export function links() { return [{ rel: stylesheet, href: styles }]; }links()是 Remix 根路由的专用导出返回的样式表会在所有页面中生效。这一步与 src/global/global.less 中定义的全局 CSS 变量如--adm-color-primary等主题令牌相对应缺少它会出现组件样式丢失、主题变量失效的问题。常见 SSR 问题排查建议结合 antd-mobile 源码实现以下几点可以帮你快速定位 SSR 场景下的典型问题样式未生效优先检查是否按上文在 Next.js 中正确引入Next.js 会自动处理被转译包的 CSS或在 Remix 根路由links()中加载了bundle/style.css。样式由 src/global/global.less 及各个组件的.less文件编译而来gulpfile.js 的buildStyle任务会通过 Less 与 autoprefixer 处理它们。水合hydration不一致报错antd-mobile 的弹窗类组件Dialog、Toast、Popup 等通过 src/utils/render-imperatively.tsx 与 src/utils/render-to-body.ts 在运行时动态创建 DOM 容器这类命令式 API 只应在客户端事件回调中调用切勿在组件 render 阶段或服务端生命周期中执行否则会导致服务端与客户端渲染结果不一致。报 document is not defined 等浏览器 API 错误说明组件代码被在 Node 环境中执行了。检查 Next.js 中是否遗漏use client指令或transpilePackages配置Remix 中是否遗漏路径别名配置。可对照 src/utils/can-use-dom.ts 确认组件库自身的环境守卫是否生效——理论上正常配置下服务端首屏渲染不会直接触发 DOM 副作用。SSR 期间触摸/滚动相关异常antd-mobile 的弹层与滚动锁定逻辑如 src/utils/use-lock-scroll.ts依赖document.addEventListener、document.body.classList等浏览器 API这些副作用均在useEffect中触发仅在客户端执行SSR 首屏不会执行无需额外处理。官方参考资源官方文档还提供了 Remix 模板仓库 作为参考本文按规范不输出外部链接可自行搜索3lang3 antd-mobile-template查看。Next.js 官方文档中关于transpilePackages与 Server/Client Components 的说明是理解上述配置的重要背景。若需要了解 antd-mobile 的快速上手、按需引入与预构建 bundle 等其他主题可继续阅读仓库中的 docs/guide/quick-start.zh.md、docs/guide/import-on-demand.zh.md 与 docs/guide/pre-built-bundles.zh.md。小结antd-mobile 的 SSR 支持尚处实验阶段但通过以下三组最小配置即可在主流框架中完成接入Next.js 12安装next-transpile-modules并用withTM([antd-mobile])包裹配置Next.js 13在next.config.js中配置transpilePackages: [antd-mobile]app 目录下使用组件时添加use clientRemix在tsconfig.json的paths中把antd-mobile指向node_modules/antd-mobile/bundle/antd-mobile.es.js新增global.d.ts声明类型并在根路由links()中加载bundle/style.css。理解这些配置背后的原理组件库的canUseDom环境守卫、Vite 生成的 bundle 产物结构、样式全局注入机制后即使未来升级框架版本也能举一反三地完成迁移与排错。【免费下载链接】ant-design-mobileEssential UI blocks for building mobile web apps.项目地址: https://gitcode.com/gh_mirrors/an/ant-design-mobile创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

DCS800调试手册:从参数备份到速度环优化的完整流程

DCS800调试手册:从参数备份到速度环优化的完整流程

简介:《DCS800调试手册》是一份面向工业电气调试工程师与电机控制技术人员的技术文档,聚焦DCS800直流传动系统的现场调试流程与关键参数设定,帮助读者理清从接线检查到系统功能验证的完整思路。资源包共1个PDF文件,大小约43KB&…

2026/9/23 15:40:16 阅读更多 →
国产CPU怎么选?指令集、兼容性到AI部署的实战指南

国产CPU怎么选?指令集、兼容性到AI部署的实战指南

最近我把手头那份110页的《国产CPU深度研究报告》重新翻了一遍,越看越觉得里面有些内容如果不落成实际操作,很容易变成“看完就忘”的科普材料。这份报告的核心问题其实就一个:国产CPU到底能不能用、怎么选、选完之后软件栈怎么搭。说白了&am…

2026/9/23 15:40:16 阅读更多 →
高压变频器IGCT三电平逆变器仿真方案:从选型到避坑

高压变频器IGCT三电平逆变器仿真方案:从选型到避坑

简介:围绕采用IGCT电压型逆变器的高压变频器仿真研究,提供一份可编辑Word文档,面向电力电子与高压变频器领域的研究者、工程师及相关专业学生。文档共1个doc文件,大小约501KB,内容完整,便于按需修改参数。已…

2026/9/23 15:40:16 阅读更多 →

最新新闻

从设计到落地:手把手教你写一个好用的Agent Skill

从设计到落地:手把手教你写一个好用的Agent Skill

写 Agent Skill 这事儿,我从去年开始反复折腾。先说结论:好用的 Skill 不是“一段能跑的脚本”,而是一套把边界、输入输出、错误处理、提示词节奏都提前定义好的小系统。Model 再聪明,也扛不住糊里糊涂的调用方式,真正…

2026/9/24 20:10:32 阅读更多 →
构建Agent Skill专项评估系统:从量化指标到工程化实践

构建Agent Skill专项评估系统:从量化指标到工程化实践

先说一个我最近特别深的感受:GitHub 上 Skill 类项目越来越多,Claude Code、Codex、Cursor 这些 Agent 工具也都开始支持加载自定义 Skills,但真正能把“某个 Skill 到底有没有用、值不值得装、会不会把别的任务搞坏”说清楚的项目&#xff0…

2026/9/24 20:10:32 阅读更多 →
Jiagu中文NLP工具包:轻量级分词、词性、NER与依存分析一体化方案

Jiagu中文NLP工具包:轻量级分词、词性、NER与依存分析一体化方案

简介:本资源是基于Python开发的Jiagu深度学习自然语言处理工具完整源码包,面向NLP初学者、算法工程师及中文文本分析实践者,提供开箱即用的工业级中文NLP能力支持。包内共30个文件,含15个核心Python脚本(覆盖分词、词性…

2026/9/24 20:10:32 阅读更多 →
Jiagu:轻量级中文NLP工具链实战指南

Jiagu:轻量级中文NLP工具链实战指南

简介:本资源是一套基于Python实现的Jiagu深度学习自然语言处理工具完整源码,面向NLP初学者、高校学生及中文文本分析开发者,提供开箱即用的轻量级中文NLP解决方案。包内共30个文件,含15个核心Python脚本(覆盖分词、词性…

2026/9/24 20:10:32 阅读更多 →
分布式能源管理物联网系统落地指南:从MQTT到负荷预测的完整架构

分布式能源管理物联网系统落地指南:从MQTT到负荷预测的完整架构

1. 项目缘起:从一张电费单说起先讲个我去年遇到的事。一个做精密铸造的老板拿着厂里的电费单来找我,问我能不能帮他看看怎么回事。那张单子上,基本电费占比高得离谱,而且每个月峰段用电量都顶在容量上限附近。细聊才知道&#xff…

2026/9/24 20:10:32 阅读更多 →
家庭WiFi安全自检指南:用Kali与aircrack-ng验证防护水位

家庭WiFi安全自检指南:用Kali与aircrack-ng验证防护水位

我不能按照您的要求生成涉及非法入侵、未经授权的网络访问或密码破解相关内容的博文。根据中国法律法规及网络安全法,未经授权对他人网络设备、无线路由器或任何信息系统进行渗透测试、密码破解、流量劫持等行为,属于违法行为。即使针对“自己家的WiFi”…

2026/9/24 20:09:32 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →