downey
downey
  • 发布:2023-12-25 10:38
  • 更新:2023-12-27 16:49
  • 阅读:198

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

分类: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平台都需要用到  
        }  
      }  
    }  
  }
2023-12-25 10:38 负责人:无 分享
已邀请:
DCloud_UNI_OttoJi

DCloud_UNI_OttoJi - 日常回复 uni-app/x 问题,如果艾特我没看到,请主动私信

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

  • downey (作者)

    请看下独立回复

    2023-12-27 16:08

downey

downey (作者) - http://www.kekuming.xin

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',  
                };  
            });
downey

downey (作者) - http://www.kekuming.xin

另外尝试源码中修复此问题
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'));

调试部分成功,但是后面传入的内容又变了,未修复成功

DCloud_UNI_OttoJi

DCloud_UNI_OttoJi - 日常回复 uni-app/x 问题,如果艾特我没看到,请主动私信

感谢反馈,我看了你补充的内容,尝试理解之后,还是感觉还是在判断支付宝和钉钉小程序的作用范围问题。

举例你提到的 mpaas 是基于 alipay 的,如果想区分判断两个平台可以参考下面的 demo,可以直接运行

https://gitcode.net/xiurensha5731/uni-app-questions/-/tree/q/dingding-alipay

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

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

    <!-- #endif -->  
  </div>

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

要回复问题请先登录注册