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-MPAAS及MP-ALIPAY都会执行,但是我们项目MPAAS和ALIPAY平台都需要用到
}
}
}
}
}
操作步骤:
{
"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-MPAAS及MP-ALIPAY都会执行,但是我们项目MPAAS和ALIPAY平台都需要用到
}
}
}
}
}
预期结果:
{
"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-MPAAS及MP-ALIPAY都会执行,但是我们项目MPAAS和ALIPAY平台都需要用到
}
}
}
}
}
实际结果:
{
"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-MPAAS及MP-ALIPAY都会执行,但是我们项目MPAAS和ALIPAY平台都需要用到
}
}
}
}
}
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-MPAAS及MP-ALIPAY都会执行,但是我们项目MPAAS和ALIPAY平台都需要用到
}
}
}
}
}
能继续补充一些代码或者伪代码来解释你遇到的问题吗。看起来是需要判断属于 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 进行补充说明,方便我复现