uni-app:条件编译#ifdef--#ifndef--#endif

  1. 引入案例
    1. 常见平台标识(Flags)
    2. 关键指令
  2. 一个条件编译引发的错误
    1. 错误描述
    2. 问题原因

引入案例

@mixin text-ellipsis($i: '1') {
  /* #ifdef APP-NVUE */
  lines: $i;
  text-overflow: ellipsis;
  overflow: hidden;
  flex: 1;
  /* #endif */

  /* #ifndef APP-NVUE */
  @if $i == '1' {
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
  } @else {
    display: -webkit-box !important;
    overflow: hidden;
    text-overflow: ellipsis;
    word-break: break-all;
    -webkit-line-clamp: $i;
    -webkit-box-orient: vertical !important;
  }
  /* #endif */
}

这不是标准 CSS 或 SCSS 的语法,而是 uni-app 特有的「条件编译」语法(Conditional Compilation),用于在同一个文件中为不同平台编写不同的代码

  • #ifdef如果定义了某个平台,就保留这段代码

    • /* #ifdef APP-NVUE */:编译到 App-NVUE 时保留;编译到 H5、微信小程序等时整段被删除
  • #ifndef如果没有定义某个平台,就保留这段代码

    • /* #ifndef APP-NVUE */:编译到 H5、微信小程序、App-Vue 等时保留;仅在 NVUE 下被删除

常见平台标识(Flags)

标识 含义
APP-NVUE App 平台的 NVUE 页面(原生渲染)
APP-VUE App 平台的 Vue 页面(Webview 渲染)
H5 浏览器(Web)平台
MP-WEIXIN 微信小程序
MP-ALIPAY 支付宝小程序
MP-TOUTIAO 抖音/头条小程序
MP-QQ QQ 小程序
MP-BAIDU 百度小程序

关键指令

指令 作用
/* #ifdef 平台 */ 如果是该平台,保留代码
/* #ifndef 平台 */ 如果不是该平台,保留代码
/* #else */ 否则(uni-app 3.0+)
/* #endif */ 结束条件块

它们是 uni-app 实现“一套代码,多端适配”的基石,让你优雅地处理平台差异,而无需维护多套项目。

一个条件编译引发的错误

错误描述

routerTo("/pages/shop/order")

export function routerTo(url,type="navigateTo") {  
  if(type=="navigateTo"){	
	  console.log("navigateTo-1");
	  console.log(url);
	  console.log(typeof url == 'string');
	  uni.navigateTo({
	  	url,
		fail:err=>{
			console.log(err);
			routerTo(url,"reLaunch")
		}
	  })
	  console.log("navigateTo-2")
  }
  .....
}

// 在执行上面代码的时候,报了如下错误:
// TypeError: Cannot read property 'split' of undefined. 
// 错误的地方是 : uni.navigateTo

// 我的uni-id-pages的配置

	"uniIdRouter": {
		// #ifndef MP-WEIXIN 
		"loginPage": "uni_modules/uni-id-pages/pages/login/login-withpwd", 
		// #endif 
		"needLogin": [ 
			"pages/shop/order"
		]
	}

// 如果我删除needLogin的配置,就可以正常跳转到"pages/shop/order"。

// 这个问题只在 小程序上出现,浏览器不会。

问题原因

你配置了:

// #ifndef MP-WEIXIN
"loginPage": "uni_modules/uni-id-pages/pages/login/login-withpwd",
// #endif

所以在 微信小程序 里,loginPage 不存在。
但你又配了:

"needLogin": [
  "pages/shop/order"
]

于是访问这个页面时,uni-id-pages 发现“这个页面需要登录”,准备跳到登录页,结果登录页配置没了,内部拿空值继续做字符串处理,最后报:

TypeError: Cannot read property 'split' of undefined

×

喜欢就点赞,疼爱就打赏