主要功能特性

开发模式转换

WePY框架在开发过程中参考了Vue等现有框架的一些语法风格和功能特性,对原生小程序的开发模式进行了再次封装,更贴近于MVVM架构模式。以下是使用WePY前后的代码对比。

原生代码:

  1. //index.js
  2. //获取应用实例
  3. var app = getApp()
  4. //通过Page构造函数创建页面逻辑
  5. Page({
  6. //可用于页面模板绑定的数据
  7. data: {
  8. motto: 'Hello World',
  9. userInfo: {}
  10. },
  11. //事件处理函数
  12. bindViewTap: function() {
  13. console.log('button clicked')
  14. },
  15. //页面的生命周期函数
  16. onLoad: function () {
  17. console.log('onLoad')
  18. }
  19. })

基于WePY的代码:

  1. //index.wpy中的<script>部分
  2. import wepy from 'wepy';
  3. //通过继承自wepy.page的类创建页面逻辑
  4. export default class Index extends wepy.page {
  5. //可用于页面模板绑定的数据
  6. data = {
  7. motto: 'Hello World',
  8. userInfo: {}
  9. };
  10. //事件处理函数(集中保存在methods对象中)
  11. methods = {
  12. bindViewTap () {
  13. console.log('button clicked');
  14. }
  15. };
  16. //页面的生命周期函数
  17. onLoad() {
  18. console.log('onLoad');
  19. };
  20. }

支持组件化开发

参见章节:组件

示例代码:

  1. // index.wpy
  2. <template>
  3. <view>
  4. <panel>
  5. <h1 slot="title"></h1>
  6. </panel>
  7. <counter1 :num="myNum"></counter1>
  8. <counter2 :num.sync="syncNum"></counter2>
  9. <list :item="items"></list>
  10. </view>
  11. </template>
  12. <script>
  13. import wepy from 'wepy';
  14. //引入List、Panel和Counter组件
  15. import List from '../components/list';
  16. import Panel from '../components/panel';
  17. import Counter from '../components/counter';
  18. export default class Index extends wepy.page {
  19. //页面配置
  20. config = {
  21. "navigationBarTitleText": "test"
  22. };
  23. //声明页面中将要使用到的组件
  24. components = {
  25. panel: Panel,
  26. counter1: Counter,
  27. counter2: Counter,
  28. list: List
  29. };
  30. //可用于页面模板中绑定的数据
  31. data = {
  32. myNum: 50,
  33. syncNum: 100,
  34. items: [1, 2, 3, 4]
  35. }
  36. }
  37. </script>

支持加载外部NPM包

在编译过程当中,会递归遍历代码中的require然后将对应依赖文件从node_modules当中拷贝出来,并且修改require为相对路径,从而实现对外部NPM包的支持。如下图:


主要功能特性 - 图1

单文件模式,目录结构更清晰,开发更方便

原生小程序要求app实例必须有3个文件:app.jsapp.jsonapp.wxss,而page页面则一般有4个文件:page.jspage.jsonpage.wxmlpage.wxss,并且还要求app实例的3个文件以及page页面的4个文件除后缀名外必须同名,具体可参看官方目录结构

而在WePY中则使用了单文件模式,将原生小程序app实例的3个文件统一为app.wpy,page页面的4个文件统一为page.wpy。使用WePY开发前后的开发目录结构对比如下:

原生小程序的目录结构:

  1. project
  2. ├── pages
  3. | ├── index
  4. | | ├── index.js index 页面逻辑
  5. | | ├── index.json index 页面配置
  6. | | ├── index.wxml index 页面结构
  7. | | └── index.wxss index 页面样式
  8. | └── log
  9. | ├── log.js log 页面逻辑
  10. | ├── log.json log 页面配置
  11. | ├── log.wxml log 页面结构
  12. | └── log.wxss log 页面样式
  13. ├── app.js 小程序逻辑
  14. ├── app.json 小程序公共配置
  15. └── app.wxss 小程序公共样式

使用WePY框架后的开发目录结构(主要为src目录的结构,dist目录除外):

  1. 注:dist目录为WePY通过build指令生成的目录,除额外增加的npm目录外,其目录结构与原生小程序的目录结构类似。
  1. project
  2. └── src
  3. ├── pages
  4. | ├── index.wpy index 页面逻辑、配置、结构、样式
  5. | └── log.wpy log 页面逻辑、配置、结构、样式
  6. └──app.wpy 小程序逻辑、公共配置、公共样式

默认使用babel编译,支持ES6/7的一些新特性

用户可以通过修改wepy.config.js(老版本使用.wepyrc)配置文件,配置自己熟悉的babel环境进行开发。默认开启使用了一些新的特性如promiseasync/await(自WePY 1.4.1开始必须手动开启,原因参见前文代码规范一节中的介绍)等等。

示例代码:

  1. import wepy from 'wepy';
  2. export default class Index extends wepy.page {
  3. getData() {
  4. return new Promise((resolve, reject) => {
  5. setTimeout(() => {
  6. resolve({data: 123});
  7. }, 3000);
  8. });
  9. };
  10. async onLoad() {
  11. let data = await this.getData();
  12. console.log(data.data);
  13. };
  14. }

针对原生API进行优化

对小程序原生API进行promise处理,同时修复了一些原生API的缺陷,比如:wx.request的并发问题等。

原生代码:

  1. onLoad = function () {
  2. var self = this;
  3. wx.login({
  4. success: function (data) {
  5. wx.getUserInfo({
  6. success: function (userinfo) {
  7. self.setData({userInfo: userinfo});
  8. }
  9. });
  10. }
  11. });
  12. }

基于WePY的代码:

  1. import wepy from 'wepy';
  2. async onLoad() {
  3. await wepy.login();
  4. this.userInfo = await wepy.getUserInfo();
  5. }

在同时并发10个request请求测试时:

不使用WePY:


2 small
2 small

使用WePY后:


主要功能特性 - 图4