事情是这样的javascript
一天早上组里还早激烈的讨论某个项目的可用性和发展前景,忽然老大说了句,能不能作个小程序的版本呢?而后你们纷纷讨论起来,有反对有支持,我就说了一句,刚出来的时候搞过一会。。。而后就把我推出来了(日了狗了~~)html
这个项目大概一个星期以后就要推出去了,换句话说,我要一个星期内搞个小程序的版本出来,宝宝有点慌了~~vue
不过既然接手了仍是要好好作的,首先的,彻底本身搞确定是来不及,项目的模块绝对要复用起来,思索下大概有3点须要搞java
HTMLnode
CSSgit
javascript module程序员
其中CSS在小程序的叫作WXSS,基本和CSS语法相似了,也就须要将标签选择器改了,好比github
table{ //XXX } //改为 .table{ }
还有就是WXSS的尺寸单位比较推荐使用rpx,可是这里仍是继续使用px,固然在响应式方面还须要本身改改,工程量不是很大json
对于JS方面就比较棘手了一点,惟一庆幸的是,原项目是用vue来作框架搭建的,仔细观察下小程序框架的语法结构,发现其实和vue很相似,都具有生命周期和各类事件绑定等等,因此在总体JS结构上面大概有几点须要修改canvas
生命周期函数
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直接套在WXML上面是行不通的,结果是能够编译显示出来,可是彻底失去了HTML各个标签的意义,好比div块级标签所具有的属性都不存在了,固然你能够经过WXSS添加属性来兼容,好比
div, p { display:blcok }
我我的并不赞同这种作法,由于在HTML中img、canvas等等并无要求闭合标签,可是WXML是严格要求每一个标签都要有闭合,就是说你想经过添加WXSS属性来兼容的话,首先要手动加img和canvas的闭合标签(在小程序中img标签应该是image,否则仍是没法显示图片),其次就是怕官方下次更新迭代忽然加入div这个组件,而后又要改版,烦~~
那么惟一的出路就是将HTML转成符合小程序的WXML出来,做为一个程序员,手动改也太掉价了。。。直接上工具,google查下,发现网上也有相似的工具出来,工具的转换原理是这样的话,首先HTML先转换成json对象,而后注入到模版,由模版生成。
可是有2个问题
一、转换出来的WXML是依赖模版渲染的,首先小程序的模版是不支持递归调用的,就是说,假如你的标签有6层嵌套的话,那么你须要复制6份模版出来,而后tmp1嵌套tmp2...temp6,这样的话你只能祈祷工具带来的模版有嵌套了足够多。
二、没法实现数据绑定,好比
<div>{{text}}</div> //转换后原样输出了{{text}} <view>{{text}}</view>
既然模版输出这条路走不通,那就只能借助node动态的输出WXML,思路和上面差很少,也是HTML生成json dom,而后递归渲染wxml节点,最后输出一份wxml文件,工具的实如今这里,细节就很少说了,目前尚未作canvas、audio、video标签的转换,有BUG的话直接提issue,最后求star
没事别BB