uni-app vue-cli模式下,在ts文件内条件编译#ifdef不生效

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

uni-app vue-cli模式下,在ts文件内条件编译#ifdef不生效

示例代码:

//#ifdef MP-WEIXIN
console.log('queryUnreadMessage  MP-WEIXIN')
//#endif  
//#ifdef H5
console.log('queryUnreadMessage  h5')
//#endif

操作步骤:

  • vue-cli模式直接运行小程序环境

预期结果:

  • 期望是正确条件编译

实际结果:

  • 实际输出异常

bug描述:

//#ifdef MP-WEIXIN
console.log('queryUnreadMessage  MP-WEIXIN')
//#endif  
//#ifdef H5
console.log('queryUnreadMessage  h5')
//#endif

写法如上,该代码在ts文件内时,两条打印都会输出; 在vue文件内同样的写法是正确的。

信息类别 信息内容
产品分类 uniapp/小程序/微信
PC开发环境 Mac
操作系统版本号 14.5 (23F79)
第三方工具版本 1.0
基础库版本号 1.0
项目创建方式 CLI
CLI版本号 2.0.2-4020420240722004

5 回复

提供个完整的写法吧,给一个简单复现工程吧,看描述是 vue2 自己配的 ts 吗,还是打错了 js 代码


vue2,用vue-cli打包的,自己配置的ts,版本是"ts-loader": “^9.5.1”,“typescript”: “^5.6.3”;tsconfig就是使用的官方文档里面推荐的,目前在ts文件内条件编译无效,都会打印出对应的log,js和vue文件内的条件编译是可以的。

回复 shuoS: 你把 ts 换成 js 是不是就好了。之前 vue2 时候 ts 不流行,应该负责预处理器的插件没有处理 ts 文件。你先用 js 顶着,ts 运行有其他问题吗?

回复 DCloud_UNI_OttoJi: 这个问题后面也是不处理了是吧?

uni-app 中使用 Vue CLI 模式时,条件编译 #ifdef 确实有其特定的用法和注意事项,尤其是在 TypeScript 文件中。#ifdefuni-app 特有的预处理指令,用于实现跨平台兼容。然而,由于 TypeScript 的编译流程与 uni-app 的预处理流程是分开的,直接在 .ts 文件中使用 #ifdef 可能会导致不生效的问题。

为了解决这个问题,通常有两种策略:

  1. .vue 文件的 <script lang="ts"> 部分使用条件编译: 这是最常见且推荐的做法,因为 .vue 文件中的 <script> 部分会被 uni-app 的预处理器正确处理。

    <template>
      <view>
        <!-- 模板内容 -->
      </view>
    </template>
    
    <script lang="ts">
    export default {
      data() {
        return {
          message: '#ifdef H5\n这是H5平台特有的信息\n#endif' +
                   '#ifdef APP-PLUS\n这是App平台特有的信息\n#endif'
        };
      },
      mounted() {
        // 这里的代码同样支持条件编译
        #ifdef H5
        console.log('Running on H5 platform');
        #endif
    
        #ifdef APP-PLUS
        console.log('Running on App platform');
        #endif
      }
    }
    </script>
    
    <style scoped>
    /* 样式部分 */
    </style>
    

    注意:虽然上面的示例中直接在 data 返回的对象里拼接了条件编译指令的字符串,但这只是为了演示目的。实际开发中,条件编译应主要用于控制逻辑分支,而非数据绑定。

  2. 使用 .js 文件配合 .d.ts 声明文件: 如果必须在 .ts 文件中使用条件编译逻辑,可以考虑将条件编译逻辑放在 .js 文件中,然后通过 .d.ts 文件为 TypeScript 提供类型声明。这种方法较为复杂,且可能牺牲了一些类型安全。

    // platform.js
    #ifdef H5
    export const platform = 'H5';
    #endif
    
    #ifdef APP-PLUS
    export const platform = 'APP';
    #endif
    
    // platform.d.ts
    declare module '*.js' {
      import { PlatformType } from './types';
      const platform: PlatformType;
      export default platform;
    }
    
    // types.ts
    export type PlatformType = 'H5' | 'APP';
    

    然后在你的 .ts 文件中导入并使用这个变量。

综上所述,推荐在 .vue 文件的 <script lang="ts"> 部分使用条件编译,以保持代码的简洁性和可维护性。如果确实需要在 .ts 文件中处理条件编译逻辑,应考虑上述的 .js + .d.ts 方案,但需注意其复杂性和潜在的类型安全问题。

回到顶部