uni-app 自定义条件编译无法区分新增的自定义条件和基准平台条件

发布于 1周前 作者 phonegap100 来自 Uni-App

uni-app 自定义条件编译无法区分新增的自定义条件和基准平台条件

产品分类:

uniapp/小程序/阿里

PC开发环境操作系统:

Windows

PC开发环境操作系统版本号:

w11

HBuilderX类型:

正式

HBuilderX版本号:

3.99

第三方开发者工具版本号:

x.x

基础库版本号:

x.x

项目创建方式:

HBuilderX

示例代码:

{
  "uni-app": {  
    "scripts": {  
      "mp-mpaas": {  
        "title": "mPaas小程序",  
        "BROWSER": "",  
        "env": {  
          "UNI_PLATFORM": "mp-alipay"  
        },  
        "define": {  
          "MP-MPAAS": true,  
          "MP-ALIPAY": false // 如果填加此行某些依赖中会只认MP-ALIPAY条件,无法识别增加的MP-MPAAS命令,如果不加此行,如果打MPAAS包,自定义新增的MP-MPAASMP-ALIPAY都会执行,但是我们项目MPAASALIPAY平台都需要用到  
        }  
      }  
    }  
  }
}

操作步骤:

{
  "uni-app": {  
    "scripts": {  
      "mp-mpaas": {  
        "title": "mPaas小程序",  
        "BROWSER": "",  
        "env": {  
          "UNI_PLATFORM": "mp-alipay"  
        },  
        "define": {  
          "MP-MPAAS": true,  
          "MP-ALIPAY": false // 如果填加此行某些依赖中会只认MP-ALIPAY条件,无法识别增加的MP-MPAAS命令,如果不加此行,如果打MPAAS包,自定义新增的MP-MPAASMP-ALIPAY都会执行,但是我们项目MPAASALIPAY平台都需要用到  
        }  
      }  
    }  
  }
}

预期结果:

{
  "uni-app": {  
    "scripts": {  
      "mp-mpaas": {  
        "title": "mPaas小程序",  
        "BROWSER": "",  
        "env": {  
          "UNI_PLATFORM": "mp-alipay"  
        },  
        "define": {  
          "MP-MPAAS": true,  
          "MP-ALIPAY": false // 如果填加此行某些依赖中会只认MP-ALIPAY条件,无法识别增加的MP-MPAAS命令,如果不加此行,如果打MPAAS包,自定义新增的MP-MPAASMP-ALIPAY都会执行,但是我们项目MPAASALIPAY平台都需要用到  
        }  
      }  
    }  
  }
}

实际结果:

{
  "uni-app": {  
    "scripts": {  
      "mp-mpaas": {  
        "title": "mPaas小程序",  
        "BROWSER": "",  
        "env": {  
          "UNI_PLATFORM": "mp-alipay"  
        },  
        "define": {  
          "MP-MPAAS": true,  
          "MP-ALIPAY": false // 如果填加此行某些依赖中会只认MP-ALIPAY条件,无法识别增加的MP-MPAAS命令,如果不加此行,如果打MPAAS包,自定义新增的MP-MPAASMP-ALIPAY都会执行,但是我们项目MPAASALIPAY平台都需要用到  
        }  
      }  
    }  
  }
}

bug描述:

{
  "uni-app": {  
    "scripts": {  
      "mp-mpaas": {  
        "title": "mPaas小程序",  
        "BROWSER": "",  
        "env": {  
          "UNI_PLATFORM": "mp-alipay"  
        },  
        "define": {  
          "MP-MPAAS": true,  
          "MP-ALIPAY": false // 如果填加此行某些依赖中会只认MP-ALIPAY条件,无法识别增加的MP-MPAAS命令,如果不加此行,如果打MPAAS包,自定义新增的MP-MPAASMP-ALIPAY都会执行,但是我们项目MPAASALIPAY平台都需要用到  
        }  
      }  
    }  
  }
}

6 回复

能继续补充一些代码或者伪代码来解释你遇到的问题吗。看起来是需要判断属于 mp-alipay && mp-mpaas 执行一部分逻辑,mp-alipay && !mp-mpaas 执行一部分逻辑?


请看下独立回复

mp-mpaas是根据mp-alipay拓展的自定义条件编译命令,如果不添加 “MP-ALIPAY”: false “define”: {
“MP-MPAAS”: true
}
直接这样打mp-mpaas包: // #ifdef MP-MPAAS
console.log(‘MP-MPAAS’);
// #endif

// #ifdef MP-ALIPAY
console.log(‘MP-ALIPAY’);
// #endif 会基于MP-ALIPAY基准条件编译,输出 console.log(‘MP-MPAAS’); console.log(‘MP-ALIPAY’);
目前无法区分自定义的命令和基于基准的命令环境!!
如果使用"MP-ALIPAY": false “define”: {
“MP-MPAAS”: true,
“MP-ALIPAY”: false
}
当前项目上倒是能区分MP-MPAAS和MP-ALIPAY 但是依赖中比如uview-ui框架中只用了MP-ALIPAY而不支持其他自定义编译命令,导致部分涉及条件编译的无法生效!!
目前通过vue.config.js一个替换loader操作临时解决的此问题: const includeDir = path.resolve(__dirname, ‘node_modules’);
config.module
.rule(‘string-replace-loader’)
.enforce(‘pre’)
.resource(_path => {
return path.includes(includeDir);
})
.use(‘string-replace-loader’)
.loader(‘string-replace-loader’)
.tap(
=> {
return {
search: ‘MP-ALIPAY’,
replace: (match, p1, offset, string) => {
return MP-ALIPAY || MP-MPAAS;
},
flags: ‘g’,
};
});

另外尝试源码中修复此问题 node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-preprocess-loader/index.js: 47
// MP_ALIPAY可调整为基准平台,node_modules使用自定义基准平台命令,不使用自定义命令
context.MP_ALIPAY = resourcePath.includes(path.resolve(__dirname, ‘node_modules’)); 调试部分成功,但是后面传入的内容又变了,未修复成功

感谢反馈,我看了你补充的内容,尝试理解之后,还是感觉还是在判断支付宝和钉钉小程序的作用范围问题。
举例你提到的 mpaas 是基于 alipay 的,如果想区分判断两个平台可以参考下面的 demo,可以直接运行
https://gitcode.net/xiurensha5731/uni-app-questions/-/tree/q/dingding-alipay

支付宝钉钉 都可以看见
只有支付宝可以看见
<!-- #ifdef MP-DINGTALK -->  
<div>只有钉钉可以看见</div>  
<!-- #endif -->  

<!-- #endif -->  

如果我理解的不正确,请按照我提供的 demo 进行补充说明,方便我复现

在 uni-app 中,条件编译是一种非常强大的功能,它允许开发者根据不同的平台或自定义条件来编译不同的代码。然而,如果你在自定义条件编译时遇到无法区分新增的自定义条件和基准平台条件的问题,可能是由于以下几个原因导致的:

1. 条件编译的语法问题

确保你使用了正确的条件编译语法。uni-app 的条件编译语法是基于 #ifdef#ifndef#endif 的。例如:

// 平台条件编译
#ifdef H5
console.log('This is running on H5 platform');
#endif

// 自定义条件编译
#ifdef MY_CUSTOM_CONDITION
console.log('This is running under MY_CUSTOM_CONDITION');
#endif

2. 自定义条件的定义问题

确保你在 manifest.json 文件中正确定义了自定义条件。例如:

{
  "h5": {
    "condition": {
      "MY_CUSTOM_CONDITION": true
    }
  }
}

3. 编译配置问题

如果你在 manifest.json 中定义了自定义条件,但仍然无法区分,可能是因为编译配置没有正确加载。确保你在编译时使用了正确的 manifest.json 文件,并且在编译过程中没有覆盖或忽略这些配置。

4. 平台条件的优先级

uni-app 的平台条件(如 H5MP-WEIXIN 等)是内置的,它们的优先级可能高于自定义条件。如果你同时使用了平台条件和自定义条件,可能会导致自定义条件被忽略。你可以尝试在自定义条件中明确排除平台条件:

#ifndef H5
#ifdef MY_CUSTOM_CONDITION
console.log('This is running under MY_CUSTOM_CONDITION and not on H5');
#endif
#endif

5. 编译工具的版本问题

确保你使用的 uni-app 编译器是最新版本,因为旧版本可能存在一些 bug 或限制。你可以通过以下命令更新 uni-app 编译器:

npm update -g @dcloudio/uni-cli

6. 调试和日志

在调试过程中,你可以通过添加日志来检查条件编译是否按预期工作。例如:

console.log('Current platform:', process.env.UNI_PLATFORM);
console.log('Custom condition:', MY_CUSTOM_CONDITION);

通过这些日志,你可以更清楚地了解当前的环境和条件。

7. 检查其他配置文件

有时,其他配置文件(如 vue.config.jswebpack.config.js)可能会影响条件编译的行为。确保这些配置文件中没有与条件编译冲突的设置。

8. 清除缓存

有时,缓存可能导致条件编译不生效。你可以尝试清除缓存并重新编译项目:

npm run clean
npm run dev
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!