引入案例
@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