跨平台公告插件系统 - Hard-Mode 面试题
覆盖:Rollup 极致体积治理(<15KB)、Tree Shaking、Preact signals、热插拔、CDN/Iframe/Web Component 多模式植入
1. 体积与打包:< 15KB 的硬指标
- “15KB”这个体积口径是什么?gzip/br 后还是原始 minified?如何定义门槛?
- 追问:为什么选这个口径?如何在 CI 里做体积门禁?
- 你如何系统性地定位体积来源?分析工具/方法是什么?
- 追问:你更信任 bundle analyzer 还是产物逐文件 diff?
- Tree Shaking 生效的前提是什么?你如何保证依赖链都满足?
- 追问:遇到 CJS 依赖怎么办?如何替换或隔离?
- sideEffects 如何声明?怎么防止“声明错误导致线上功能丢失”?
- 追问:你会如何写验证用例或自动化检查?
- 你如何处理“开发/调试代码”不进产物?
- 追问:debug flag、dead code elimination、条件编译分别怎么做?
2. Preact + signals:响应式与更新粒度
- signals 的核心机制是什么?它为什么可能比 React hooks 更省更新?
- 追问:依赖收集在哪里发生?更新传播如何避免整树 re-render?
- signals 的“隐式依赖”会带来什么可维护性风险?如何规避?
- 追问:团队心智、调试、边界副作用、与异步/请求状态的结合。
- 你为什么不选 React(或 web components-only)?你的决策矩阵是什么?
- 追问:体积、生态、集成成本、宿主环境约束各占多大权重?
3. 热插拔架构:生命周期与资源回收
- 插件生命周期你怎么设计?init/mount/update/unmount 的契约是什么?
- 追问:宿主如何传参(配置/用户态/权限/语言)?如何做版本协商?
- unmount 的“彻底回收”如何保证?最常见的泄漏点是什么?
- 追问:事件监听、定时器、订阅、DOM 残留、全局变量污染。
- 异常兜底怎么做:加载失败、初始化异常、运行时崩溃?
- 追问:熔断/降级策略是什么?如何快速下线某版本?
- 接入周期 < 0.5 人日:标准化的关键是什么?
- 追问:文档、脚手架、配置化、自动化验证各自贡献了什么?
4. 多模式植入:CDN / Iframe / Web Component
- 三种方案的隔离维度分别是什么(JS/CSS/路由/存储)?
- 追问:你如何向面试官解释“为什么不是一刀切”?
- CDN 直插最容易发生什么问题?你如何防止样式冲突与全局污染?
- 追问:CSS 前缀、shadow DOM、BEM、reset 冲突各怎么处理?
- Iframe 隔离最强,但通信复杂:你怎么设计通信协议?
- 追问:postMessage 的安全边界(origin 校验)、消息幂等与顺序如何处理?
- Web Component 的优势与坑:你遇到过哪些浏览器兼容/样式/事件问题?
- 追问:shadow DOM 下样式主题化怎么做?
5. 版本治理与可观测性
- 插件版本如何治理:宿主与插件的兼容策略是什么?
- 追问:semver 是否足够?如何做 breaking change 管控?
- 如何做监控:加载成功率、白屏率、错误率、性能指标?
- 追问:埋点字段如何设计以支持“按宿主系统/版本/渠道”定位?