《拍拍二手》微信小程序开发经验谈

前两周想必大家都看到了京东发布拍拍二手交易平台的新闻,「拍拍二手」APP也正式上线。与此同时我们也紧锣密鼓的进行着「拍拍二手」微信小程序的开发。整个过程痛并快乐着,体会着采坑的痛苦,和跳出坑之后的喜悦。

项目介绍

「拍拍二手」主要有三大业务:回收、优品和个人闲置交易。京东“将以平台化的运营思路,整合回收、检测、再加工、销售等逆向供应链资源,做品质二手。”,而基于微信有庞大的社交关系链,利于产品的推广,直接面对用户,助力自身业务等优点。公司于是决定推出微信小程序版的「拍拍二手」。

微信小程序的的主要页面有:

  • 拍拍首页
  • 拍拍群首页
  • 一键转卖列表页
  • 商品发布页
  • 商品详情页
  • 订单详情页
  • 我的(发布、卖出、收藏)

我们打开小程序,看一段操作的视频:


《拍拍二手》微信小程序开发经验谈_第1张图片 https://www.zhihu.com/video/934747365223632896

可谓是麻雀虽小五脏俱全。


项目预研

在此项目之前,我们有过几个小程序的经验,所以项目启动时,我们便采用“前端驱动业务”的方式,推动业务童鞋提前申请小程序依赖的资质,如:小程序账号、名称备案、支付资质、腾讯地图日访问量等等。
同时,区别于以往我们做过的小程序,本次项目将拍拍二手C2C的整体流程移植到小程序平台,并实现以微信群为载体的交易体验。在需求评审过程中,我们大致遇到以下几个问题,并进行了技术预研。预研结果我们将在技术难点部分展开解说。


《拍拍二手》微信小程序开发经验谈_第2张图片


技术架构

在现有小程序的框架基础上,我们丰富了自定义组件,新增了基础类库,引入了SASS、Eslint在小程序里的应用。这里简单抛出几点:

  1. 因受限于小程序包大小的限制(开发时包大小限制为2M);我们对静态图片资源也做了优化,并将大部分图标放在了CDN,小程序直接访问网络资源。
  2. SASS的使用,既是沿用我们现有的PC、M端的重构方式(大家都已熟稔于心),也大大提升了小程序开发的效率。
  3. ESLint 的应用,采用我们设置的代码规范,为我们的代码输出做了把关。
《拍拍二手》微信小程序开发经验谈_第3张图片

此外,鉴于小程序路由跳转层级的限制(最初是5级),我们细化了每个流程的路由跳转方案。

《拍拍二手》微信小程序开发经验谈_第4张图片


技术难点

以下,我们将重点解析在项目中遇到的疑难问题和解决方案。我们从小程序包大小、兼容性问题、现有组件缺陷、这些天我们遇到的坑、我们开发的小程序组件、为业务提供备选方案等角度一一举例解析。


小程序包大小限制

为了达到代码不超过2M,为了小而全,我们在开发过程中就必须去思考如何减少代码量,同时提高用户体验。如何提高小程序的代码复用率,同时还要降低它们的耦合。

首先,我们采用前后端分离的方式,前后端约定接口文档;也放弃了传统前端出静态页再套页面、模板开发的方式,前端直接依据接口规范模拟数据后重构+开发;

第二,在开发前我们做了很多的探讨,从几十张设计稿中归纳可以通用的模块,编写了很多通用组件;在数据处理方面编写了很多公共方法,提炼到 util 类中;

第三,我们将静态资源雪碧图化、tiny后,发布到CDN上,小程序里依赖图标的元素直接引用网络资源。


小程序兼容问题

小程序在兼容性方面有一些已知问题,在文档中已明确指出,但最近新出的iPhone X,文档尚不全面,我们这次也对该机型做了测试,并整理出我们遇到的一些兼容性问题,希望可以对大家有所帮助。

首先给大家看一张图片,它存在两个问题,下面我一一介绍它们的处理方式:

《拍拍二手》微信小程序开发经验谈_第5张图片

1、border-radius 设定后在 iphoneX 中元素的边框显示不全

遇到这个问题的时候只需要把 rpx 改成 px 即可。其实不只是小程序有这类问题,在 M端开发过程中如果使用 rem 这种单位都难以避免会造成这样。

2、iphoneX 中 view 设定 padding-left 在手机中有偏差


运费 


     分类       

这段代码很简单,我们看到运费有个 span 标签包裹,分类没有,而在写 wxss 的时候 我们这样写的

com-lab span{
padding-left:30rpx;
}
.sel-box{
padding-left:30rpx
}

在 iphoneX 中就会产生如上图的偏差,修改方式也简单

com-lab{ padding-left:30rpx; } 
.sel-box{ padding-left:30rpx }

去掉了 span 标签的 padding 而改到了外层的 view 中这样偏差就没有了,可第一种写法在浏览器中也是对的,为什么在 ios 手机中有这种偏差呢,我觉得可能是编译时候小程序的语法造成的,所以在做页面重构的时候尽量减少这些差别。

3、iphoneX 适配微信底部操作区问题

大家知道 iPhoneX 手机打开刘海模式后,有安全区的概念,而我们需要把展示内容都放在安全区域内,所以需要对底部的黑色 Home Indicatorzuo 做处理,否则会遮挡住文字。首先是在JS代码中区分一下机型

wx.getSystemInfo({
success: function(res) { 
if(res.model.toLowerCase().indexOf('iphone x') != -1) { 
me.globalData.isIpx = true;
}
}
});

然后在wxss中做一下样式的处理

fix-ipx-tabbar-bottom {
bottom: 66rpx;
}
.fix-ipx-tabbar-bottom::after {
content: '';
position: fixed;
bottom: 0rpx;
height: 66rpx;
width: 100%;
background: #FFF;
}

这样的处理方式并没有什么难度,关键在于我们要知道 iphoneX 手机存在着这样的一个问题,那么未来国产手机的会不会有新的造型,我们同样可以用这样的方法去处理,简单有效的才是好的。

4、wx.showModal点击遮罩层触发确定,ios 中提示文字后面有一块白色背景

《拍拍二手》微信小程序开发经验谈_第6张图片


因为模态窗口是小程序的api,暂无修改样式入口,我们直接复用了我们编写的 ModalDialog 组件,替换了该方法。

小程序现有组件缺陷


1、文本输入在ios下的兼容问题

《拍拍二手》微信小程序开发经验谈_第7张图片 https://www.zhihu.com/video/934748503817744384

文本输入常用的标签无非就是 input、textarea,当我们使用这两个标签做一些文本编辑时在 ios 下遇到了3个问题,它们分别是:

  1. 当页面有遮罩层时,无法遮盖 textarea 的文字内容。
  2. 在 ios 系统下,修改 textarea、或者 input 里面的文本内容,如果在文本中修改,光标会跑到最后面。
  3. 在 ios 系统下 textarea 会增加一个 padding,而我们怎么怎么用过样式控制都不能去掉这个 padding。

我们拿商品描述为例,它使用的文本输入标签是 textarea,下面是一段 wxml 代码:


描述