
作者:微信公开课+
作品:微信公开课
地区:全国小程序
标签:教育,工具,微信公开课,资讯
描述:微信公开课是微信官方与小程序行业合作伙伴沟通交流的微信小程序社区,为线下微信小程序公开课的免费授课提供线上的相关服务,包括查阅小程序活动议程、参与小程序活动互动以及回顾小程序课程内容等。
声明:作者对小程序服务信息内容及运营行为等真实性/合法性及有效性承担全部责任
订阅微信公开课小程序
-
路由跳转中的计时器BUG
2019-03-24 23:18:09微信公开课小程序热议问题「路由跳转中的计时器BUG」
摘要:如何解决路由跳转中的计时器BUG
展开:小程序在跳转页面后需要手动清除计时器,不然在调到相同路由页面时,历史的计时器还在运行
更多有关路由跳转中的计时器BUG的小程序开发问题勤请扫码关注微信公开课小程序参与讨论! -
跳转的时候经常出现问题
2019-03-24 23:18:09微信公开课小程序热议问题「跳转的时候经常出现问题」
摘要:如何解决跳转的时候经常出现问题
展开:我在进入首页面onshow方法中会进行一个逻辑判断,根据不同的情况跳转不同的二级页面。在测试中发现,从二级页面连续按返回键返回微信之后这个时候小程序页面已经关闭,返回到微信上了,第二次进首页面,控制台发现会报错,逻辑判断完跳转也不会正常执行了iphone手机上特别明显。以下是报错信息:navigateBackwithanunexistwebviewId
更多有关跳转的时候经常出现问题的小程序开发问题勤请扫码关注微信公开课小程序参与讨论! -
转dongtao:微信小程序里碰到的坑和小知识
2019-03-24 23:18:09微信公开课小程序热议问题「转dongtao:微信小程序里碰到的坑和小知识」
摘要:如何解决转dongtao:微信小程序里碰到的坑和小知识
展开:已解决在app.wxss里设置了图片路径,在IDE里正常无误,但是在手机上是没有显示的,解决办法:(这段话位置放那么偏~)问题描述代码截图app.wxss.png模拟器里的效果.png手机里的效果.png未解决用小程序自带的底部导航组件的话,没法实现跟微信原生底部小红点或者消息提醒的功能已解决picker使用时候picker组件里必须要有内容,放一个值为空的变量并没有作用这里我如果只保留{{age}}的话,这个组件是无法触发的.组件里面必须至少要有1个字符(哪怕是1),这个组件才可以被触发,但是空格是不行放一个宽高为100%,display:block的view,如果view里没内容,view是不会显示的,必须要在view里放东西,哪怕一个数字也行.然后这里只能写成了这种(原本需求是这个日期选择器默认状态是空,)已解决没仔细考证,网上说图是没法批量上传的,所以这里只能用单个上传,成功后递归调用来解决批量上传.以下代码有一个错误,第十会说到文件上传的另一个问题已解决结论:手机预览的时候会进行域名合法校验的,模拟器里的关闭域名校验只是对模拟器有效问题描述:模拟器里开启开发工具不开启域名校验之后在模拟器里是可以用http的,但是当在手机上预览的时候http并不能用,模拟器开的这个只负责在模拟器里.如果不开启的话,并且在APP配置信息里,没有设置合法域名的话,在模拟器里是可以使用图片上传之类的接口,但是在手机上并不可以Paste_Image.png已解决在index点击跳转到login时候,标记三的部分没有写page()进行实例化,导致2的页面加载时候没加载相应的js,会报以下错已解决textArea没有bindinput事件之前描述:有个业务场景是检测多行输入框,如果有值,按钮立马变成可点击.然而textarea是没有input事件的,最后只能用blur进行失去焦点的时候监听解决办法:blur的在电脑上的体验如描述所说,可是真正在手机上运行的时候,体验和需求中的一致...已解决更新:以下在模拟器里是可以的但是在手机上是无效的!原因参考第一条app.wxss里的图片路径要按照组件文件夹的图片路径来写//用最上面的1来距离这个样式最开始在一个pages文件夹里,所以图片路径是../../imgs/XXX,按理说如果把这个样式提取到外面的app.wxss里的话图片路径应该改为./imgs/XXX..然而改成这样之后在模拟器都无法生效.未解决输入法掩盖textarea,这个bug有一半的概率会出现已解决:wx.uploadFile中formData参数问题:这个接口的formData微信在处理的时候已经用formData进行了包装.所以这里是没有必要自己用formData来传递参数的(比如注释掉的代码)扯淡的是,传递了form格式的参数之后在浏览器和安卓下,接口是可以正常使用的,并不会报什么错但是!在ios里会直接报错,不是运行异常,是直接红色的报错.!!!!!原作者:dongtao来自:http://www.jianshu.com/p/55621c85c5dd
更多有关转dongtao:微信小程序里碰到的坑和小知识的小程序开发问题勤请扫码关注微信公开课小程序参与讨论! -
转Java后端实现websocket与微信小程序端连接简单例子
2019-03-24 23:18:09微信公开课小程序热议问题「转Java后端实现websocket与微信小程序端连接简单例子」
摘要:如何解决转Java后端实现websocket与微信小程序端连接简单例子
展开:直接附代码前端代码:%@pagelanguage=javaimport=java.util.*pageEncoding=UTF8%%Stringpath=request.getContextPath();StringbasePath=request.getScheme()+://+request.getServerName()+:+request.getServerPort()+path+/;%!DOCTYPEHTMLhtmlheadbasehref=%=basePath%titleMyWebSocket/title/headbodyWelcomebr/inputid=texttype=text/buttononclick=send()Send/buttonbuttononclick=closeWebSocket()Close/buttondivid=message/div/bodyscripttype=text/javascriptvarwebsocket=null;//判断当前浏览器是否支持WebSocketif(WebSocketinwindow){websocket=newWebSocket(ws://localhost:8080/myWebSocket/websocket);}else{alert(Notsupportwebsocket)}//连接发生错误的回调方法websocket.onerror=function(){setMessageInnerHTML(error);};//连接成功建立的回调方法websocket.onopen=function(event){setMessageInnerHTML(open);}//接收到消息的回调方法websocket.onmessage=function(event){setMessageInnerHTML(event.data);}//连接关闭的回调方法websocket.onclose=function(){setMessageInnerHTML(close);}//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。window.onbeforeunload=function(){websocket.close();}//将消息显示在网页上functionsetMessageInnerHTML(innerHTML){document.getElementById(message).innerHTML+=innerHTML+br/;}//关闭连接functioncloseWebSocket(){websocket.close();}//发送消息functionsend(){varmessage=document.getElementById(text).value;websocket.send(message);}/script/html后端代码:importjava.io.IOException;importjava.util.concurrent.CopyOnWriteArraySet;importjavax.websocket.OnClose;importjavax.websocket.OnError;importjavax.websocket.OnMessage;importjavax.websocket.OnOpen;importjavax.websocket.Session;importjavax.websocket.server.ServerEndpoint;//该注解用来指定一个URI,客户端可以通过这个URI来连接到WebSocket。类似Servlet的注解mapping。无需在web.xml中配置。@ServerEndpoint(/websocket)publicclassMyWebSocket{//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。privatestaticintonlineCount=0;//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识privatestaticCopyOnWriteArraySetMyWebSocketwebSocketSet=newCopyOnWriteArraySetMyWebSocket();//与某个客户端的连接会话,需要通过它来给客户端发送数据privateSessionsession;/***连接建立成功调用的方法*@paramsession可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据*/@OnOpenpublicvoidonOpen(Sessionsession){this.session=session;webSocketSet.add(this);//加入set中addOnlineCount();//在线数加1System.out.println(有新连接加入当前在线人数为+getOnlineCount());}/***连接关闭调用的方法*/@OnClosepublicvoidonClose(){webSocketSet.remove(this);//从set中删除subOnlineCount();//在线数减1System.out.println(有一连接关闭当前在线人数为+getOnlineCount());}/***收到客户端消息后调用的方法*@parammessage客户端发送过来的消息*@paramsession可选的参数*/@OnMessagepublicvoidonMessage(Stringmessage,Sessionsession){System.out.println(来自客户端的消息:+message);//群发消息for(MyWebSocketitem:webSocketSet){try{item.sendMessage(message);}catch(IOExceptione){e.printStackTrace();continue;}}}/***发生错误时调用*@paramsession*@paramerror*/@OnErrorpublicvoidonError(Sessionsession,Throwableerror){System.out.println(发生错误);error.printStackTrace();}/***这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。*@parammessage*@throwsIOException*/publicvoidsendMessage(Stringmessage)throwsIOException{this.session.getBasicRemote().sendText(message);//this.session.getAsyncRemote().sendText(message);}publicstaticsynchronizedintgetOnlineCount(){returnonlineCount;}publicstaticsynchronizedvoidaddOnlineCount(){MyWebSocket.onlineCount++;}publicstaticsynchronizedvoidsubOnlineCount(){MyWebSocket.onlineCount;}}以上是网上的前端及后端的代码原文地址:http://www.cnblogs.com/xdpgacl/p/5193279.htmlutm_source=tuicoolutm_medium=referral,jdk版本要求是在jdk1.7.0以上,tomcat版本也需要在tomcat7.0版本以上。另外有个需要注意的点就是websocket的api包要用tomcat自带的websocketapi.jar,一开始本人采用的是非tomcat自带的javax.websocketapi1.0.jar包,在配置了正确的环境之后总是连接不上,会报错:ErrorduringWebSockethandshake:Unexpectedresponsecode:404。正确的效果图如下:进入页面http://localhost:8080/myWebSocket/index.jsp输入内容,点击send微信小程序端发起请求:请求代码:connectWebSocket:function(){console.log(创建webSocket连接);wx.connectSocket({url:ws://localhost:8080/myWebSocket/websocket,//url:http://eservicesit.prlife.com.cn:7001,data:{x:,y:},header:{contenttype:application/json},method:GET,success:function(res){console.log(创建连接成功);//dosomething},fail:function(res){console.log(创建连接失败,原因因::+res.errMsg);},complete:function(){console.log(创建连接complete);}})}控制台输出:原作者:郑春宏来自:http://blog.csdn.net/v824394795/article/details/53507645
更多有关转Java后端实现websocket与微信小程序端连接简单例子的小程序开发问题勤请扫码关注微信公开课小程序参与讨论! -
转TITF:tabBar的使用小技巧
2019-03-24 23:18:09微信公开课小程序热议问题「转TITF:tabBar的使用小技巧」
摘要:如何解决转TITF:tabBar的使用小技巧
展开:本文来自公众号:TITF一:tabBar的使用小技巧原理:在app.json中配置tabBar属性3、关键代码123456789101112131415tabBar:{color:666666,selectedColor:06bd04,list:[{pagePath:index,text:首页,iconPath:images/index.png,selectedIconPath:images/indexHL.png},{pagePath:picDisplay,text:图片展示,iconPath:images/picDisplay.png,selectedIconPath:images/picDisplayHL.png}]}来自CODE的代码片snippet_file_0.txt4、操作方法新建一个项目,打开app.json文件,将关键代码复制到window:{},后面,注意window的大括号前加逗号,如下图配置tabBar属性值12345678910111213141516171819202122tabBar:{//设置tabBar文字默认颜色color:666666,//设置tabBar文字被选中是的颜色selectedColor:06bd04,//tab列表,数组类型,改数组内至少要有两个但不大于5个的tab对象list:[{//设置tab跳转页面链接pagePath:index,//设置tab上的文字text:首页,//设置tab上的默认图标iconPath:images/index.png,//设置tab被选中时的图标selectedIconPath:images/indexHL.png},{pagePath:picDisplay,text:图片展示,iconPath:images/picDisplay.png,selectedIconPath:images/picDisplayHL.png}]}二:数据绑定一个对象到数组中,然后取值的一个注意点分享者:guonei001通过wx.request获取到服务器数据之后将数据(一个json对象)绑定至post数组,然后页面中获取数据的时候可以直接通过数组名.属性直接取值。数组中有多个json对象的话,则需要wx:for遍历取值。单个json对象数据绑定页面取值:
更多有关转TITF:tabBar的使用小技巧的小程序开发问题勤请扫码关注微信公开课小程序参与讨论! -
转一篇文章读懂微信小程序应用号是什么
2019-03-24 23:18:09微信公开课小程序热议问题「转一篇文章读懂微信小程序应用号是什么」
摘要:如何解决转一篇文章读懂微信小程序应用号是什么
展开:距离张小龙的那场首次公开演讲已经有九个月了,而在那场演讲中备受关注的「应用号」在千呼万唤中终于以「小程序」的名字正式对外小范围公测,不少创业者表示机会来了跃跃欲试。诚然,微信每次放出的大招,不管是公众号、服务号、朋友圈广告等,对于抢先抓住机会的人都是不小的红利。而这次这个大招,或许足以影响现有移动互联网的格局。张小龙在朋友圈里这样解释道:小程序是一种不需要下载安装即可使用的应用,它实现了应用「触手可及」的梦想,用户扫一扫或搜一下即可打开应用。也体现了「用完即走」的理念,用户不用关心是否安装太多应用的问题。应用将无处不在,随时可用,但又无需安装卸载。对于希望从「小程序」中获取红利的创业者,不妨好好读完这篇文章。做不做比怎么做更重要一、「小程序」和「公众号菜单栏内嵌H5」有什么区别看上图展示的小程序截图,像不像一个NativeAPP加了一个顶部微信菜单的帽子NativeAPP和WebAPP谁是未来的主流这个命题争了很多年,而NativeAPP最大的优势也就是对于系统控件接口和框架的调用能力比WebAPP不知道高到哪里去。虽然京东同时提供了手机APP和手机H5形式的页面供用户浏览和下单,但是同时用过二者的都能体会到,H5页面在流畅度上还是差一些。在此之前,很多创业者以公众号菜单栏内嵌H5的形式,完成了基础功能的微信化植入,但通常都是比较简单的页面,操作体验比较一般。这次微信推出的小程序,最大的亮点在于微信提供了丰富的框架组件和API接口供开发者调用,具体包含:界面、视图、内容、按钮、导航、多媒体、位置、数据、网络、重力感应等。在这些组件和接口的帮助下,建立在微信上的小程序在运行能力和流畅度上面便可以保持和NativeAPP一样的体验。二、当我们谈创业的时候,我们到底在做什么过去两年在资本的推动和互联网+概念的热炒之下,出现了罕见的创业热潮,各种各样的创业项目出现,应用市场内APP的数量也井喷式增长。行业里有一个很大的误区:互联网创业=做个网站;移动互联网创业=做个APP。很显著的现象就是很多传统企业在还没搞清什么是互联网+的时候,就迫不及待地做APP了,做出来了有没有人用,当然那是另外一回事。回到创业这件事上,还是得回归商业的本质,商业是提供顾客所需要的物品和服务的一种行为。所以不管是网站,还是APP,或者很多创业者已经在尝试的微信公众号,甚至是QQ群、微信群,这都是连接用户的一种载体。传统商业依赖于线下实体门店为顾客提供服务,互联网的存在将获取新客户和提供服务的场景进行了线上化改造,从而提升了商业效率。最近有一家花店在我的同事间很受欢迎,它会给顾客每周固定时间会送来一束搭配好的花。这是一个没有实体店的花店,也没有APP,唯一的载体就是微信公众号,下单支付是在微信号内,信息填写修改是在微信号内,客服也是在微信号内,好像除此之外也没有更多其他需要的功能了。所以这样一个创业项目,微信号就足以满足其大部分的需求,虽然在某些环节上可能有些体验粗糙,但相比之下单独做个APP哪边成本更高呢。三、为什么微信小程序的诞生对创业者是好机会1.APP流量成本的急剧攀升做渠道运营的同学可能会清楚,过去两年里,APP推广的成本是呈翻倍增长的。有些垂类APP的CPA单价高达500元以上,对于创业者来说没有太多钱可以去砸在流量上,但流量往往是控制产品生死的命脉,每年有50%的新APP死在流量问题上。2.移动互联网格局基本已定,用户主要需求场景已被巨头把持移动互联网发展已有五年时间,在这几年时间里,从PC时代迁移过来的连接人与信息、连接人与人、连接人与商品、连接人与服务四个大类已经基本完成了格局重塑。用户的主要需求场景,尤其是同时具备刚需和高频两个特点的场景,基础工具、生活服务、娱乐等都已经有PC时代的老巨头继续把持,或者移动互联网新生的小巨头们占据山头。3.面向所有产品对用户时间的竞争在之前的文章里,白崎反复讲过一个观点就是现在的竞争不仅仅是同类竞品的竞争,其实是你在和所有产品竞争用户的时间。显然微信是目前的翘楚,平均每天长达4小时以上的停留时长。很多APP面临的问题便是用户即便下载安装了,但也想不起打开,或者打开了很快就被关闭。在以上三个背景的情况下,对创业者而言环境真的很糟糕,用户获取难、使用率不高是普遍的痛点。在年初的「应用号」概念发布时,便赢得很多创业者的期待,原因就在于大家希望从微信这棵大树上获取一些红利。四、移动互联网第二春:SuperAPP+LightAPP模式轻应用是一种趋势,早在2013年左右,百度和UC分别对「轻应用」的模式进行了尝试,虽然都失败了,但不可否认这条路的正确性,只是在当时这两家都不具备发展起生态的能力。百度的轻应用是以搜索为核心的生态,UC的轻应用是以浏览器为核心的生态,二者都是WebAPP的插件化思路。百度轻应用接入了如「顺丰快递」为代表案例的信息查询服务入口,UC轻应用则接入了「迅雷」「快播」为代表案例的和浏览器场景强结合的信息查询、信息下载的入口。复盘为什么百度和UC都没做起来,一个重要的前提是当时的百度和UC都不具备SuperAPP的根基,尤其是不够高频,所以带不起来这个生态。但2016年的微信来做这件事,天时地利人和似乎都占据了,既有海量的用户,强大的用户粘性,足够长的用户使用时长,是国内目前最称得上SuperAPP的应用了。白崎预估,这种SuperAPP+LightAPP的模式或许能够带起移动互联网的第二春,很多长尾的需求之前由于落地条件不成熟不能做的,现在可以重新回来尝试一下。即使是很小的一个需求点,以LightAPP的形式附着在微信上,现在也具备了一定的生存空间。五、谁适合抓住这波红利在别人家平台玩,首先得研究平台欢迎什么样的人。从微信官方对外公布的信息来看,最鼓励的是服务提供者,因为这和微信「连接人与服务」的战略诉求最为契合。白崎的建议是:低频、非刚需场景的长尾服务提供者最适合来做微信小程序。高频场景的服务依然适合以独立APP作为阵地,即便微信在发现Tab内给京东开辟了最明显的「购物」二级入口,依然是用手机京东APP的人多,即使在体验上大大增强的微信小程序推出后,结论依然会是如此。高频场景的服务天然具备独立发展成生态的潜力,可以自成一套生态体系,比如服务领域的滴滴出行。即使是在微信、支付宝、微博中都开辟了打车入口,这些也只是增量,自家APP还是主要的阵地。而对于低频、非刚需场景的长尾服务而言,由于需求通常较为简单,使用频次低,撑不起来一个独立APP,寄生在巨头身上是最好的选择。正如把支付宝中的「转账」、「付款」、「信用卡还款」、「生活缴费」等拆成一个个独立APP,用户肯定不会买账,但把所有跟钱相关的需求都汇聚在一起,哪怕是非常长尾的水电燃气物业费和ETC交费通通都涵盖,这才成就了今天的国民应用支付宝。现在,微信正在试图开放接受长尾的需求场景,把自己打造成一个无所不包的生态系统。这个系统,包含人与人的连接,包含人与信息的连接,包含人与商品的连接,更包含各类大大小小的服务连接。比如上面提到过的花店的案例,符合低频场景、长尾服务的特点,他们家就非常适合做微信小程序,而且只要在现有基础上把微信内嵌H5迁移成小程序,就能改善下单流程、客服等方面的体验优化,从而更好地维系用户。六、决定开发微信小程序之前,这三个担忧不容忽视听到「小程序」发布的消息后,相信很多人都跃跃欲试,觉得得抓住机会。其实风险与收益共存,下面这三个担忧在决定做之前,得想清楚。1.如何区分现有独立APP和微信小程序的定位对于还没有开始做APP的创业者,小程序的发布恰似一阵甘霖,来得正是时候。但对于已经开发了独立APP的创业者呢开发一个一模一样的微信小程序出来,是否会出现零和博弈造成原有独立APP的荒废白崎的建议是,维持原有独立APP的持续迭代更新,把微信小程序作为新的增量部分,在用户数据上做到两边的一致性。把选择权交还给用户,用户总是会选择更适合自己的那一边。是否弃掉独立APP,得用数据来说话。还有一种方式,可以将微信小程序作为一个lite版,进行产品功能的MVP试验。至于以哪边作为主要用户阵地,还得结合用户获取成本来看。在同时满足业务需要的情况下,如果花最少的成本,能获取更多的用户,有什么理由说不呢2.假如微信封了你的小程序,怎么办微信在过去几年里有一个很大的特点就是生态封闭,这和苹果有些相似。很多创业者借助社交红利尝到甜头,也有因违反规定被微信做封号处理,一夜之间回到解放前。以下案例想必还历历在目:诱导关注、诱导分享:封号淘宝链接:屏蔽虾米音乐分享链接:屏蔽在朋友圈里传播外链达到一定次数:屏蔽,严重封链接在微信生态里玩,永远要忌惮红线在哪儿,毕竟微信具备随时掐断脖子的能力,只是它愿不愿意动手的问题。所以做之前熟悉规则很重要,当然也有时候只是简单的立场站队问题。3.同样存在用户获取成本变高的问题现在获取用户难是因为手机里的APP太多,应用分发的入口变得集中从而用户获取成本价格昂贵,流量问题从移动互联网诞生至今都是创业者最大的困扰之一。等红利期过后,微信小程序是否也会出现这个问题呢①如何获取用户关注虽然微信小程序不需要下载安装,但是在成千上万的小程序中,用户从哪儿知道你,找到你呢。对此张小龙的朋友圈里提到了「扫一扫」和「搜一下」这两种方式。不管是关注还是扫一扫,首先得让小程序能够触及到用户,才有被用户使用的可能,正如APP首先得被下载安装才能使用。搜索,是一个基于品牌的行为。搜索精准的产品关键词,首先得让用户知道你的品牌才有可能搜索到,这对初创品牌是硬伤。搜索行业关键词或泛需求类的关键词,如何在最明显的位置出现在用户面前且引导用户点击前往,OMG,难道也要竞价这些都是可以预见到的用户获取成本问题。②如何在臃肿的微信中获得存在感,实现用户留存和用户维系不得不说微信现在已经开始臃肿了,刚看了下手机,微信占据了9.8G的内存容量前不久才刚清理过一次,过去24%小时微信耗去43%的手机电量,另外据微信官方公布数据,用户平均在微信的停留时间为4小时。这背后是好友对话聊天、群消息、订阅号、服务号、朋友圈等一系列微信自有功能所带来的信息堆积。等全面开放公测之后,随着开发者的增多,微信自有功能、第三方小程序功能混合在一个容器里,获得存在感可不是一件简单的事情。如何在微信里做好用户留存和用户维系,也是一个难点。新机会出现时,选择做不做比怎么做其实更重要。作者:白崎简书签约作者原文链接:http://www.jianshu.com/p/a256ea4a3d0e
更多有关转一篇文章读懂微信小程序应用号是什么的小程序开发问题勤请扫码关注微信公开课小程序参与讨论! -
转义
2019-03-24 23:18:09微信公开课小程序热议问题「转义」
摘要:如何解决转义
展开:小程序里hellip;rdquo;ldquo;怎么转义呀
更多有关转义的小程序开发问题勤请扫码关注微信公开课小程序参与讨论! -
转代码构建初探:如何继续使用html与css开发小程序
2019-03-24 23:18:09微信公开课小程序热议问题「转代码构建初探:如何继续使用html与css开发小程序」
摘要:如何解决转代码构建初探:如何继续使用html与css开发小程序
展开:原文来自掘金,已获授权,地址为授权地址以下为部分本文有用评论:@1棵拼搏的寂静草vscode自带修改文件的语言,files.associations,直接wxml指向html,wxss指向css就好了。@linshuaiwebstorm设置一下html关联.wxml格式文件,一样可以像html一样使用emmet正文:微信小程序似乎会给互联网带来一场非比寻常的变革。随处可见关于小程序的文章也让我们感受到它正在刮起一阵风暴,所以呢,抽空研究研究它,还是非常有必要的,加上最近小程序公测,通过注册未认证的小程序,我们可以得到一个appid,下载最新的开发工具,就可以开始尝试编写一些demo了。但是在开发小程序的时候,由于我们比较常用的编辑器对于.wxml,.wxss后缀的文件并没有多少支持,目前我所知道的,除了vscode有一个叫做vswxml的插件之外,几乎没有其他插件了,因此,没有代码补全,没有emmet支持,没有代码高亮,这极大的影响了开发效率,我也知道有很多来尝试小程序开发的同学为此而非常困扰。好在,办法总是有的。大家都知道大多数编辑器对于html与css的支持非常全面完善,特别是emmet插件,对于html和css来说,已经变得必不可少了。而微信的wxml与wxss其实与html与css差别并不大。因此,我们只需要在开发时,将代码写在html与css中,在保存时,通过构建工具,将文件的后缀名改成.wxml与.wxss即可。这样一来,我们就不用在内置工具中开发,不用到处找对于小程序支持良好的IDE,也不用等各位大佬出新的插件了,就用我们各自最喜欢最熟悉的编辑器就可以。下面我以我最熟悉的gulp为例,与大家分享一下具体如何实现。准备我们知道小程序的页面都在pages文件夹下,首先创建一个demo文件夹,这里将会放置我们的新页面,并在demo文件夹里创建一个dev文件夹,用于存放html与css文件,大概的目录结构如下//+表示文件夹表示文件+pages+demo+dev+htmldemo.htmldemo2.html+stylesdemo.scss_reset.scss_libs.scss+scriptsdemo.js因为在平时开发中,常常将scss编译为css使用,因此这里我们也用scss来进行开发编译之后,得到的结构大约如下+pages+demo+devdemo.wxmldemo.wxssdemo.jsgulpfile.js我们的目的,就是将dev中的html,js,scss,通过gulp,编译成为小程序能够支持的wxml,js与wxss,在清楚了目的之后,我们就来添加gulp任务就行了。首先在gulpfile.js中定义一个路径对象,以方便后续的使用//设置相关路径varpaths={wxml:html,wxss:styles,js:scripts,img:images};具体要使用那些gulp插件,大家在使用的时候根据提示安装即可,因为是根据之前的老文件修改,比较懒没有去区分具体使用了那些插件,见谅。HTML对于html的处理比较简单,只有2个操作,修改后缀名与在你希望的位置生成新的wxml文件gulp.task(wxml,function(){varsrc=[paths.wxml+/**/*.html];returngulp.src(src).pipe(plumber({errorHandler:handleError})).pipe(foreach(function(stream,file){returnstream.pipe(rename(file.relative.replace(/.html/gi,.wxml)));})).pipe(gulp.dest(../)).pipe(notify({onLast:true,message:transformwxmlsuccess!}));});JSjs就更简单了,由于开发工具自己内置了编译方式,我们只需要按照commonJs的方式处理自己的代码就行,不需要进行额外的处理,但是为了统一,也将开发代码放在dev文件中,编译时在你想要的位置重新生成即可gulp.task(wxjs,function(){varsrc=[paths.js+/**/*.js];returngulp.src(src).pipe(plumber({errorHandler:handleError})).pipe(gulp.dest(../)).pipe(notify({onLast:true,message:transformwxjssuccess!}))});SCSS对于scss的处理工作稍微要多一点,我们的主要目的是要继续使用scss的语法与特性,并最终编译成.wxss文件gulp.task(wxss,function(){varsrc=[paths.wxss+/**/*!(_).scss];returngulp.src(src).pipe(plumber({errorHandler:handleError})).pipe(foreach(function(stream,file){returnstream.pipe(path.extname(file.relative)==.lessless():sass().on(error,sass.logError));})).pipe(csscomb()).pipe(minifycss({aggressiveMerging:false,advanced:false,compatibility:ie7,keepBreaks:true})).pipe(cssbeautify({autosemicolon:true})).pipe(foreach(function(stream,file){returnstream.pipe(rename(file.relative.replace(/.css/gi,.wxss)));})).pipe(gulp.dest(../)).pipe(notify({onLast:true,message:browserreloadforcss}));});ok,这样就大功告成了,熟悉gulp的同学可以动手尝试一下了,熟悉其他构建工具的同学也可以根据我提供的思路实现同样的效果。想来也是不难的。当然,这只是代码构建的一些小的尝试,当面临具体项目时,还需要更多更严谨的考虑才行。完整代码usestrict;varrf=require(fs);varpath=require(path);varthrough=require(through2);vargulp=require(gulp);varconcat=require(gulpconcat);varuglify=require(gulpuglify);vardel=require(del);vargutil=require(gulputil);varless=require(gulpless);varminifycss=require(gulpminifycss);varautoprefixer=require(gulpautoprefixer);varcsscomb=require(gulpcsscomb);varcssbeautify=require(gulpcssbeautify);varrename=require(gulprename);varchanged=require(gulpchanged);varheader=require(gulpheader);varfooter=require(gulpfooter);varlivereload=require(gulplivereload);varwatch=require(gulpwatch);varimgcache=require(gulpimgcache);varnotify=require(gulpnotify);varforeach=require(gulpforeach);varsass=require(gulpsass);varsort=require(gulpsort);varreplace=require(gulpreplace);//图像处理varimagemin=require(gulpimagemin);varpngquant=require(imageminpngquant);varspritesmith=require(gulp.spritesmith);//错误捕获varplumber=require(gulpplumber);//设置相关路径varpaths={wxml:html,wxss:styles,js:scripts,img:images};gulp.task(wxml,function(){varsrc=[paths.wxml+/**/*.html];returngulp.src(src).pipe(plumber({errorHandler:handleError})).pipe(foreach(function(stream,file){returnstream.pipe(rename(file.relative.replace(/.html/gi,.wxml)));})).pipe(gulp.dest(../)).pipe(notify({onLast:true,message:transformwxmlsuccess!}));});gulp.task(wxjs,function(){varsrc=[paths.js+/**/*.js];returngulp.src(src).pipe(plumber({errorHandler:handleError})).pipe(gulp.dest(../)).pipe(notify({onLast:true,message:transformwxjssuccess!}))});gulp.task(wxss,function(){varsrc=[paths.wxss+/**/*!(_).scss];returngulp.src(src).pipe(plumber({errorHandler:handleError})).pipe(foreach(function(stream,file){returnstream.pipe(path.extname(file.relative)==.lessless():sass().on(error,sass.logError));})).pipe(csscomb()).pipe(minifycss({aggressiveMerging:false,advanced:false,compatibility:ie7,keepBreaks:true})).pipe(cssbeautify({autosemicolon:true})).pipe(foreach(function(stream,file){returnstream.pipe(rename(file.relative.replace(/.css/gi,.wxss)));})).pipe(gulp.dest(../)).pipe(notify({onLast:true,message:browserreloadforcss}));});gulp.task(watch,function(){//监听文件改变触发相应任务gulp.watch([paths.wxml+/**/*.html],[wxml]);gulp.watch([paths.js+/**/*.js],[wxjs]);gulp.watch([paths.wxss+/**/*.scss],[wxss]);});gulp.task(default,[watch]);functionhandleError(err){gutil.beep();gutil.log(err.toString());notify.onError(Error:%=error.message%)(err);this.emit(end);}代码会有冗余的部分没有仔细删除,忽略即可。使用时需要根据提示安装必要的插件关于微信小程序,如果基础不错的同学,可以去积极尝试一下的,感觉官方文档写的很清晰,模块化经验比较丰富的应该会很容易上手。对于基础比较薄弱的同学保持关注也是非常必要的,抓紧时间掌握基础才是关键啊。原作者:遇见波同学来自:http://gold.xitu.io/post/581f0028a0bb9f0058b4c029
更多有关转代码构建初探:如何继续使用html与css开发小程序的小程序开发问题勤请扫码关注微信公开课小程序参与讨论!