WePY 在小程序性能调优上做出的探究

前端开发学习路线图 一、HTML5+CSS3模块 HTML标签 浏览器内核差异性 H5新增标签 语义化 标签与属性 CSS基本语法规范 CSS常用选择器与技巧 CSS复合选择器 数值与单位 CSS Hack 盒子模型 媒体查询与响应式 过渡与动画 弹性盒子模型 浮动 定位 CSS高级技巧(雪碧图、滑动门和三角形绘制等) Chrome调试工具 CSS企业级应用技巧 网页常见问题解决方案 PhotoShop应用 项目实战开发流程 复杂页面的设计与排版 CSS模块化开发 CSS字体图 阅读详情

原文链接:

https://cloud.tencent.com/developer/article/1005017

导语

性能调优是一个亘古不变的话题,无论是在传统H5上还是小程序中。因为实现机制不同,可能导致传统H5中的某些优化方式在小程序上并不适用。因此必须另开辟蹊径找出适合小程序的调估方式。

预先加载

这一节的内容主要是基于 anniexliu 的文章进行的研究:《小程序性能优化——提高页面加载速度》

原理

传统H5中也可以通过预加载来提升用户体验,但在小程序中做到这一点实际上是可以更简单方便却又更容易被忽视的。

传统H5在启动时,page1.html 只会加载 page1.html 的页面与逻辑代码,当page1.html 跳转至 page2.html 时,page1 所有的 Javascript 数据将会从内存中消失。page1 与 page2 之间的数据通信只能通过 URL 参数传递或者浏览器的 cookie,localStorge 存储处理。

小程序在启动时,会直接加载所有页面逻辑代码进内存,即便 page2 可能都不会被使用。在 page1 跳转至 page2 时,page1 的逻辑代码 Javascript 数据也不会从内存中消失。page2 甚至可以直接访问 page1 中的数据。

最简单的验证方式就是在 page1 中加入一个setInterval(function () {console.log('exist')}, 1000)。传统H5中跳转后定时器会自动消失,小程序中跳转后定时器仍然工作。

小程序的这种机制差异正好可以更好的实现预加载。通常情况下,我们习惯将数据拉取写在 onLoad 事件中。但是小程序的 page1 跳转到 page2,到 page2 的 onLoad 是存在一个 300ms ~ 400ms 的延时的。如下图:

因为小程序的特性,完全可以在 page1 中预先拿取数据,然后在 page2 中直接使用数据,这样就可以避开 redirecting 的 300ms ~ 400ms了。如下图:

试验

在官方demo中加入两个页面:page1,page2

// page1.js 点击事件中记录开始时间
bindTap: function () {
  wx.startTime = +new Date();
  wx.navigateTo({
    url: '../page2/page2'
  });
}


// page2.js 中假设从服务器拉取数据需要500ms
fetchData: function (cb) {
  setTimeout(function () {
    cb({a:1});
  }, 500);
},
onLoad: function () {
  wx.endTime = +new Date();
  this.fetchData(function () {
    wx.endFetch = +new Date();
    console.log('page1 redirect start -> page2 onload invoke -> fetch data complete: ' + (wx.endTime - wx.startTime) + 'ms - ' + (wx.endFetch - wx.endTime) + 'ms');
  });
}

重试10次,得到的结果如下:

优化

对于上述问题,WePY 中封装了两种概念去解决:

  • 预加载数据

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

  • 预查询数据

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

扩展了生命周期,添加了onPrefetch事件,会在 redirect 之时被主动调用。同时给onLoad事件添加了一个参数,用于接收预加载或者是预查询的数据:

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

预加载数据示例:

// page1.wpy 预先加载 page2 需要的数据。

methods: {
  tap () {
    this.$redirect('./page2');
  }
},
onLoad () {
  setTimeout(() => {
    this.$preload('list', api.getBigList())
  }, 3000)
}

// page2.wpy 直接从参数中拿到 page1 中预先加载的数据
onLoad (params, data) {
  data.preload.list.then((list) => render(list));
}

预查询数据示例:

// page1.wpy 使用封装的 redirect 方法跳转时,会调用 page2 的 onPrefetch 方法
methods: {
  tap () {
    this.$redirect('./page2');
  }
}

// page2.wpy 直接从参数中拿到 onPrefetch 中返回的数据
onPrefetch () {
  return api.getBigList();
}
onLoad (params, data) {
  data.prefetch.then((list) => render(list));
}
c

数据绑定

原理

在针对数据绑定做优化时,需要先了解小程序的运行机制。因为视图层与逻辑层的完全分离,所以二者之间的通信全都依赖于 WeixinJSBridge 实现。如:

  • 开发者工具中是基于window.postMessage
  • IOS中基于 window.webkit.messageHandlers.invokeHandler.postMessage
  • Android中基于WeixinJSCore.invokeHandler

因此数据绑定方法this.setData也如此,频繁的数据绑定就增加了通信的成本。再来看看this.setData究竟做了哪些事情。基于开发者工具的代码,单步调试大致还原出完整的流程,以下是还原后的代码:

/*
setData 主流程精简还原,并非完整主流程,内有注释
*/
function setData (obj) {
    if (typeof(obj) !== 'Object') {
        console.log('类型错误'); // 并没有预期中的return;
    }
    let type = 'appDataChange';

    // u.default.emit(e, this.__wxWebviewId__) 代码还原
    let e = [type, {
                data: {data: list}, 
                options: {timestamp: +new Date()}
            },
            [0] // this.__wxWebviewId__
    }];

    // WeixinJSBridge.publish.apply(WeixinJSBridge, e); 代码还原
    var datalength = JSON.stringify(e.data).length;  // 第一次 JSON.stringify
    if (datalength > AppserviceMaxDataSize) { // AppserviceMaxDataSize === 1048576
        console.error('已经超过最大长度');
        return;
    }

    if (type === 'appDataChange' || type === 'pageInitData' || type === '__updateAppData') {

        // sendMsgToNW({appData: __wxAppData, sdkName: "send_app_data"}) 代码还原
        __wxAppData = {
            'pages/page1/page1': alldata
        }
        e = { appData: __wxAppData, sdkName: "send_app_data" }

        var postdata = JSON.parse(JSON.stringify(e)); // 第二次 JSON.stringify 第一次 JSON.parse
        window.postMessage({
            postdata
        }, "*");
    }


    // sendMsgToNW({appData: __wxAppData, sdkName: "send_app_data"}) 代码还原
    e = {
        eventName: type,
        data: e[1],
        webviewIds: [0],
        sdkName: 'publish'
    };

    var postdata = JSON.parse(JSON.stringify(e));  // 第三次 JSON.stringify 第二次 JSON.parse
    window.postMessage({
        postdata
    }, "*");
}

setData 运行的流程如下:

从上面代码以及流程图中可以看出,在一次setData({a: 1})作时,会进行三次 JSON.stringify,二次JSON.parse以及两次window.postMessage操作。并且在第一次window.postMessage时,并不是单单只处理传递的{a:1},而是处理当前页面的所有 data 数据。因此可想而知每次setData操作的开销是非常大的,只能通过减少数据量,以及减少setData操作来规避。

与 setData 相近的是 React 的 setState 方法,同样是使用 setState 去更新视图的,可以通过源码 React:L199 看到 setState 的关键代码如下:

function enqueueUpdate(component) {
  ensureInjected();
  if (!batchingStrategy.isBatchingUpdates) {
    batchingStrategy.batchedUpdates(enqueueUpdate, component);
    return;
  }
  dirtyComponents.push(component);
}

setState的工作流程如下:

可以看出,setState 加入了一个缓冲列队,在同一执行流程中进行多次 setState 之后也不会重复渲染视图,这就是一种很好的优化方式。

实验

为了证实setData的性能问题,可以写简单的测试例子去测试:

动态绑定1000条数据的列表进行性能测试,这里测试了三种情况:

  • 最优绑定: 在内存中添加完毕后最后执行setData操作。
  • 最差绑定: 在添加一条记录执行一次setData操作。
  • 最智能绑定:不管中间进行了什么操作,在运行结束时执行一次脏检查,对需要设置的数据进行setData操作。

参考代码如下:

// page1.wxml
<view bindtap="worse">
  <text class="user-motto">worse数据绑定测试</text>
</view>
<view bindtap="best">
  <text class="user-motto">best数据绑定测试</text>
</view>
<view bindtap="digest">
  <text class="user-motto">digest数据绑定测试</text>
</view>

<view class="list">
  <view wx:for="{{list}}" wx:for-index="index"wx:for-item="item">
      <text>{{item.id}}</text>---<text>{{item.name}}</text>
  </view>
</view>


// page1.js
worse: function () {
   var start = +new Date();
   for (var i = 0; i < 1000; i++) {
     this.data.list.push({id: i, name: Math.random()});
     this.setData({list: this.data.list});
   }
   var end = +new Date();
   console.log(end - start);
},
best: function () {
  var start = +new Date();
  for (var i = 0; i < 1000; i++) {
    this.data.list.push({id: i, name: Math.random()});
  }
  this.setData({list: this.data.list});
  var end = +new Date();
  console.log(end - start);
},
digest: function () {
  var start = +new Date();
  for (var i = 0; i < 1000; i++) {
    this.data.list.push({id: i, name: Math.random()});
  }
  var data = this.data;
  var $data = this.$data;
  var readyToSet = {};
  for (k in data)  {
    if (!util.$isEqual(data[k], $data[k])) {
      readyToSet[k] = data[k];
      $data[k] = util.$copy(data[k], true);
    }
  }
  if (Object.keys(readyToSet).length) {
    this.setData(readyToSet);
  }
  var end = +new Date();
  console.log(end - start);
},
onLoad: function () {
  this.$data = util.$copy(this.data, true);
}

在经过十次刷新运行测试后得出以下结果:

实现同样的逻辑,性能数据却相差40倍左右。由此可以看出,在开发过程中,一定要避免同一流程内多次 setData 操作。

优化

在开发时,避免在同一流程内多次使用setData当然是最佳实践。采取人工维护肯定是能够实现的,就好比能用原生 js 能写出比众多框架更高效的性能一样。但当页面逻辑负责起来之后,花很大的精力去维护都不一定能保证每个流程只存在一次setData,而且可维护性也不高。因此,WePY选择使用脏检查去做数据绑定优化。用户不用再担心在我的流程里,数据被修改了多少次,只会在流程最后做一次脏检查,并且按需执行setData。

脏检测机制借鉴自AngularJS,多数人一听到脏检查都会觉得是低效率的一种作法,认为使用 Vue.js 中的 getter,setter更高效。其实不然,两种机制都是对同一件事的不同实现方式。各有优劣,取决于使用的人在使用过程中是否正好放大了机制中的劣势面。

WePY 中的 setData 就好比是一个 setter,在每次调用时都会去渲染视图。因此如果再封装一层 getter、setter 就完全没有意义,没有任何优化可言。这也就是为什么一个类 Vue.js 的小程序框架却选择了与之相反的另外一种数据绑定方式。

再回来看脏检查的问题在哪里,从上面实验的代码可以看出,脏检查的性能问题在于每次进行脏检查时,需要遍历所以数据并且作值的深比较,性能取决于遍历以及比较数据的大小。WePY 中深比较是使用的 underscore 的 isEqual 方法。为了验证效率问题,使用不同的比较方法对一个 16.7 KB 的复杂 JSON 数据进行深比较,测试用例请看这里:deep-compare-test-case

得到的结果如下:

从结果来看,对于一个 16.7 KB 的数据深比较是完全不足以产生性能问题的。那 AngularJS 1.x 脏检查的性能问题是怎么出现的呢?

AngularJS 1.x 中没有组件的概念,页面数据就位于 controller 的 \$scope 当中。每一次脏检查都是从 \$rootScope 开始,随后遍历至所有子 \$scope。参考这里 angular.js:L1081。对于一个大型的单页应用来说,所有 \$scope 中的数据可能达到了上百甚至上千个都有可能。那时,脏检查的每次遍历就可能真的会成为了性能的瓶颈了。

反观 WePY,使用类似于 Vue.js 的组件化开发,在抛开父子组件双向绑定通信的情况下,组件的脏检查仅针对组件本身的数据进行,一个组件的数据通常不会太多,数据太多时可以细化组件划分的粒度。因此在这种情况下,脏检查并不会导致性能问题。

其实,在很多情况下,框架封装的解决方案都不是性能优化的最优解决方案,使用原生肯定能优化出更快的代码。但它们之所以存在并且有价值,那都是因为它们是在性能、开发效率、可维护性上寻找到一个平衡点,这也是为什么 WePY 选择使用脏检查作为数据绑定的优化。

其它优化

除了以上两点是基于性能上做出的优化以外,WePY 也作出了一系列开发效率上的优化。因为在我之前的文章里都有详细说明,所以在这里就简单列举一下,不做深入探讨。详情可以参看 WePY 文档。

组件化开发

支持组件循环、嵌套,支持组件 Props 传值,组件事件通信等等。

parent.wpy
<child :item.sync="myitem" />

<repeat for="{{list}}" item="item" index="index">
   <item :item="item" />
</repeat>

支持丰富的编译器

js 可以选择用 Babel 或者 TypeScript 编译。

wxml 可以选择使用 Pug(原Jade)。

wxss 可以选择使用 Less、Sass、Styus。

支持丰富的插件处理

可以通过配置插件对生成的js进行压缩混淆,压缩图片,压缩 wxml 和 json 已节省空间等等。

支持 ESLint 语法检查

添加一行配置就可以支持 ESLint 语法检查,可以避免低级语法错误以及统一项目代码的风格。

生命周期优化

添加了 onRoute 的生命周期。用于页面跳转后触发。 因为并不存在一个页面跳转事件(onShow 事件可以用作页面跳转事件,但同时也存在负作用,比如按 HOME 键后切回来,或者拉起支付后取消,拉起分享后取消都会触发 onShow 事件)。

支持 Mixin 混合

可以灵活的进行不同组件之间的相同功能的复用。参考 Vue.js 官方文档: 混合

优化事件,支持自定义事件

bindtap="tap"简写为 @tap="tap",catchtap="tap"简写为@tap.stop="tap"。

对于组件还提供组件自定义事件

<child @myevent.user="someevent" />

优化事件传参

官方版本如下:

<view data-alpha-beta="1" data-alphaBeta="2" bindtap="bindViewTap"> DataSet Test </view>
Page({
  bindViewTap:function(event){
    event.target.dataset.alphaBeta === 1 // - 会转为驼峰写法
    event.target.dataset.alphabeta === 2 // 大写会转为小写
  }
})

优化后:

<view @tap="bindViewTap("1", "2")"> DataSet Test </view>

methods: {
  bindViewTap(p1, p2, event) {
    p1 === "1";
    p2 === "2";
  }
}

结束语

小程序还存在很多值得开发者去探索优化的地方,欢迎大家与我探讨交流开发心得。若本文存在不准确的地方,欢迎批评指正。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于 2017-06-19

微信小程序官方性能优化指南 在这篇博客中,我将分享一些关于如何优化微信小程序性能的官方指南。微信小程序作为一种快速发展的移动应用开发平台,具有强大的功能和广泛的用户群体。然而,随着小程序规模的不断扩大和功能的增加,开发者们也面临着越来越多的性能挑战。为了提供更流畅、更高效的用户体验,微信小程序官方团队不断更新和优化开发工具,并提供了一系列性能优化的指南和建议。在进行启动优化之前,我们先介绍一下小程序的启动过程。了解小程序的启动流程,可以帮助开发者更有针对性地选择性能优化的手段,分析性能优化的效果。 阅读详情

相关推荐

微信小程序性能测试——小程序运行时性能测试

本文主要介绍小程序云测运行时性能数据—体验评分

WXMiniTest的博客 1万+

小程序数据绑定

小程序的数据绑定是指将页面中要使用的数据, 从js中读取过来, 即将js中的数据绑定到页面中 在.js文件中定义些数据, 比如: mo, userid, showInfo等 Page({ data: { mo: 'Hello World!!', userid : '123214', userInfo: {}, hasUserInfo: false, ...

lljxk2008的博客 1071

Pyrosim进阶指南:从隧道火灾模拟到复杂通风策略分析

本文深入探讨Pyrosim在隧道火灾模拟与通风策略分析中的高级应用。从精确几何建模到火源参数设置,再到通风系统的量化分析,详细介绍了如何利用Pyrosim优化隧道安全设计。特别强调了临界风速验证、横向通风配置及结果可视化技巧,为工程师提供实用的进阶指南。

weixin_30644369的博客 137

微信小程序webView跳转

1、跳转webView页面,并传参数 <button bindtap="goWebView">跳转webView</button> //跳转webview goWebView(){ const userId = '20210105175850-1d7a5f0d13_user'; const path = "wmh5.fenzhan99.com/html/revenueManage" wx.navigateTo({ url: '/pages

Muchen灬 6265

机器学习西瓜书期末复习(2022HENU)

期末复习之机器学习 文章目录期末复习之机器学习第一章 绪论 第一章 绪论 机器学习的定义 机器学习致力于研究如何通过计算的手段,利用经验来改善系统自身的性能。 根据训练数据是否拥有标记信息,将学习任务分为监督学习和无监督学习。 监督学习 :分类和回归 线性回归、对数几率回归、决策树、支持向量机、贝叶斯分类器、神经网络 无监督学习:聚类 聚类算法: 原型聚类:(k均值,学习向量量化,高斯混合聚类);密度聚类(DBSVAN);层次聚类(AGNES)。降维。话题分析。图分

qq_46561559的博客 2万+

Android图形系统(三)系统篇:渲染/合成的底层原理浅析

众所周知,渲染工作是由GPU负责,那么在聊GPU之前首先得知道什么是“渲染”?我们来举个例子感受一下在系统中申请一块10*101、把图层背景这玩意染成绿的2、从左上(0,0)到右下(10,10)画一条宽度为1颜色为红色的直线3、以坐标点(5,5)为中心,画一个半径为3的实心圆,颜色要蓝色好了,接下来操作系统会把这些“绘图指令”同步给GPU去执行渲染任务图片来源:自己画的GPU完成渲染工作后,我们将会得到一个大小为10*10二维数组,数组中的每个元素都保存着坐标点的颜色信息、深度信息。

1354

python 小程序搜索排名优化_WePY 在小程序性能调优上做出的探究

性能调优是一个亘古不变的话题,无论是在传统H5上还是小程序中。因为实现机制不同,可能导致传统H5中的某些优化方式在小程序上并不适用。因此必须另开辟蹊径找出适合小程序的调估方式。预先加载原理传统H5中也可以通过预加载来提升用户体验,但在小程序中做到这一点实际上是可以更简单方便却又更容易被忽视的。传统H5在启动时,page1.html 只会加载 page1.html 的页面与逻辑代码,当page1.h...

weixin_36359110的博客 255

认知建模:模拟人类决策过程的AI方法

认知建模的目的在于构建能够模拟人类认知和决策过程的模型,通过AI技术将人类的思维、判断和选择等过程以数字化的形式呈现出来。其范围涵盖了多个领域,包括心理学、人工智能、经济学、管理学等。在心理学领域,认知建模可以帮助研究人员更好地理解人类的认知机制;在人工智能领域,可用于开发具有更智能决策能力的系统;在经济学和管理学中,能辅助进行市场预测、战略规划等决策制定。本文首先介绍认知建模的背景知识,让读者对该领域有初步的了解。接着阐述核心概念和它们之间的联系,通过示意图和流程图直观展示。

AI 算法实战派 1165

微信小程序中webview组件的使用与应用场景

通过以上介绍,相信读者已经对微信小程序中webview组件的使用方法和应用场景有了更深入的了解。在实际开发中,可以根据具体需求和场景来选择合适的组件和技术方案,以实现更好的用户体验和业务效果。微信小程序中的webview组件相当于HTML页面中的iframe,它允许开发者在微信小程序中打开一个H5页面。从微信小程序基础库1.6.4版本开始,开发者可以在小程序内使用。组件来链接HTML页面。

sg_knight的专栏 3696

手把手教你学simulink(8.39)--基于Simulink的步进电机(Stepper Motor)仿真实例

通过这个仿真实例,你可以学习如何使用Simulink构建和仿真步进电机(Stepper Motor)系统。你可以根据实际需求调整模型和参数,进行更复杂的仿真和分析。希望这个例子对你有所帮助,祝你学习愉快!

MHD0815的博客 1050

基于信号完整性的PCB设计原则

基于信号完整性的PCB设计建议,以单网络的信号布线作为评估对象,给出了一些最基础的设计指导,如何灵活运用,取决于设计者根据实际场景如何做取舍和判断。

一只豌豆象的博客 1758

微信小程序wepy框架资源汇总

微信小程序wepy开发资源汇总 ! wepy官方仓库 wepy官方文档 开源项目 wepy-wechat-demo:基于wepy开发的仿微信聊天界面小程序 深大的树洞:基于wepy开发的树洞类微信小程序 wepy-demo-bookmall:微信小程序

weixin_33892359的博客 303

【Unity实战100例】Unity循环UI界面切换卡片功能

功能包括:可以设置半径,高度,速度,元素数量用户可以根据自己的实际需求接入 制作思路:创建每个元素对应的虚拟点,通过旋转管理这些虚拟点,然后把旋转信息和位置信息同步给实际的元素

纯技术流日常开发商业开发记录总结等 7717

小程序开发提示没有npm路径_百度小程序三个框架的各自的特点

小程序跨平台解决方案方面有Taro、Mpvue、WePY这3个平台,他们各有特点,优势不相上下,他们也在不断不停的迭代更新,都拥有大量的开发者支持,百度也拥抱三方框架,跟他们一起合作,来同步促进小程序开发框架的普及。我们重点讲一下,这三个框架的各自的特点,我们先讲WePY。本文内容由蓝宇程序根据张自萌在智能小程序公开课上的讲演内容整理而来,蓝宇程序,您身边的百度小程序专家!WePY为小程序开发而生...

weixin_39595271的博客 95

【扣子AI开发】如何开发一个图像生成智能体?

【扣子AI开发】如何开发一个图像生成智能体,从创建到发布

tl437002770的博客 2426

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

智能小程序开发解决方案

今天主要分析了解小程序开发生态解决的方案,尤其技术分级解决的方案,和开发工具链。 小程序开发流程总览 第一,如果有自己的小程序可以通过迁移工具一键转换成智能小程序。第二,使用第三方框架,应用层的架构上面,接入我们的三方框架。开发者在开发调试之后,在开发工具上没有问题,再在手机上进行预览,测试没有问题,就可以发布到后台,就可以被百度想换的数组之类的进行调起下载,可以进行web、H5的浏览。今天重...

weixin_33859504的博客 950

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

微信小程序二维码生成终极指南:5分钟快速上手weapp-qrcode

还在为微信小程序中的二维码生成功能烦恼吗?🤔 如果你正在寻找一个简单、高效、兼容性强的二维码生成解决方案,那么weapp-qrcode绝对是你的不二选择!这个专为微信小程序设计的二维码生成库,能够让你在几分钟内轻松实现二维码功能,无论是原生小程序、WePY、mpvue还是Taro框架,都能完美适配。 weapp-qrcode是一个轻量级但功能强大的微信小程序二维码生成工具,它解决了小程序开发者

gitblog_00476的博客 181

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

wxappUnpacker 开源项目教程

wxappUnpacker 开源项目教程 项目介绍 wxappUnpacker 是一个用于解包微信小程序的开源工具。它能够帮助开发者分析和研究微信小程序的源码结构,从而更好地理解和学习小程序的开发。该项目主要使用 Node.js 编写,支持多种小程序文件的解析和反编译。 项目快速启动 环境准备 安装 Node.js(建议版本 12.x 或更高) 克隆项目仓库: git clone https:/...

gitblog_00071的博客 1039

职业规划路线

职业路线 职业职责

u013916029的博客 2106

微信小程序之快递查询

实现原理:调用接口将获取的数据展示在界面上。 实现难点:{获取input框内的值并给将其保存到全局变量} {编写点击函数btnclick} {编写接口函数传进input框内的值并且使用回调函数将数据回传给一个全局变量} 实现代码{ index.wxml<view class="container"> <view class

程序员 6886

优化小程序性能的七个关键步骤

使用缓存:合理使用小程序的缓存机制,对于一些不经常变化的数据,可以将其缓存到本地,减少对服务器的请求。通过以上优化步骤和示例,开发者可以针对不同的小程序场景和需求,有针对性地进行性能优化,提升小程序的性能和用户体验。通过减少网络请求、优化页面渲染、合理存储和管理数据、优化代码逻辑,以及进行性能监控和测试,开发者可以提升小程序的性能,并提供更好的用户体验。避免频繁的setData和页面更新:在代码中减少频繁的数据更新和页面渲染,可以通过批量更新数据的方式减少setData的调用次数,提升性能。

baidu_38876334的博客 2214

微信小程序wepy框架详解(一)

wepy——微信小程序的一种框架 简述 由于项目原因,我于两个多月前转到微信端用wepy进行开发。wepy开发风格接近于 Vue.js,支持组件 Props 传值,自定义事件、组件分布式复用Mixin、Redux、计算属性函数computed、模板内容分发slot等等,支持ES6/7部分语法以及less/sass等样式语言。 wepy官方...

weixin_33834628的博客 714
上一篇: 小程序开发入门-小程序踩坑-小程序开发记录-wepy小程序开发
下一篇: Certbot 生成 ssl 证书
beyond__devil
博客等级 码龄14年 147粉丝 314原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值