起因

事情是这样的

一天早上组里还早激烈的讨论某个项目的可用性和发展前景,突然老大说了句,能不能做个小程序的版本呢?然后大家纷纷讨论起来,有反对有支持,我就说了一句,刚出来的时候搞过一会。。。然后就把我推出来了(日了狗了~~)

这个项目大概一个星期之后就要推出去了,换句话说,我要一个星期内搞个小程序的版本出来,宝宝有点慌了~~

不过既然接手了还是要好好做的,首先的,完全自己搞肯定是来不及,项目的模块绝对要复用起来,思索下大概有3点需要搞

  • HTML

  • CSS

  • javascript module

CSS

其中CSS在小程序的叫做WXSS,基本和CSS语法类似了,也就需要将标签选择器改了,比如

table{//XXX
}
//改成
.table{}

还有就是WXSS的尺寸单位比较推荐使用rpx,但是这里还是继续使用px,当然在响应式方面还需要自己改改,工程量不是很大

JS

对于JS方面就比较棘手了一点,唯一庆幸的是,原项目是用vue来做框架搭建的,仔细观察下小程序框架的语法结构,发现其实和vue很类似,都具备生命周期和各种事件绑定等等,所以在整体JS结构上面大概有几点需要修改

  • 生命周期函数

  created: function () {//xx}//改成onLoad: function() {}
  • 数据绑定

this.container = '';
//改成
this.setData({"container": ''
});

剩下的就是模块的引用,小程序本身也支持ES6语法,但还是有缺陷,比如不支持promise,可以通过引入相应的polyfill 来解决,还能顺便让小程序本身的API也应用上promise

//util.js
import Promise from './bluebird.min';
export const wxPromise = function(fn) {return function (obj = {}) {return new Promise((resolve, reject) => {obj.success = function(res) {resolve(res);}obj.fail = function(err) {reject(err);}fn(obj)})}
}

可以在需要调用的地方引入,或者直接在APP.js里面封装原API,然后挂载在全局上面

import {wxPromise} from '../../utils/util';
let login = wxPromise(wx.login);
let getUserInfo = wxPromise(wx.getUserInfo);
login().then((res) => {console.log(res);return getUserInfo();}).then((res) => {console.log(res);}).catch((res) => {console.log(res);})

原项目里面的模块还调用了window对象的属性,比如localstorage、innerWidth、innerHeight等等,在开发工具里面输出console.log(window)直接甩了我一个大大undefined,呵呵,都快崩溃了,后来想想,也不是完全没有办法,小程序也有类似的API来实现这些方法和属性,我要做的就是造一个window对象给它就可以了,老样子,直接挂载全局就行

App({window: {},location: {href: 'http://localhost/index.html?clear'},onLaunch: function() {let _this = this;getSystemInfo().then((res)=>{_this.window.innerWidth = res.windowWidth;_this.window.innerHeight = res.windowHeight;})_this.window.localStorage = {};_this.window.localStorage.setItem = wx.setStorageSync;_this.window.localStorage.getItem = wx.getStorageSync;_this.window.localStorage.clear = wx.removeStorageSync;}})
//注入到页面或者模块
let {window, location} = app;

HTML

最后一个难题就是HTML了,首先HTML直接套在WXML上面是行不通的,结果是可以编译显示出来,但是完全失去了HTML各个标签的意义,比如div块级标签所具备的属性都不存在了,当然你可以通过WXSS添加属性来兼容,比如

div, p {display:blcok
}

我个人并不赞同这种做法,因为在HTML中img、canvas等等并没有要求闭合标签,但是WXML是严格要求每个标签都要有闭合,就是说你想通过添加WXSS属性来兼容的话,首先要手动加img和canvas的闭合标签(在小程序中img标签应该是image,不然还是无法显示图片),其次就是怕官方下次更新迭代突然加入div这个组件,然后又要改版,烦~~
那么唯一的出路就是将HTML转成符合小程序的WXML出来,作为一个程序员,手动改也太掉价了。。。直接上工具,google查下,发现网上也有类似的工具出来,工具的转换原理是这样的话,首先HTML先转换成json对象,然后注入到模版,由模版生成。
但是有2个问题
1、转换出来的WXML是依赖模版渲染的,首先小程序的模版是不支持递归调用的,就是说,假如你的标签有6层嵌套的话,那么你需要复制6份模版出来,然后tmp1嵌套tmp2...temp6,这样的话你只能祈祷工具带来的模版有嵌套了足够多。
2、无法实现数据绑定,比如

<div>{{text}}</div>
//转换后原样输出了{{text}}
<view>{{text}}</view>

既然模版输出这条路走不通,那就只能借助node动态的输出WXML,思路和上面差不多,也是HTML生成json dom,然后递归渲染wxml节点,最后输出一份wxml文件,工具的实现在这里,细节就不多说了,目前还没有做canvas、audio、video标签的转换,有BUG的话直接提issue,最后求star

总结

没事别BB

一次微信小程序的快速开发体验相关推荐

  1. 【云开发】10分钟零基础学会做一个快递查询微信小程序,快速掌握微信小程序开发技能(轮播图、API请求)

    大家好,我叫小秃僧 这次分享的是10分钟零基础学会做一个快递查询微信小程序,快速掌握开发微信小程序技能. 这篇文章偏基础,特别适合还没有开发过微信小程序的童鞋,一些概念和逻辑我会讲细一点,尽可能用图说 ...

  2. 微信小程序应该这样开发

    微信小程序应该这样开发 帐号相关流程 注册范围 企业 政府 媒体 其他组织(换句话讲就是不让个人开发者注册) 填写企业信息 不能使用和之前的公众号账户相同的邮箱,也就是说小程序是和微信公众号一个层级的 ...

  3. 如何快速开通流量主要求微信小程序如何快速开通流量主

    微信小程序如何快速开通流量主要求 其次还需要准备一些资料 1身份证. 2银行卡(最好是四大银行或者是比较大的银行,地方的银行可能不支持). 3提交完成后会需要时间审核的(大概7天到15天). 4不用等 ...

  4. 微信小程序公众号开发

    微信小程序&公众号开发 一.什么是微信开发 二.微信开放平台 三.微信公众平台 四.小程序与公众号的区别 1. 用途不同 2. 运营方式不同 3. 操作方法不同 4. 用户体验不同(公众号操作 ...

  5. 微信小程序直播间开发抽红包功能

    1.前言 微信小程序直播间开发抽红包功能 微信小程序直播是微信官方提供的商家经营工具,商家可通过在小程序内直播实现用户互动与商品销售的闭环,无需任何的跳转,提高下单转化率,直播更是成为链接商家和消费者 ...

  6. 微信小程序安装与开发步骤

    微信小程序安装与开发步骤 1.登陆 :微信专有开发工具安装地址 如图:我选择的是稳定版,64位 安装完成后 如图: 图 2 . 2.新建第一个小程序 2.1 申请 AppID 登陆https://mp ...

  7. 微信小程序开发登录界面mysql_微信小程序 欢迎界面开发的实例详解

    微信小程序 欢迎界面 市面上大多数的app都会有一个欢迎界面,下面将演示如何通过微信小程序实现一个欢迎界面. 下面将会按照以下的顺序介绍: 布局的实现 逻辑的实现 样式的实现 1.布局的实现 整个布局 ...

  8. 微信小程序image组件开发程序以及相关图片问题参考资料汇总

    微信小程序image组件开发程序以及相关图片问题参考资料汇总,希望对大家小程序开发能有一定的参考和借鉴价值.以下汇总主要涉及到微信小程序image组件有关资源路径.缩放和剪裁模式等进行的探讨,无论是对 ...

  9. angularjs全栈开发知乎_1-4【微信小程序全栈开发课程】原生小程序框架介绍

    1.打开小程序目录 打开微信开发者工具,我们上一节新建的项目,我圈出来的这个地方就是小程序的目录结构(如果你那里没有显示,可以点击左上方的编辑器来显示) 2.原生小程序框架介绍 给大家画了一张图,重要 ...

最新文章

  1. 《从零开始学Swift》学习笔记(Day 6)——哎呀常量和变量都该什么时候用啊?...
  2. 文字超出部分显示..._matplotlib图形内的文字、注释、箭头
  3. ue4 gpu构建_待在家里吗 为什么不构建GPU Box!
  4. 在google play开放平台上closed texting如何删除_“爷青回”!如何抢先体验《英雄联盟》手游?这份攻略送给你...
  5. 【C++基础学习】关于C++静态成员函数和变量
  6. 离线语法设置 科大讯飞_科大讯飞智能键盘K710评测 输入速度超级加倍
  7. 通过连接池无法连接mysql_连接池无法链接数据库
  8. 关闭tomcat8080端口
  9. java比较两个对象_Java比较两个对象
  10. vb调用python函数_vb.net / C# 调用 python
  11. 逐帧动画案例(奔跑的小人)
  12. 金融科技之能量守恒定律
  13. html图片撑开盒子,css背景图撑开盒子高度
  14. SVM学习总结(三)SMO算法流程图及注释源码
  15. office2016安装后右键新建没有word、excel、ppt等--解决方法总结
  16. 7-6 平面向量加法
  17. 统计素数并求和 / 求奇数和
  18. 哈工大软件过程与工具复习总结
  19. 《安富莱嵌入式周报》第276期:2022.07.25--2022.07.31
  20. nrf52832 --- 看门狗

热门文章

  1. Linux系统资源查询命令(cpu、io、mem)
  2. iOS 关于关键字高亮
  3. openfire修改服务器名称方法
  4. Coolite Toolkit入门指南
  5. 虚拟服务器问题,虚拟主机常见的五大问题
  6. 计算机数据恢复专业,专业电脑数据恢复软件哪个好
  7. mysql5.0 php_php怎么连接mysql5.0?
  8. sleep()和yield()
  9. 操作系统:Linux 环境变量配置的 6 种方法!
  10. 硬件:开机如何进BIOS,U盘启动快捷键一键查询!