更新:2018年1月10日15:32:22

ios8及部分机型下会有样式混乱的问题,经查找,原因是缺少浏览器前缀,需要加prefix

解决方案见链接:wepy-less-autoprefix

另外:如果直接引入了.wxss文件,需要改成.less

再另:如果使用scss,使用:wepy-plugin-autoprefixer


综述

  • 小程序开发有哪些痛点
  • 什么是以及如何使用 wepy
  • wepy使用注意事项
  • ......

一、小程序开发有哪些痛点

RT,这里给几个我认为开发过程中不爽的几个地方,抛砖引玉。

1) 频繁调用 setDatasetData过程中页面跳闪,张老师有篇写的很好 Page和data

2) 组件化支持能力太弱(几乎没有)

3) 不能使用 less、jade

4) 无法使用 NPM 包及 ES 高级语法

5) request 并发次数限制

6) 一个页面对应4个文件,看的眼花缭乱

......

P.S.如果你还不了解如何开发小程序,那么得抓紧看下小程序开发简易教程了,兄得

二、什么是以及为什么使用 wepy

如果可以,请先花3、5分钟看一下正经官方文档。因为关于wepy的一切,文档肯定比我说的清楚。

现在,我们这样写小程序,是不是很嗨皮呢,(cou zi shu:

  1. <style lang="less">
  2. @color: #4D926F;
  3. .userinfo {
  4. color: @color;
  5. }
  6. </style>
  7. <template lang="pug">
  8. view(class='container')
  9. view(class='userinfo' @tap='tap')
  10. mycom(:prop.sync='myprop' @fn.user='myevent')
  11. text {{now}}
  12. </template>
  13. <script>
  14. import wepy from 'wepy';
  15. import mycom from '../components/mycom';
  16. export default class Index extends wepy.page {
  17. components = { mycom };
  18. data = {
  19. myprop: {}
  20. };
  21. computed = {
  22. now () { return +new Date(); }
  23. };
  24. async onLoad() {
  25. await sleep(3);
  26. console.log('Hello World');
  27. }
  28. sleep(time) {
  29. return new Promise((resolve, reject) => setTimeout(() => resolve, time * 1000));
  30. }
  31. }
  32. </script>

写到这里我突然发现没什么可写的了,文档都很清楚啊!MDZZ

三、wepy 使用注意事项

由于类Vue的开发风格,使得开发效率变高了,一个页面对应一个文件,后期维护变得更简单了。然鹅,因为微信的种种限制以及wepy的黑魔法,导致我们不能随心所欲的管理应用。

3.1 数据管理问题

组件间的数据可以使用框架提供的 $emit $broast等方法,但页面之间的数据,就需要我们手动管理,非常麻烦且易于出错。

就目前来看,主要有四种方案可以选择:

  • Gloabal 对象或Storage

    1. 使用微信提供的`getApp()`方法,可以在页面间随意访问和改写这个对象。
  • EventBus

    1. 通过订阅/发布事件的方式,共享数据
  • Store(临时想到)

    1. 创建一个存储类来管理数据,本质上和`Storage`类似,但不能直接对数据进行修改而通过action触发数据变更。
  • wepy-redux

    1. 其实官方还是提供了`redux`方案,但没有在文档中暴露出来,使用`wepy new demo --redux`创建。

在拼车小程序中,使用的是第二种方法,按下不表。代码详见

关于第三种Store方案,原本我想使用mobx来管理小程序的数据,尝试后失败了。但自己创建一个类来管理数据,总觉得有些地方不妥,真心希望你能给个意见

Store.js ,代码示例仅提供思路

  1. class Store {
  2. constructor (initState = {}) {
  3. if (typeof initState !== 'object' || initState === null) {
  4. throw new TypeError('[Store] Init state must be a object.')
  5. }
  6. const _state = this._state = deepclone(initState)
  7. this.state = this._hookState(_state)
  8. }
  9. // 禁止直接修改
  10. _hookState (_state) {
  11. const state = {}
  12. Object.keys(_state).forEach(key => {
  13. if (typeof _state[key] === 'object' && _state[key] !== null) {
  14. _state[key] = this._hookState(_state[key])
  15. } else if (typeof _state[key] === 'function') {
  16. throw new TypeError('[Store] state cannot save function.')
  17. }
  18. Object.defineProperty(state, key, {
  19. enumerable: true,
  20. configurable: true,
  21. get () {
  22. return _state[key]
  23. },
  24. set (newVal) {
  25. throw new TypeError('[Store] mutate state failed. Use .mutate() to mutate state')
  26. }
  27. })
  28. })
  29. return state
  30. }
  31. mutate (fn) {
  32. const newState = this._state = deepclone(
  33. fn.apply(null, this._state)
  34. )
  35. this.state = this._hookState(newState)
  36. }
  37. }
  38. module.exports = new Store({})

3.2 数据预加载优化

10-24更新

在使用onPrefetch预查询数据时,要注意两点:

  • 必须在页面层级上使用路由跳转 => this.$navigate(url)
  • url 必须是相对路径

背景:我在 page1 写了一个倒计时,跳转到 page2 后发现倒计时仍然在进行。这说明什么呢?

这表明在小程序内即便发生跳转,页面的 Javascript 数据并不会从内存中消失,和我们平常开发 H5 页面有很大不同,是吧?

一般而言,我们请求数据是在onLoad中进行,但是小程序的 page 1 跳转到 page 2,再到 page 2onLoad 是存在一个 300ms ~ 400ms 的延时的(这点@张帅 的上篇文章也提到了),所以我们白白浪费了这个时间。

wepy在这里做了很容易被忽略的优化——

  • 预加载数据

    用于 page1 主动传递数据给 page2,比如 page2 需要加载一份耗时很长的数据。我可以在 page1 闲时先加载好,进入 page2 时直接就可以使用。

  • 预查询数据

    用于避免于 redirecting 延时,在跳转时调用 page2 预查询。

它扩展了页面生命周期,添加了onPrefetch事件,使得在 $redirect/$navigate 之时被主动调用。同时,给onLoad事件添加了一个参数,用于接收预加载或者是预查询的数据,如下:

  1. // params
  2. // data.from: 来源页面,page1
  3. // data.prefetch: 预查询数据
  4. // data.preload: 预加载数据
  5. onLoad (params, data) {}

预加载数据示例:

  1. // page1.wpy 预先加载 page2 需要的数据。
  2. methods: {
  3. tap () {
  4. this.$redirect('./page2');
  5. }
  6. },
  7. onLoad () {
  8. setTimeout(() => {
  9. this.$preload('list', api.getBigList())
  10. }, 3000)
  11. }
  12. // page2.wpy 直接从参数中拿到 page1 中预先加载的数据
  13. onLoad (params, data) {
  14. data.preload.list.then((list) => render(list));
  15. }

预查询数据示例:

  1. // page1.wpy 使用封装的 redirect 方法跳转时,会调用 page2 的 onPrefetch 方法
  2. methods: {
  3. tap () {
  4. this.$redirect('./page2');
  5. }
  6. }
  7. // page2.wpy 直接从参数中拿到 onPrefetch 中返回的数据
  8. onPrefetch () {
  9. return api.getBigList();
  10. }
  11. onLoad (params, data) {
  12. data.prefetch.then((list) => render(list));
  13. }

3.3 数据上报(并没有做)

MTA是腾讯自家的数据分析平台,在小程序发布后MTA平台很快的就支持了小程序的数据上报。因此手机充值选择MTA做为数据上报平台,具体步骤如下:

在MTA官网注册应用;

在mp平台,小程序开发设置中,将https://pingtas.qq.com 添加为可信域名;

安装 mta-analysis 模块:npm install mta-analysis --save

在 app.wpy 中添加初始化代码。

  1. import wepy from 'wepy';
  2. import mta from 'mta-analysis';
  3. export default class extends wepy.app {
  4. onLaunch() {
  5. mta.App.init({
  6. "appID":"xxxx", // 注册后得到的appID
  7. "eventID":"xxxx", // 注册后得到的eventID
  8. "statPullDownFresh":true, // 使用分析-下来刷新次数/人数,必须先开通自定义事件,并配置了合法的eventID
  9. "statShareApp":true, // 使用分析-分享次数/人数,必须先开通自定义事件,并配置了合法的eventID
  10. "statReachBottom":true // 使用分析-页面触底次数/人数,必须先开通自定义事件,并配置了合法的eventID
  11. });
  12. };
  13. }

这样就完成了MTA的初始化工作,在每个页面的 onLoad 事件中加入 init 事件完成页面的上报。

  1. export default class Index extends wepy.page {
  2. onLoad () {
  3. mta.Page.init();
  4. };
  5. }

在 app.wpy 中加入报错上报。

  1. export default class extends wepy.app {
  2. onError () {
  3. mta.Event.stat("error",{});
  4. };
  5. }

以及在其它业务逻辑代码上加入一些自定义事件上报,比如下单上报,支持上报等等。

mta.Event.stat("payed",{});

3.4 Integrating TypeScript

还是算求 D:

待续......

微信小程序框架——wepy使后感的更多相关文章

  1. 带坑使用微信小程序框架WePY组件化开发项目,附带第三方插件使用坑

    纯粹用来记录wepy及相关联内容,以防再犯~ 1. 接手的wepy项目版本是 1.7.2 ,so我没有初始化的过程.... 2. 安装wepy命令工具,npm install wepy-cli -g ...

  2. 小程序框架WePY 从入门到放弃踩坑合集

    小程序框架WePY 从入门到放弃踩坑合集 一点点介绍WePY 因为小程序的语法设计略迷, 所以x1 模块化起来并不方便, 所以x2 各厂就出了不少的框架用以方便小程序的开发, 腾讯看到别人家都出了框架 ...

  3. 微信小程序框架探究和解析

    何为框架 你对微信小程序的技术框架了解多少? 对wepy 框架进行一系列的深入了解 微信小程序框架解析和探究 小程序组件化框架WePY 在性能调优上做出的探究 开发者培训班上海专场PPT分享:小程序框 ...

  4. [转] 扩展微信小程序框架功能

    通过第三方 JavaScript 库,扩展微信小程序框架功能. 扩展微信小程序框架功能(1)——Promise ES6 对 Promise 有了原生的支持,但微信开发者工具更新版本(0.11.1122 ...

  5. 复用微信小程序源码包后仍然有原小程序的版本管理怎么处理

    前言: 复用微信小程序源码包后,重新创建项目导入源码包,会发现开发者工具版本管理中仍然有原来小程序的版本,这样就不太好了.毕竟是一个新的小程序,需要有新的版本控制的.那么这个问题怎么处理呢? 解决方案 ...

  6. 微信小程序框架部署:mpvue+typescript

    开发前提: 1.在微信公众平台注册申请 AppID 2.安装开发者工具https://developers.weixin.qq.com/miniprogram/dev/devtools/downloa ...

  7. 微信小程序获取html内容后展示(C#)

    使用场景:微信小程序 具体功能:从服务器获取文章内容 展示在小程序里 使用语言: C# -------------------------------------------------------- ...

  8. 微信小程序框架

    框架 小程序开发框架的目标是通过尽可能简单.高效的方式让开发者可以在微信中开发具有原生 APP 体验的服务. 框架提供了自己的视图层描述语言 WXML 和 WXSS,以及基于 JavaScript 的 ...

  9. 微信小程序-框架详解(1)

    配置 -app.json文件对微信小程序进行全局配置,决定页面文件的路径.窗口表现.设置网络超时时间.tab等 { "pages": [ //决定页面文件的路径 "pag ...

随机推荐

  1. C# Note31: 如何使用Visual Studio做单元测试

    待更! 使用Visual Studio 2013进行单元测试--初级篇 带你玩转Visual Studio——单元测试(C++例)

  2. 剑指offer(18)二叉搜索树的后续遍历

    题目: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 思路: 以最后一个节点为根,从头往后找到第一个大于根 ...

  3. Socket和ObjectOutputStream问题

    用到Socket序列化对象网络传输时ObjectOutputStream一直刷新连接 用户代码 package com.jachs.ladflower.ladflower; import java.n ...

  4. Node & CLI

    Node & CLI cli 生成文件的原理是什么 https://nodejs.org/api/cli.html http://nodejs.cn/api/cli.html CLI & ...

  5. 在页面中有overflow-y:auto属性的div,当出现滚动条,点击返回顶部按钮,内容回这个div最顶部

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. python数据结构与算法第十四天【二分查找】

    1.二分查找的原理 对于已经排序的列表进行最快速度的查找 2. 代码实现 (1)递归实现 def binary_search(alist, item): if len(alist) == 0: ret ...

  7. 无法启动此程序,因为计算机丢失MSVCR110.dll

    解决方法下: 1.首先是打开浏览器,在浏览器的地址栏里输入 http://www.microsoft.com/zh-CN/download/details.aspx?id=30679 这个网址来进行相 ...

  8. TField OnValidate 事件

    Occurs just before the data is written to the record buffer. Write an OnValidate event handler to va ...

  9. CSS3之box-sizing属性

    box-sizing本身有三个属性:content-box(默认).border-box和padding-box. content-box:border与padding均不算入width中: bord ...

  10. Nginx 用最快方式让缓存失效

    陶辉103 一般让及时缓存失效针对nginx官方是收费的 我们可以用第三方模块 https://github.com/FRiCKLE/ngx_cache_purge proxy_cache_path ...