一次微信小程序的快速開發體驗

起因

事情是這樣的

一天早上組里還早激烈的討論某個項目的可用性和發展前景,突然老大說了句,能不能做個小程序的版本呢?然后大家紛紛討論起來,有反對有支持,我就說了一句,剛出來的時候搞過一會。。。然后就把我推出來了(日了狗了~~)

這個項目大概一個星期之后就要推出去了,換句話說,我要一個星期內搞個小程序的版本出來,寶寶有點慌了~~

不過既然接手了還是要好好做的,首先的,完全自己搞肯定是來不及,項目的模塊絕對要復用起來,思索下大概有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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282673.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282673.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282673.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

造數據時踏過的坑

1.在產生隨機數時,在數據規模很大的時候很難出現自己要的模型,比如某個條件的數據量,此時要寫一個方法,來造一批這樣的數據 2.將控制數量,文件路徑寫成配置文件的形式,以免重復打包 3.輸入輸出文件夾,可以配置以免重復打包 轉載于:https://www.cnblogs.com/rocky-AGE-24/p/7376…

如何證明 ConcurrentDictionary 字典操作不全是線程安全的

前言最近&#xff0c;看到一篇文章&#xff0c;講到《ConcurrentDictionary字典操作竟然不全是線程安全的&#xff1f;》。首先&#xff0c;這個結論是正確的&#xff0c;但文中給出的一個證明例子&#xff0c;我覺得是有問題的。相關代碼如下&#xff1a;using System.Collect…

微型計算機及接口技術試題,1月自考微型計算機及其接口技術試題及答案解析...

《1月自考微型計算機及其接口技術試題及答案解析》由會員分享&#xff0c;可在線閱讀&#xff0c;更多相關《1月自考微型計算機及其接口技術試題及答案解析(11頁珍藏版)》請在人人文庫網上搜索。1、精品自學考試資料推薦全國 2018年 1月自考微型計算機及其接口技術試題課程代碼…

16-djongo中間件學習

目錄 前戲 我們在前面的課程中已經學會了給視圖函數加裝飾器來判斷是用戶是否登錄&#xff0c;把沒有登錄的用戶請求跳轉到登錄頁面。我們通過給幾個特定視圖函數加裝飾器實現了這個需求。但是以后添加的視圖函數可能也需要加上裝飾器&#xff0c;這樣是不是稍微有點繁瑣。 學完…

PHP基礎(必須熟練掌握的基礎)

<?php/*** 三元運算符的應用*/ /* $a 10; $b 15; echo $a > $b ? 1 : 0; */ // 注:php7新添加的運算符比較運算符x<>y // 如果x和y相等,就返回0,如果x>y,就返回1,如果x的值小于y,就返回-1/* $a "aaa"; $b "bbb"; echo $a.$b; *//*** …

子進程無法從標準輸入讀取數據

每個process對象最多只能調用一次start()方法&#xff0c;join([timeout])方法會阻塞調用process對象的進程&#xff0c;直到timeout時間超時&#xff0c;或者process進程退出。如果timeout設置為None&#xff0c;則無超時時間。對于linux操作系統的進程管理&#xff0c;父進程…

Eclipse控制項目的訪問名稱

Eclipse控制web項目的訪問名稱 web項目的訪問路徑&#xff08;名稱&#xff09;修改 1.點擊項目右鍵-》properties找到Context root 修改成我們需要的名字即可轉載于:https://www.cnblogs.com/pypua/articles/7379950.html

計算機一級選擇題已做完確認,計算機一級選擇題(附答案)

點擊藍字關注我們(1)按照需求功能的不同&#xff0c;信息系統已形成各種層次&#xff0c;計算機應用于管理是開始于:()A)信息處理B)人事管理C)決策支持D)事務處理正確答案&#xff1a;A解析&#xff1a;計算機用于管理&#xff0c;起源于計算機在辦公應用中對大量信息、數據的處…

參加51CTO培訓,PMP考試通過啦

為什么選擇考PMP&#xff1f;先介紹下自己的情況&#xff0c;畢業三年&#xff0c;單位類似于平臺&#xff0c;不做技術&#xff0c;常態的工作是文案、商務、市場都會涉及些&#xff0c;對未來也有些迷茫。受前輩點撥可以學一些通用的技能&#xff0c;于是我選擇了PMP&#xf…

如何查看服務器并發請求連接數

https://wenku.baidu.com/view/fb553d795acfa1c7aa00cc27?pcf2#1 轉載于:https://www.cnblogs.com/linewman/p/9918760.html

C# 二十年語法變遷之 C# 5 和 C# 6參考

C# 二十年語法變遷之 C# 5 和 C# 6參考https://benbowen.blog/post/two_decades_of_csharp_ii/自從 C# 于 2000 年推出以來&#xff0c;該語言的規模已經大大增加&#xff0c;我不確定任何人是否有可能在任何時候都對每一種語言特性都有深入的了解。因此&#xff0c;我想寫一系…

非涉密計算機檢查的通知,關于開展非涉密計算機及可移動存儲介質專項清理活動的緊急通知...

關于在全校范圍內開展非涉密計算機及可移動存儲介質專項清理活動的緊急通知密辦字[2009]01號各單位&#xff1a;為有效遏制木馬病毒和惡意代碼的蔓延趨勢&#xff0c;現在校內開展一次非涉密計算機及可移動存儲介質的專項清理活動&#xff0c;要求如下&#xff1a;1、所有涉密人…

Spring Cloud構建微服務架構:服務消費(基礎)

使用LoadBalancerClient在Spring Cloud Commons中提供了大量的與服務治理相關的抽象接口&#xff0c;包括DiscoveryClient、這里我們即將介紹的LoadBalancerClient等。對于這些接口的定義我們在上一篇介紹服務注冊與發現時已經說過&#xff0c;Spring Cloud做這一層抽象&#x…

oracle數據庫中VARCHAR2(50 CHAR) 和VARCHAR2(50) 有啥區別?

VARCHAR2&#xff08;50 char&#xff09;這種類型的字段最多放50個字符&#xff0c;不夠50個用空格填充&#xff1b;而VARCHAR2(50)最大允許存放50個字符&#xff0c;但是不足50個也不用空格填充。varchar2是變長字符串&#xff0c;與CHAR類型不同&#xff0c;它不會使用空格填…

《解密小米之互聯網下的商業奇跡》

解密小米《解密小米之互聯網下的商業奇跡》 磐石之心 清華大學出版社 2014/10/1 書籍&#xff1a;《非同凡響想,喬布斯啟示錄》 磐石之心&#xff1a;原名王斌&#xff0c;互聯網IT資深預言家&#xff0c;第一個提出互聯網未來競爭是在線生活方式的競爭&#xff1b;第一個提出3…

計算機內存的故障,計算機內存出現故障的解決方法

內存如果出現故障&#xff0c;會造成系統運行不穩定、程序異常出錯和*作系統無法安裝的故障&#xff0c;下面將列舉內存常見的故障排除實例。1)內存順序引起的計算機工作不正常故障現象&#xff1a;一臺p4計算機&#xff0c;使用的是華碩intel850芯片組的主板&#xff0c;兩條r…

2018暑假集訓---遞推遞歸----一只小蜜蜂hdu2044

一只小蜜蜂... Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 93249 Accepted Submission(s): 33187Problem Description 有一只經過訓練的蜜蜂只能爬向右側相鄰的蜂房&#xff0c;不能反向爬行。請編程計算蜜…

《ASP.NET Core 6框架揭秘》實例演示[28]:自定義一個服務器

作為ASP.NET Core請求處理管道的“龍頭”的服務器負責監聽和接收請求并最終完成對請求的響應。它將原始的請求上下文描述為相應的特性&#xff08;Feature&#xff09;&#xff0c;并以此將HttpContext上下文創建出來&#xff0c;中間件針對HttpContext上下文的所有操作將借助于…

高清攝像頭MIPI接口與ARM連接【轉】

本文轉載自&#xff1a;http://www.cnblogs.com/whw19818/p/5811299.html MIPI攝像頭常見于手機、平板中&#xff0c;支持500萬像素以上高清分辨率。它的全稱為“Mobile Industry Processor Interface”&#xff0c;分為MIPI DSI 和MIPI CSI&#xff0c;分別對應于視頻顯示和視…

算法(第4版)Robert Sedgewick 刷題 第一章(1)

/*** Description 顛倒數組排列順序* author SEELE* date 2017年8月17日 上午10:56:17* action sortArr*/public static void sortArr() {int[] b new int[6];int[] a { 1, 2, 3, 4, 5, 6, 7 };for (int i 0; i < a.length / 2; i) {int temp a[a.length - 1 - i];a[a.l…