Vue跨端项目里怎么处理平台差异代码?

端木福萍 阅读 42

最近用 Vue + UniApp 做一个同时跑在微信小程序和 H5 上的项目,有些组件在不同平台表现不一样。比如我想在 H5 里用 div,在小程序里用 view,但写成条件编译又觉得维护麻烦。有没有更优雅的方式?

我试过用 process.env 平台判断,但好像在模板里不生效。现在临时这么写的:

<template>
  <view v-if="isH5">H5 内容</view>
  <view v-else>小程序内容</view>
</template>

<script>
export default {
  computed: {
    isH5() {
      return uni.getSystemInfoSync().platform === 'h5';
    }
  }
}
</script>

但感觉每次都要写 computed 很啰嗦,有没有推荐的最佳实践?

我来解答 赞 8 收藏
二维码
手机扫码查看
1 条解答
端木佳佳
UniApp 自带条件编译,模板里直接这么写就行,编译后会自动剔除不需要的代码:

<template>
<!-- #ifdef H5 -->
<div class="card">H5 专用</div>
<!-- #endif -->

<!-- #ifndef H5 -->
<view class="card">小程序专用</view>
<!-- #endif -->
</template>


这个是编译时处理的,不会增加运行时开销,比你用 v-if 判断优雅多了。

如果你觉得模板里写一堆条件编译乱,可以把平台差异抽成单独组件。比如搞个 CrossPlatform.vue:

<script>
export default {
render(h) {
const platform = uni.getSystemInfoSync().platform
const tag = platform === 'h5' ? 'div' : 'view'
return h(tag, this.$slots.default)
}
}
</script>


用的时候就简单了:

<template>
<CrossPlatform>内容</CrossPlatform>
</template>

<script>
import CrossPlatform from '@/components/CrossPlatform.vue'
export default {
components: { CrossPlatform }
}
</script>


至于 process.env 不生效的问题,UniApp 的环境变量是 uni.getSystemInfoSync().platform,不是 process.env,这俩不是一个东西。你可以在项目根目录建个 utils/platform.js 统一导出:

export const isH5 = process.env.UNI_PLATFORM === 'h5'
export const isMP = process.env.UNI_PLATFORM === 'mp-weixin'


然后在哪用哪导入,比 computed 里写重复逻辑强。

总的来说,能用条件编译解决的问题就用条件编译,侵入性最小。复杂点的逻辑抽组件,别在每个组件里重复判断平台。
点赞
2026-03-17 13:05