<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>跨端技术 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E8%B7%A8%E7%AB%AF%E6%8A%80%E6%9C%AF/</link><description>Recent content in 跨端技术 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E8%B7%A8%E7%AB%AF%E6%8A%80%E6%9C%AF/index.xml" rel="self" type="application/rss+xml"/><item><title>跨端技术 面试题</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-questions/tag-24-88e618f1/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-questions/tag-24-88e618f1/</guid><description>&lt;p&gt;共 19 道 跨端技术 面试题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-da6f0b14-5108-4b3d-8949-b34d7f746509"&gt;1. 跨平台的开发中，如何处理不同平台的 API 差异？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;难度：2 · 类型：QA&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;条件编译：在编译阶段，通过特定注释（如 // #ifdef MP-WEIXIN）来区分不同平台，编写差异化代码。&lt;/p&gt;
&lt;p&gt;适配器模式（Adapter Pattern）：在运行时，封装一个统一的工具类（Adapter），在内部判断环境并调用对应的原生 API。例如，封装一个 StorageAdapter，内部判断环境并分别调用 uni.setStorageSync 或浏览器的 localStorage，对业务代码提供统一的 Promise 接口 。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;处理不同平台的 API 差异，是跨平台开发中的核心挑战。其目标是在享受跨平台开发效率的同时，确保应用在各平台上的功能完整、性能稳定、体验原生。关键在于通过良好的架构设计来&lt;strong&gt;隔离与抽象&lt;/strong&gt;平台细节。&lt;/p&gt;
&lt;h3 id="核心原则与架构思想"&gt;核心原则与架构思想&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;抽象与统一接口层&lt;/strong&gt;：这是最根本的策略。不要在各处业务代码中直接调用平台特定的 API，而是&lt;strong&gt;封装一个统一的接口层&lt;/strong&gt;。业务逻辑只与这个抽象层交互，由它来屏蔽底层的平台差异。例如，一个文件操作模块，可以定义统一的 &lt;code&gt;readFile&lt;/code&gt; 和 &lt;code&gt;writeFile&lt;/code&gt; 方法，然后在内部根据平台调用不同的原生实现 。这种设计使得核心业务代码保持平台无关性，极大提升了可维护性 。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;渐进增强与平稳退化&lt;/strong&gt;：在设计功能时，采用“渐进增强”思想。即，&lt;strong&gt;优先保证核心功能在所有平台都能运行&lt;/strong&gt;，然后为高版本平台或特定平台增强更优的体验。同时，做好“平稳退化”，对于不支持某些高级功能的平台，提供合适的降级方案，而不是让功能崩溃 。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="关键技术方案与手段"&gt;关键技术方案与手段&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;条件编译&lt;/strong&gt;：这是在&lt;strong&gt;编译时&lt;/strong&gt;处理差异的高效方式。通过预定义的宏或配置，编译器只会将当前目标平台的代码打包到最终产物中 。例如，在 C++ 或前端构建工具中，可以使用 &lt;code&gt;#ifdef _WIN32&lt;/code&gt; 或类似语法，为不同平台编写不同的代码路径。这种方式打包结果纯净，但需要构建工具支持 。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;运行时检测与分支判断&lt;/strong&gt;：这是在&lt;strong&gt;代码运行时&lt;/strong&gt;根据当前所处的平台环境，动态选择执行不同的逻辑。这是最常见和灵活的方式 。各框架通常提供全局的 API 用于获取平台信息，例如 React Native 的 &lt;code&gt;Platform.OS&lt;/code&gt; 和 &lt;code&gt;Platform.select()&lt;/code&gt; 方法 ，或 UniApp 中的 &lt;code&gt;uni.getSystemInfoSync().platform&lt;/code&gt; 。这种方式灵活直观，但代码中会存在一些分支判断。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;文件/模块约定&lt;/strong&gt;：一些框架支持通过特定的文件命名约定来区分平台代码。例如，在 React Native 中，可以创建 &lt;code&gt;Component.ios.js&lt;/code&gt; 和 &lt;code&gt;Component.android.js&lt;/code&gt; 文件。在导入时，只需 &lt;code&gt;import Component from './Component'&lt;/code&gt;，框架会自动根据平台加载正确的文件 。这是一种将平台差异隔离在文件级别的优雅实践。&lt;/p&gt;</description></item></channel></rss>