uniapp开发小程序 记录开发的踩坑点

1,656 阅读3分钟

上一篇记录了在搭建uniapp环境时的过程和遇到的坑,这篇主要记录在开发时遇到的问题。因为我使用uniapp开发的小程序,所以下面环境都是小程序环境的。踩坑主要问题有

  1. uniapp 上获取不到window对象
  2. uniapp上没有操作dom的API
  3. uniapp对部分vue特性不支持
  4. 获取小程序的环境与平台信息
  5. onShareAppMessage 生命周期返回的参数信息问题
  6. 小程序真机调试时不支持canvas2d 和webgl
  7. uniapp 分包
  8. 获取dom曝光时机,封装exposure组件

踩坑记录

1. uniapp 上获取不到window对象

这一点其实文档上已经有明确说明了,只是开发的时候没有仔细阅读文档,结果写了半天发现了这个问题。而且引入第三方组件的时候也因为里面存在window对象所以不能使用。

这个uniapp文档里面也说的很清楚非h5端js不运行在webview里,当然没有window。具体文档参考:跨端注意

2. uniapp上没有操作dom的API

uniapp上面不能操作dom,但是有查询dom的api。uni.createSelectorQuery()

3. uniapp对部分vue特性不支持
  1. 对vue动态组件写法不支持
// 这种写法是不支持的
<component :is= "xxx" />
  1. 不支持自定义指令
  2. 不支持v-bind使用
4. 获取小程序的环境与平台信息

这个需求感觉还是挺常见的,比如不同环境使用不同的接口,不同的ui。所以总结了一下我使用到的获取环境和获取平台信息的方法。

  • 获取环境

    • process.env.NODE_ENV 获取,这种方法需要自定义环境变量,默认获取到production和development

    • 使用uni.getAccountInfoSync()获取环境信息,其中miniProgram中envVersion返回小程序环境信息 , 分别是release : 正式版 , trial: 体验版 develop : 开发版。这种方法比较推荐

5. onShareAppMessage 生命周期返回的参数信息问题

我们开发的时候有这样一个需求,就是从·1数据中返回分享信息,而分享的button按钮是写到组件中的,没有办法在页面中确定分享数据,所以这边经过一顿试探发现在button按钮上绑定数据值就好了,这样onShareAppMessage返回的参数中就可以获取到对应值,具体写法如下

// 组件中
<button open-type="share" data-xxx="xxx"></button>

// 页面中onShareAppMessage
onShareAppMessage(data){
    // data.xxx 就是上面绑定的值
}
6. 小程序真机调试时不支持canvas2d 和webgl
7. uniapp 分包

因为代码体积的原因我们小程序需要做分包处理,具体的步骤参考subpackages

8. 获取dom曝光时机

因为我们有对应dom的曝光埋点需求,所以需要一个exposure组件,但之前封装的都是基于Window对象的,上面也写过uniapp上面没有Window对象,并且不支持自定义指令,所以我这边封装了一个exposure组件,需要曝光的dom上一层嵌套一个exposure组件,这样可以满足需求。下面是exposure组件的核心代码与使用方法

// 核心代码 
// class 或者id需要唯一
<template>
    <view :class="id>
        <slot />
    </view>
</template>
// js
mounted() {
   this.observe();
}

observe() {
  const that = this;
  setTimeout(() => {
    const ob = uni.createIntersectionObserver(that).relativeToViewport({
      bottom: -100,
    });
    ob.observe(`.${that.id}`, (res) => {
      ob.disconnect();
      this.callback(res);
    });
   }, 500);
}

callback(res: any) {
 this.$emit(`expCb`, res);
}

以上就是在开发中我的踩坑记录,希望可以帮助大家少踩一些坑。