玩转微信小程序
2007 年 1 月 9 号,苹果一代在功能机盛行的年代中出世。
2017 年 1 月 9 号,微信小程序在重型app风靡的压力下上线。
苹果的出世掀起了互联网一波又一波的浪潮,而微信小程序( Wa )能带给开发者和用户什么呢?我们先从头到尾做一个 Wa ,再来看看它的价值。
For Users
如果你的微信还没有找到小程序的入口,可以在微信中搜索已有小程序(如: "姨妈日历"),进入后再退出就能在发现栏中看到小程序入口。
For Developers
1. 认证
在注册 Wa 账号时,会让你填写组织主体并认证主体真实性,如果你是一个单纯的个人开发者,可以随意填写,不要花钱去认证就是了。
2. 开发者工具
下载并打开开发者工具,呈现出来的三个区域从左至右分别是: 功能区,视图区,调试区。给开发者一种 IDE 即视感,特别是调试区,不就是 F12 么= =!什么 React,Angular 之流,你们再强还不是没自带 IDE,这点微信做的确实好,从开发者的体验先下手,利用我等之手将 Wa 推向市场。
3. 文件类型
对于开发者,你只需要关注三种文件类型: .js
,.wxss
,.wxml
。特喵这不就是披着微信皮的前端代码吗?的确如此,.wxss
=> .css
,.wxml
=> .html
,这个转换会在代码构建阶段发生,这里先不提。
Preparation
这次我们以"网易云音乐客户端"为原型做一款能跑在 Wa 的播放器小程序,废话不说了,直接开搞。
1. wxml
首先会看到示例中各种 view ,text ... 如果你使用过 React Native
或者阿里最近开源的 Rax
就不会陌生,这些标签实质上就是已经封装好的组件,这个时候就可以推断 Wa 很可能使用了 RN 的源码。官方文档 - 组件 罗列了 Wa 中几大类组件,对于播放器而言,view,text,image,audio 这几个组件就够了,它们可以理解为分别对应了 html 中的 div,span,img,audio 标签。
2. wxss
css 基本没有变化,除了像素单位改成了 rpx,这里要说的是 Wa 将设备总宽规定为 750rpx。除此之外,flex
布局也是需要大量使用的。
3. js
js 也是基本没有变化,而且可以使用部分 ES6 的语法。需要注意的是在 Wa 中没有 document 对象,因此不能操作 DOM 。Wa 组件化开发风格比较明显,会有一种写 React 的感觉。
4. API
官方文档 - API 都是微信上的常用API。
5. 资源服务器
这是比较坑的一个地方,首先你得去开发设置中添加你的服务器配置
当你使用 wx.request() 时候如果没有用绑定好的 url 是不能进行资源访问的。同时必须要以 https 的方式请求,所以必须要给服务器配置 https 服务,我使用的是 Let's Encrypt ,这是个免费的证书机构,每 90 天才会过期,及时更新就行,配置方法网上有非常多。
Coding Time
最终形态
1. 模板编写
首先来搭建 wxml。如上图可以分为三个模块
顶部固定的播放列表: 显示音乐数量
中间的音乐清单: 显示音乐的名字和作者
底部固定的功能栏: 显示当前的播放的音乐和可简单操作的三个按钮
模板的编写如下:
<!--index.wxml-->
<view class="container music-list">
<audio id="myAudio" src=""></audio>
<view class="music-menu">
<view class="menu-btn">
<image class="menu-play-pause-btn" src="xxx.png"/>
</view>
<view class="menu-desc">
<text class="normal">播放列表(</text>
<text class="bold">{{musics.names.length}}</text>
<text class="normal">)</text>
</view>
</view>
<block wx:for="{{musics.names}}">
<view class="music-item" bindtap="changeToThis" data-mid="{{index}}">
<view class="left-item">
<image class="{{ index == MIndex ? 'voice-img' : 'no-img'}}" src="{{ index == MIndex ? 'xxx.png' : ''}}"></image>
<text class="music-index">{{ index + 1 }}</text>
</view>
<view class="right-item">
<text class="music-name">{{ item }}</text>
<text class="music-singer">{{ musics.singers[index]}}</text>
</view>
</view>
</block>
<view class="fixed-box">
<view class="fixed-img">
<image class="head-img" src="xxx.png" />
</view>
<view class="fixed-mesg">
<text class="mesg-name">{{names[MIndex]}}</text>
<text class="mesg-singer">{{singers[MIndex]}}</text>
</view>
<view class="fixed-btn">
<image class="prev-btn" src="xxx.png" bindtap="changeToPrev"/>
<image class="play-pause-btn" bindtap="changeLargeBtn" src="{{largeBtnSrc}}"/>
<image class="next-btn" src="xxx.png" bindtap="changeToNext"/>
</view>
</view>
</view>
里面混杂了许多类似 xtpl
的语法,我通过 js 传入的对象是 musics ,因此该模板渲染的数据皆来源于这个对象。其次要注意某些关键位置的 bindtap
,它其实就是 Wa 中对 fastclick
的实现,绑定的这个事件需要在 js 文件中实现。
2. 功能实现
模板写完后,就是导入数据和简单的功能实现了。在 Wa 的 js 文件中,有一个 Page({}),它内部的逻辑直接对应了一个模板。大致写法如下
Page({
data: {
// 这里放置不需加载资源即可确定的属性
Mindex: 0, // 初始化歌曲的ID,0
largeBtnSrc: 'xxx.png' // 初始化的播放按钮路径
},
onLoad: {
// 这里是渲染模板之前一步的逻辑
wx.request({
url: 'https://xxx',
type: 'GET',
success: function(res) {
// 类似Jquery, 成功获得数据后可对data进行修改
this.setData({
musics: res.xxx,
srcs: res.xxx,
names: res.xxx,
singers: res.xxx
});
// native中audio没有autoplay的功能,需要手动添加逻辑
this.audioCtx = wx.createAudioContext('myAudio');
this.audioCtx.setSrc('https://xxx.mp3');
this.audioCtx.play();
this.audioCtx.paused = false;
// 最后别忘了绑定this对象
}.bind(this)
});
},
// 实现模板中绑定到bindtap的事件
changeLargeBtn: function() {
if (this.audioCtx.paused) {
// 如果音乐暂停,需要处理的逻辑
} else {
// 如果音乐播放,需要处理的逻辑
}
},
changeToNext: function() {
// 播放下一首歌
// 无论如何都变回播放状态
this.setData({
largeBtnSrc: 'xxx.png'
});
this.audioCtx.play();
this.audioCtx.paused = false;
// 主逻辑
if (this.data.MIndex == (this.data.srcs.length - 1)) {
this.audioCtx.setSrc('https://xxx' + this.data.srcs[0]);
this.setData({
MIndex: 0
});
this.audioCtx.play();
} else {
this.audioCtx.setSrc('https://xxx' + this.data.srcs[this.data.MIndex + 1]);
this.setData({
MIndex: this.data.MIndex + 1
});
this.audioCtx.play();
}
},
// 同理播放上一首歌
changeToPrev: function() {},
// 通过点击清单中的音乐,指定跳转到某首音乐
changeToThis: function() {}
});
3. 强大的Flex
wxss 的代码有一百多行,就不贴了,就说下用的比较多的 flex 语法。自从 RN 出世了,flex 的使用率是越来越高,因为用它布局实在是很方便,再也不用去设置可恶的 float 等属性来做自适应。
如上图,使用三次 flex 就能完成自适应的布局。
首先,将图片,当前歌曲信息,按钮的父级元素进行 flex 布局。
fixed-box {
position: fixed;
bottom: 0;
left: 0;
z-index: 100;
width: 100%;
height: 110rpx;
display: flex;
flex-direction: row;
justify-content: space-around;
background-color: #fff;
}
通过 display: flex 启动 flex 布局,flex-direction: row 指让元素横向排列,justify-content: space-around 指让元素在主轴上伸缩性的居中。具体语法可以参考 Flex 布局教程 - 阮一峰 。
其次对歌曲信息进行 flex 布局。
width: 380rpx;
display: flex;
flex-direction: column;
flex-direction: column 指让元素纵向排列。
最后再来对按钮进行 flex 布局。
width: 240rpx;
height: 88rpx;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-around;
align-items: center 指让元素在交叉轴上居中。
项目发布
完成后选择点击项目,将编译后的包上传到云上,可以在开发管理中看到 Wa 当前的体验版本 ,所以...发布吧~
由于我们是个人开发者,所以只能发布体验版本,而且只能有20个体验者= =!体验者可以在用户体验中添加。
接下来进行一系列的扫码任务...扫描你的二维码,然后可以在 Wa 看到你的作品了。
感受
1. 开发者体验
现如今各家各户都在把 React 和 Jsbridge 往应用上搬,加上 nw 的加持,Wa 对开发体验是非常不错的。
2. 用户体验
因为小程序是"用完即走"的产品,一旦退出我的音乐就播放不了了,而且每次进入都会去加载音乐,心疼我的流量。但在使用的时候应用的带给人的还是一种接近 native 的体验。
瞎扯
总的来说 Wa 感觉有点被高估了,"用完即走"是把双刃剑,注定不适合大流量和部分高使用量的应用,加上 Wa 规定打包后不能超过 1M ,最终在市场上受利的是那些中低频的小流量的产品。
玩转微信小程序的更多相关文章
- Python玩转微信小程序
用Python玩转微信 Python玩转微信 大家每天都在用微信,有没有想过用python来控制我们的微信,不多说,直接上干货! 这个是在 itchat上做的封装 http://itchat. ...
- 微信小程序开发带来的思考
若无小程序开发经验,可先阅读 玩转微信小程序 一文. 微信小程序正式上线已有几周时间,相信它的开发模式你已烂熟于胸,可能你也有所疑问,我竟能用 web 语言开发出如此流畅的几乎原生体验的应用.可能你又 ...
- 微信小程序踩坑集合
1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=1476434678461 2:简易教程:https://mp.weixin.qq.com/debu ...
- 微信小程序学习指南
作者:初雪链接:https://www.zhihu.com/question/50907897/answer/128494332来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- 微信小程序音乐播放器
写在前面 1.入门几天小白的作品,希望为您有帮助,有好的意见或简易烦请赐教 2.微信小程序审核音乐类别已经下架,想要发布选题需慎重.附一个参考链接,感谢https://www.hishop.com.c ...
- 《微信小程序七日谈》- 第四天:页面路径最多五层?导航可以这么玩
<微信小程序七日谈>系列文章: 第一天:人生若只如初见: 第二天:你可能要抛弃原来的响应式开发思维: 第三天:玩转Page组件的生命周期: 第四天:页面路径最多五层?导航可以这么玩 微信小 ...
- 《微信小程序七日谈》- 第三天:玩转Page组件的生命周期
<微信小程序七日谈>系列文章: 第一天:人生若只如初见: 第二天:你可能要抛弃原来的响应式开发思维: 第三天:玩转Page组件的生命周期: 第四天:页面路径最多五层?导航可以这么玩 前两篇 ...
- 微信小程序怎么用?线下商家最适合玩小程序
随着微信小程序不断地释放新功能,许多行业越来越关注小程序,目前已经有不少餐饮和线下传统零售企业开始谋划利用好小程序.但是,线下商业有着复杂的场景,如何针对自己行业的特点和需求开发出属于自己的小程序,是 ...
- 用python一步一步教你玩微信小程序【跳一跳】
12月28日,微信上线了小游戏「跳一跳」,瞬间成了全民游戏,如何牢牢占据排行榜的第一位呢?用Python帮助你,Python真的无所不能. 作为技术出身的我们,是不是想用技术改变排名呢? 注意:本文适 ...
随机推荐
- javascript 中的闭包
在 javascript 中,函数可以当做参数传递,也可以当做返回值返回. 当一个函数内部返回值为一个函数时, 就形成了闭包.(闭包里面的 this 问题) 如下面代码 Function.protot ...
- flex中form表单中子元素之间的距离控制
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:mx="library://ns.ado ...
- 如何高效的用判断用js判断ie6
用js判断ie6的方法有很多,如: 1. var isIE=!!window.ActiveXObject; var isIE6=isIE&&!window.XMLHttpRequest ...
- java web系统优化, mysql查询优化
1. 采用数据库连接池技术 2. 优化sql语句格式, 比如用PreparedStatement代替Statement, 前者避免重复编译, 后者每次都需要对数据库进行解析编译, 降低数据库的访问效率 ...
- FZU 2091 播放器
简单模拟题,开个栈维护一下即可. #include<cstdio> #include<cstring> #include<cmath> #include<st ...
- TFS-Git官方教程
VS2015:官网教程 VS2013: GIT教程
- Spring学习---JPA配置和使用
理论的东西如果不实践,永远不会变成自己的东西.本文将介绍用maven管理,用Hibernate作为JPA供应商,使用MYSQL数据库,配置和使用JPA. 以下代码已经上传至GITHUB. ...
- Android studio开多个窗口引起的问题
1.clean 的时候,intermediates删不掉 2.出现:app:compile_DebugJavaWithJavac 没有具体错误 出现以上问题的时候只要把多余的删除,记得只留一个在当前窗 ...
- tp框架中的静态验证
//制定命名空间在Home 模块下Model文件夹下 如:namespace Home\Model; //引用父类 如:use Think\Model; //实例化表 如:class ZhuCeMod ...
- STM32_IAP详解(有代码,有上位机)
Iap,全名为in applacation programming,即在应用编程,与之相对应的叫做isp,in system programming,在系统编程,两者的不同是isp需要依靠烧写器在单片 ...