微信小程序开发教程
2018-02-08 10:03 据呵呵 阅读(116) 评论(0) 编辑 收藏 举报一、微信小程序的优缺点先简单的说一下
优点:
1、即用即走——这个是从微信小程序上线就开始打的概念。即用即走使得小程序可以代替许多APP,或是做APP的整体嫁接,或是作为阉割版功能的承载体。
2、倚靠微信流量——相比APP,小程序一个突出的优点是完全嵌入了微信的聊天、公众号体系,完美进行微信体系内的流量引导。这一方面令小程序更加容易获客,另一方面也可以借助微信的成熟社交网络达到爆发式传播。
3、连接线上线下——连接线上线下场景也是微信小程序重要的一环,甚至最先开始为了推动线下习惯的养成,小程序在线上场景方面做了较强的限制。 由于人们用微信扫描二维码的习惯培养得比较好,小程序相比APP更容易达成线上线下场景的连接与互动。
缺点:
1、留存——虽然有部分小程序已经杀出重围,但是普遍来讲,主打“即用即走”的小程序在用户留存上仍存在很大的提升空间。阿拉丁发布的小程序白皮书中显示,小程序的平均次日留存在13%左右,但是双周留存骤降到仅有1%。轻易拥有的也不在意失去,这大概是小程序目前的一个症结所在。
2、受控于微信——比起APP,尤其是安卓版的高自由度,小程序要面对很多来自微信的限制,从功能接口,甚至到类别内容,都要接受微信的管控,部分敏感内容还很容易遭受封禁威胁。
二、小程序与app的比较
| 序号 | 优点 | 缺点 |
| 1 | 快速进入,快速使用,快速走 | 很多服务无法实现,比如:提醒功能 |
| 2 |
几乎没有下载功能,社交分享的转发率极高, 更让容易让客户了解到产品所提供的服务和品牌 |
做了更多减法,促销运营模式无法在其运作, 实现交互还是比app要麻烦多 |
| 3 | 跨平台,一套代码可以适配 IOS和Android节省了很多时间和人力成本 |
大量数据无法存储 |
| 4 | 开发起来更加方便 | 小程序大小限制在1MB,许多功能受大小限制不太好提供 |
| 5 | 安全性更高 | 原生App的用户体验更加丰富 |
三、开发的准备
1.成为微信公众平台开发者
微信公众平台官网 注册 (https://mp.weixin.qq.com)
2.获取AppID(小程序ID)
3. 下载并安装开发工具 IDE
登录微信小程序官网下载对应的版本:https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html
4. 微信小程序的API :https://mp.weixin.qq.com/debug/wxadoc/dev/api/
三、小程序的最后的一些总结
-
不支持HTML、没有 Dom。网页用的 JS、CSS 基本要全部重写,WXML 的语法和 HTML 差异还挺大,基本是一个个照着手册的属性去改。CSS 选择器不支持级联。
-
小程序源码打包后的大小限制为1M,超大传不上去。单次通过 wx.request传输的数据最大也是1M。
-
MINA 框架实现的 tab bar,最多5个 tab;通过 wx. navigateTo 推入后台的页面最多5层,超过会无法打开新页面。
-
小程序没有 webview 控件,自带的 view 和 text 又不支持图文混排,还不能动态 set WXML …… 所以小程序上的富文本也就只能做到固定焦点图+纯文本+表情
-
不支持 A 标签,无法打开普通网页。
- 整体上来讲,小程序本身被设计为处理简单逻辑的「工具型」应用;同时具有很强的内容封闭性。
四、小程序的开发
1.项目目录及文件构成
目录结构显示,在小程序项目的根目录下面包含3个app开头的文件(app.js、app.json、app.wxss)以及pages目录与utils目录。其中pages目录存放页面(index和log)的构成文件。每个页面都是一个目录,目录名就是唯一的页面名,其下由以页面名为前缀的2~4个文件组成。
小程序的目录文件结构如上,左侧的3个app文件必须放在小程序根目录下面,其他文件由开发者自由控制。
app.js是小程序的脚本代码,用来监听并处理小程序的生命周期、声明全局变量、调用框架提供的丰富API等。
//app.js App({ onLaunch: function () { //调用API从本地缓存中获取数据 var logs = wx.getStorageSync(\'logs\') || [] logs.unshift(Date.now()) wx.setStorageSync(\'logs\', logs) }, getUserInfo:function(cb){ var that = this if(this.globalData.userInfo){ typeof cb == "function" && cb(this.globalData.userInfo) }else{ //调用登录接口 wx.login({ success: function () { wx.getUserInfo({ success: function (res) { that.globalData.userInfo = res.userInfo typeof cb == "function" && cb(that.globalData.userInfo) } }) } }) } }, globalData:{ userInfo:null } })
app.json是对整个小程序的全局配置,配置小程序是由哪些页面组成,配置小程序的窗口背景颜色、配置导航条样式、配置默认标题等。(json文件中不可以加注释)
{ "pages":[ "pages/index/index", "pages/logs/logs", "pages/login/login", "pages/help/help", "pages/setting/setting" ], "window":{ "backgroundTextStyle":"light", "navigationBarBackgroundColor": "#BBDEF8", "navigationBarTitleText": "我的小程序", "navigationBarTextStyle":"black", "enablePullDownRefresh":true }, "tabBar": { "selectedColor": "#1296db", "borderStyle":"black", "list": [ { "pagePath": "pages/index/index", "text": "首页" }, { "pagePath": "pages/setting/setting", "text": "设置" }, { "pagePath": "pages/help/help", "text": "帮助" } ] }, "networkTimeout": { "request": 10000, "downloadFile": 10000 }, "debug": true }
app.wxss是整个小程序的公共样式表。
/**app.wxss**/ .container { height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: space-between; padding: 200rpx 0; box-sizing: border-box; }
小程序页面是由同路径下同名不同后缀的2~4个文件组成:
.js后缀的文件是脚本文件。
//index.js //获取应用实例 var app = getApp() Page({ data: { motto: \'Hello World\', userInfo: {} }, //事件处理函数 bindViewTap: function() { wx.navigateTo({ url: \'../logs/logs\' }) }, onLoad: function () { console.log(\'onLoad\') var that = this //调用应用实例的方法获取全局数据 app.getUserInfo(function(userInfo){ //更新数据 that.setData({ userInfo:userInfo }) }) } })
.json后缀的文件是配置文件。(如存在,会层叠覆盖app.json的window中相同的配置项,json文件中不可以加注释)
.wxss后缀的样式表文件。(如存在,会层叠覆盖app.wxss中的样式规则)
/**index.wxss**/ .userinfo { display: flex; flex-direction: column; align-items: center; } .userinfo-avatar { width: 128rpx; height: 128rpx; margin: 20rpx; border-radius: 50%; } .userinfo-nickname { color: #aaa; } .usermotto { margin-top: 200px; }
.wxml后缀的文件是页面结构文件。
<!--index.wxml--> <view class="container"> <view bindtap="bindViewTap" class="userinfo"> <image class="userinfo-avatar" src="{{userInfo.avatarUrl}}" background-size="cover"></image> <text class="userinfo-nickname">{{userInfo.nickName}}</text> </view> <view class="usermotto"> <text class="user-motto">{{motto}}</text> </view> </view>