小程序项目之再填坑有 N+1 的风险 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
southSu
V2EX    分享创造

小程序项目之再填坑有 N+1 的风险

  •  
  •   southSu
    meibin08 2018-11-15 08:08:59 +08:00 4272 次点击
    这是一个创建于 2539 天前的主题,其中的信息可能已经有所发展或是发生改变。

    小程序项目之再填坑记

    简诉

    是的,真的,你没有看错,我就是上次那个加薪的,但是现在问题来了,最近又搞了个小程序的需求,又填了不少坑,其中的辛酸就不说了,说多了都是泪,此处省略三千字 ………^……,说重点吧,反正最后就是差点这让老板叫走人了,你说优秀不优秀~。

    前段时间网上一直说的“<你可以骂那些中年人,尤其是有车有房的……>”,虽然我没有房、也没有车,但也坚决不做那个可以随便骂的中年人(人到中年不如狗??),不存在的啦,这个仇宝宝已经记下了,先分享一下最近遇到的几个坑吧。

    早安,这里是@IT平头哥联盟,我是首席填坑官苏南,用心分享 做有温度的攻城狮。
    公众号:honeyBadger8,群:912594095

    本文由 @IT平头哥联盟-首席填坑官苏南分享

    填坑一,canvas 遮挡问题:

    • 随着小程序的 API 调整,很多东西都要用户手动授权,不能直接调用后,toast、弹窗这种提示的场景越来越多了,
    • 下图就是公司活动的 canvas 合成,现在微信 API 不让直接调用授权了,某些场景要多一个弹窗来提示用户开启设置,但当遇上canvas API 这个大佬后,一切都变了,谁都只能站在它后面,
    • 场景一 :如之前拒绝授权了,后续引导用户打开设置页,即 wx.openSetting,下图就是:

    canvas 遮挡问题

    坑一 小结 :当遇上这种情况,我的第一思路是 设置样式:visibility: hidden;opacity:0;,但是结果是让人失望的,canvas 大佬就是大佬,这两属性在手机上失效了,该显示还是显示,你阻挡不了它的光辉,真的,不信可以去测试!

    解决思路:
    • canvas 图片合成,获取到图片的地址后,隐藏 canvas,改用 image 标签显示,这种场景有局限性,如果你的需求是echart交互的,显示挂了;
    • cover-view 貌似也是有局限,<cover-view /> 内只能嵌套 <cover-view /> 和 <cover-image />,view 标签的子节点树在真机上都会被忽略,这是我测试后的浏览器给出的警告,如果自定 modal,要加 button 按钮让用户点击后授权某功能,肯定也就挂了 ;
    • 当弹窗出现的时候,隐藏 canvas,这种比较暴力,但覆盖面广,任何场景都能照顾到,却也影响体验;
    • canvas定位移动到屏幕之外绘制内容;
    • 有同学可能说直接使用原生的 wx.showModal,但官方目前,button 还不支持设置open-type属性;
    • 微信小程序官方修复,好吧,看到这里你肯定笑了~,这不是一个方法,估计还没等到老板真叫你走人了,欢迎大佬们补充!!!

    填坑二,Maximum call stack size exceeded

    • 发现这个 bug,要从最近换了个手机说起,用了 3 年的 5S 终于歇菜了(再也买不起 iphone 了~),换了个 android vivo x23, 以为从此走上人生巅峰了,现实却给了我一个响亮的耳光,又是一个记忆深刻的梗~,被组里的同事笑话好久!!
    • 话说,堆栈溢出,是怎么造成的呢? 循环引用
    • 同时我又有些疑惑了,为什么其他手机都正常,就 vivo 报了这个错,同样的代码,希望有大神看到能给于解惑!
    • 先来看个示例,简单演示一下
    let sum = 20; (function test(){ sum--; console.log(sum); test(); //首席填坑官苏南的专栏 /* if( sum > 0 ){ test(); }*/ })() 

    演示报错

    • ** # 而项目中的报错是这样的 # **:
     //fetch.js import wepy from 'wepy' import _login_ from './login'; ……省略 N 行 //login.js import {fetch} from "./fetch.js"; import Storage from "./storage.js"; ……省略 N 行 //更改后 login.js ,避免了循环引用 loginFn = ()=>{ require("./fetch.js").fetch({ //首席填坑官苏南的专栏 url:"/wabApi/login/login", }); } 

    小程序的 Maximum call stack size exceeded

    坑二 小结 :循环引用,可以理解为 a.js 内调用了 b.js ,b.js 里又引用了 a.js ,所以在项目开发中要注意一下,看了下网上的讨论,这个问题需要等官方解决,貌似 h5 里是可以这样写的。

    填坑三,canvasGetImageData、canvasToTempFilePath

    • 这两个方法,之间的调用,要做一定的延时,不明白是为什么,如果不做延时,也不会报错,也不提示,方法执行完,canvas 上还是空白的;
    • 但是让人尴尬的是,此在写总结的我,又验证了一下,不加setTimeout,调试器上可以,真机挂了!目测跟绘制的目标对象大小有关系! 首席填坑官苏南的专栏

    其他

    • 微信 API 的调整,如:「 wx.getUserInfo 」「 wx.getSetting 」「 wx.openSetting 」「 wx.getPhoneNumber 」等这些现在需要添加按钮,用户手动来点击,带来的不便大家都知道了,就不再多说;
    • 字体文件 ,加载报错,但也能正常显示,而且只有第一次报错哦;
    • 其他还有待发现的坑……
     @font-face { font-family: 'test'; src: url("https://cdn-xx.xxx.com/common/font/font.ttf") format('truetype'); font-weight: normal; font-style: normal; //首席填坑官苏南的专栏 } 

    用心分享 努力成为你想成为的样子

    扯淡段子

    小明公司之前上线的小程序项目,好久没有迭代了,产品说有个需求要改一下,很快,就一点点东西,比如一个按钮 UI 调整一下,改了赶紧发上去,嗯,最好今天就发了审核吧;

    这话,是你会怎么接呢??小明说要一天,产品就惊呆了,这家伙没有发烧吧??小明后来经过半天的努力,终于让产品知道了小程序 API 更新后,再发布的相关流程都要改的;

    有谁能理解小明的痛苦?有谁能理解小程序的 API 更新机制?更新过的 API 没有向下兼容的余地,已经发布过的就放过你了,但是你再改动,所有它改过的流程,你都要改一遍。

    结尾

    开心一笑,给自己找点乐,为今天的分享画上圆满的句号,以上就是我最近的一次小小填坑记整理,希望能给其他同学带来些许帮助,文中如有理解不足之处,请指正。

    宝剑锋从磨砺出,梅花香自苦寒来,做有温度的攻城狮!

    更多文章:

    作者:苏南 - 首席填坑官
    交流群:912594095、公众号:honeyBadger8
    链接: https://blog.csdn.net/weixin_43254766/article/details/83662686
    本文原创,著作权归作者所有。商业转载请联系@IT平头哥联盟获得授权,非商业转载请注明原链接及出处。

    19 条回复    2018-11-20 09:50:09 +08:00
    southSu
        1
    southSu  
    OP
       2018-11-15 08:10:30 +08:00
    今夜,远去了兰舟,远去了芳草;
    不想柳舞,不忆花飞。
    云断,疏影横斜;雁过,栖息无声。
    此时,只想与你,共婵娟。 我是苏南,早安!
    Wolfpancake
        2
    Wolfpancake  
       2018-11-15 08:33:53 +08:00 via iPhone
    毕竟小程序里面的 canvas 是原生组件,通过计算位置之后盖在 webview 上层的...不过没把 visibility 属性解析一下扔给原生组件微信也是有点偷懒了
    cctv1005s927
        3
    cctv1005s927  
       2018-11-15 09:06:46 +08:00
    为啥你说技术文章总要念两句诗呢,莫非是..
    leefly
        4
    leefly  
       2018-11-15 09:25:02 +08:00
    canvasToTempFilePath 是有回调的呀
    sujin190
        5
    sujin190  
       2018-11-15 09:56:10 +08:00
    @leefly #4 其实他的意思的,调用完 draw 立刻调用 canvasToTempFilePath 然后通过回调拿到的图片也是空吧
    微信自己实现的这个 canvas 真实弱爆了,bug 一堆,现在经常在不确定情况下会遇到重设画笔了,绘制的文字颜色还是之前的,找了很多方法都没办法解决,坑死了
    Exia
        6
    Exia  
       2018-11-15 10:32:17 +08:00
    那个 canvas 的问题解决办法就是在屏幕外画好再改 left,且没有的时候使用一张图片来代替显示。
    leefly
        7
    leefly  
       2018-11-15 13:46:43 +08:00
    @sujin190 draw 方法也是有回调的呀,`在 draw() 回调里调用该方法才能保证图片导出成功。`
    https://developers.weixin.qq.com/miniprogram/dev/api/canvas/wx.canvasToTempFilePath.html
    这一点开发者工具和真机有点区别。
    southSu
        8
    southSu  
    OP
       2018-11-15 19:03:49 +08:00
    @leefly
    晚上好,是有回调的呢,跟回调没有关系,在里面处理也一样。
    southSu
        9
    southSu  
    OP
       2018-11-15 19:05:08 +08:00
    @Exia
    晚上好,感谢大佬指点,现在就是这么干的,但这种使用方式,也有业务场景限制,不能完全适用。
    southSu
        10
    southSu  
    OP
       2018-11-15 19:05:41 +08:00
    @cctv1005s927
    晚上好,是的,大佬,你没有猜错,我装 B 用的哦,哈哈~
    southSu
        11
    southSu  
    OP
       2018-11-15 19:06:35 +08:00
    @Wolfpancake
    晚上好,嗯,大佬理解的很到位,网上也看到过很多人反馈,但是它就是死性不改!
    southSu
        12
    southSu  
    OP
       2018-11-15 19:08:09 +08:00
    @leefly
    嗯,是有回调。但在部分手机还是有问题,android 的,性能如果差些,还是要在 canvas 后加个延时,调用它!
    leefly
        13
    leefly  
       2018-11-16 09:01:16 +08:00
    @southSu 好吧Σ<(=⊙⊙)"
    quietjosen
        14
    quietjosen  
       2018-11-16 10:05:27 +08:00
    本来想了解下小程序开发,看完吓得一哆嗦…
    Exia
        15
    Exia  
       2018-11-16 10:08:11 +08:00
    @southSu 互相学习
    southSu
        16
    southSu  
    OP
       2018-11-17 07:22:44 +08:00
    @quietjosen
    愿你独立美好,
    无惧时光,
    做自己喜欢做的事,
    成为最好的自己!早上好,周末愉快,别慌,踩的多了,跟也就平了,加油
    quietjosen
        17
    quietjosen  
       2018-11-17 22:34:02 +08:00
    @southSu 哈哈,原来是位诗人!
    southSu
        18
    southSu  
    OP
       2018-11-19 08:29:35 +08:00
    @quietjosen 让大佬见笑了,早安
    tanszhe
        19
    tanszhe  
       2018-11-20 09:50:09 +08:00
    段子手
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1193 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 23:33 PVG 07:33 LAX 16:33 JFK 19:33
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86