一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

uni-app如何获取当前运行平台环境 uni-app条件编译宏定义使用详解

时间:2026-06-20 11:04:52 编辑:袖梨 来源:一聚教程网

<p>应使用条件编译而非uni.getSystemInfoSync().platform判断平台,因其返回底层环境而非目标平台;条件编译需用/ #ifdef 平台 /注释格式,严格匹配宏名且不可跨文件传递。</p>

uni.getSystemInfoSync().platform 返回值不可靠

在真机上 uni.getSystemInfoSync().platform 有时返回 "ios""android",但 H5 环境下它可能返回 "web",而小程序平台(如微信、支付宝)反而可能返回空字符串或 "devtools"。这不是 bug,是 API 设计本意:它返回的是「底层运行环境」,不是「当前编译目标平台」。

真正需要判断「当前代码跑在哪个平台(微信小程序?H5?App?)」时,必须用条件编译,不能依赖运行时 API。

  • 条件编译在编译阶段就剔除无关代码,体积小、无兼容风险
  • uni.getSystemInfoSync() 适合查屏幕宽高、是否支持 vibration 等设备能力,不适合做平台路由
  • 微信开发者工具模拟器里 platform 常为 "devtools",和真机行为不一致,容易误判

条件编译宏怎么写才不被忽略

uni-app 的条件编译必须写成注释格式,且紧贴代码上下文,中间不能有空行或其它注释干扰。常见错误是加了多余空格、用了双斜杠 // 而非 /* #ifdef ... */,或者放在 export default 外部导致整个模块被跳过。

正确写法示例:

/* #ifdef H5 */console.log('这是 H5 平台')/* #endif */<p>/<em> #ifdef MP-WEIXIN </em>/wx.login()/<em> #endif </em>/</p><p>/<em> #ifdef APP-PLUS </em>/uni.getBatteryInfo()/<em> #endif </em>/
  • 平台宏名必须全大写,且严格匹配文档:H5MP-WEIXINMP-ALIPAYAPP-PLUSAPP-PLUS-NVUE
  • 多个平台用英文逗号拼接:/* #ifdef H5,MP-WEIXIN */
  • 否定写法用 #ifndef,比如 /* #ifndef APP-PLUS */ 表示「非 App 平台」
  • 宏定义只对紧邻的下一行或多行代码生效,跨组件/文件不传递

process.env.NODE_ENV 和 __UNI_MP_VERSION 是啥

process.env.NODE_ENV 是 Node.js 构建环境变量,uni-app 编译时会注入,但它只区分 "development""production",**完全不反映平台信息**。有人误用它做平台判断,结果 H5 和小程序都输出 "production",逻辑直接崩掉。

__UNI_MP_VERSION 是 uni-app 内部注入的常量,仅在小程序平台存在,值为对应基础库版本号(如 "2.7.0"),但它无法区分微信、支付宝等不同小程序——所有小程序平台都会定义它。

  • 这两个变量都不能替代条件编译宏
  • 想动态获取当前平台名称?没有运行时全局变量。唯一可靠方式是:自己用条件编译定义一个 PLATFORM 常量
  • 例如在 main.js 开头写:
    /* #ifdef H5 */const PLATFORM = 'h5'/* #endif *//* #ifdef MP-WEIXIN */const PLATFORM = 'mp-weixin'/* #endif */

条件编译嵌套和 JS 文件里怎么用

条件编译可以嵌套,但深度建议控制在两层以内,否则可读性骤降。JS 文件中使用没问题,但要注意:不能在对象字面量或函数参数里直接写宏,必须整块代码包裹。

错误写法:

const config = {  /* #ifdef H5 */  api: 'https://h5.api.com',  /* #endif */  timeout: 10000}
—— 这会导致语法错误,因为宏展开后 JSON 结构被破坏。
  • 正确做法是把整个对象或配置项用宏包住:
    /* #ifdef H5 */const config = { api: 'https://h5.api.com', timeout: 10000 }/* #endif *//* #ifdef MP-WEIXIN */const config = { api: 'https://mp.api.com', timeout: 15000 }/* #endif */
  • TS 项目中,类型声明也要对应条件编译,否则类型检查会报错
  • Vue 单文件组件里,<script><template><style> 都支持独立条件编译,互不影响
  • 注意:条件编译不作用于 require 动态路径,require(`./api/${PLATFORM}.js`) 这种写法无效

实际项目里最常踩的坑,是把条件编译当运行时 if 用,或者指望某个变量能跨平台统一取值。它本质是“编译期代码剪枝”,不是“运行时分支判断”——这点没理清,后面所有逻辑都会偏。

热门栏目