十几行代码就可以让你的微信小程序挂掉

mpvue是一个使用 Vue.js 开发小程序的前端框架。框架基于 Vue.js 核心,mpvue修改了 Vue.js 的 runtime 和 compiler 实现,使其可以运行在小程序环境中,从而为小程序开发引入了整套 Vue.js 开发体验。

由来已久

一直以来,我都在用mpvue来编写小程序应用,虽然问题很多,不过都有替代方案。

比如在mpvue中,slot(插槽)中的内容不能动态的渲染,那我们可以放弃使用slot内使用动态数据。该问题在github中有多人反应。

再比如在mpvue中,自定义指令会直接导致编译报错,那么我们可以放弃使用自定义指令。该问题在github中也有多人反应。

但是今天的问题实在太严重,我一定要吐槽一下。

bug现象

我们在开发过程中,发现在某种情况下,页面UI层的更新时机全部错乱。即 数据变更后,只有在下次的onShow生命周期里有体现(有种“慢一拍”的感觉),整体的感觉就是页面的展示和交互完全瘫痪

bug调查

我们花了整整一天的时间调查,最后发现问题是在自定义组件上动态为v-if绑定值赋值上

将代码精简到十几行就可以复现bug。

bug再现

记住,这是一个mpvue项目。我在src/pages/目录下新建一个test页面,对应的index.vue文件的代码如下,逻辑很简单,就是利用v-if控制一个组件的显示:

<template>
  <test v-if="show"></test>
</template>
<script>
import test from '@/components/posterTest'
export default {
  data () {
    return { show: false }
  },
  onShow () {
    this.show = true
    setTimeout(() => { this.show = false }, 2000)
  },
  components: { test }
}
</script>

其中引入了posterTest组件。为了调查bug,我将多余的操作处理全部去掉,只有一张图片,它的代码如下:

<template lang="html">
  <div class="poster">
    <img src="https://interactive-examples.mdn.mozilla.net/media/examples/firefox-logo.svg" alt="">
  </div>
</template>
<script>
export default { }
</script>

这个页面只要一加载,2秒后控制台就会报下面的错误。

而只要报了这个错误,其他页面也跟着挂了。就像前面提到的一样,结果是灾难性的——页面都挂掉了,双向绑定的更新总像慢了一拍。

找到报错的代码,上面还有了一条有意添加的注释(也是vue源码的)

所以我怀疑是mpvue在调度上存在问题。

解决方法

mpvue还是要用的,但是以后不能再用v-if来操作组件的显示了,乖乖用v-show吧。但是话说回来,vue这样的操作可是一点毛病没有的。

总结

作为框架,作为一个“轮子”,我觉得不应该有这样“后果严重”的bug出现。再退一步说,一个页面的bug能导致到整个应用“瘫痪”,也是很恐怖的。

还是要感谢mpvue为我们带来的种种方便。

原文发布于微信公众号 - 较真的前端(gh_7af41a2be77e)

原文发表时间:2018-11-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏游戏杂谈

H5小游戏的坑点小结

1) iOS 9.1 的safari中,在onTouchBegan方法中调用cc.audioEngine.playEffect播放音效是没有效果的,如果在onT...

21110
来自专栏HTML5学堂

jQuery1.x与2.x版本区别及1.9版本的变化

HTML5学堂:还记得2012年做开发时,使用的是jQuery1.4版本的框架,一个项目做完时,jQuery版本已经提升到了1.6。不得不说jQuery更新速度...

48840
来自专栏DeveWork

WordPress 网站开发“微信小程序”实战(四)

本站微信小程序版“DeveWork极客”在中文WP 圈子可谓是一直被模仿,从未被超越。如今快速迭代,写作本文的现在是1.6 版本。作为“WordPress 开发...

29970
来自专栏互联网杂技

react+redux+webpack教程4

接着上回新闻搜索的例子。现在我们要通过路由进入一个新的页面来查看新闻详细内容。 react和路由并没有什么直接关系,用什么路由都可以。不过使用react-rou...

384100
来自专栏知晓程序

开发 | 如何为你的微信小程序体积瘦身?

众所周知,微信小程序在发布的时候,对提交的代码有 2 MB 大小的限制。所以,如果你正在写一个功能稍微复杂一点的小程序,就必须得时刻小心注意你的代码是不是快触及...

12720
来自专栏理论坞

那些你不知道的Photoshop冷知识④——不安分的Adobe

本来已经打算将 第三期 作为这一系列的完结篇的~但我发现Adobe在这次更新变更了我常用的功能键使用方式(后文详述),于是我查看了PS的更新日志,发现这几次更新...

16930
来自专栏搞前端的李蚊子

微信小程序模板消息详解

先放代码 wxml: <form name='pushMsgFm' report-submit bindsubmit='orderSign'> <vi...

68090
来自专栏企鹅号快讯

5 款最酷的 Linux 终端模拟器

Xiki 首先我要推荐的第一个终端是 Xiki。 Xiki 是 Craig Muth 的智慧结晶,他是一个天才程序员,也是一个有趣的人(有趣在此处的意思是幽默,...

540100
来自专栏姬小光

姬小光前端小讲堂【第004期】

前面几期我都在尝试以最平缓的曲线让大家快速入门,后续根据同学们的反馈,内容的深度会逐步提升。那么这一期我们来说说文档类型与HTML页面的基本结构。

10730
来自专栏极乐技术社区

五个套路看懂微信小程序开发(上)

你或许听说过,快速入门就是要学最小必要知识。而我最近在看微信小程序的官方教程时发现,这个教程虽然简单,但对于微信小程序开发来说,80%的套路都能从这里学习到,你...

32990

扫码关注云+社区

领取腾讯云代金券