1. 程式人生 > >一套程式碼小程式&Web&Native執行的探索(2)

一套程式碼小程式&Web&Native執行的探索(2)

接上文:一套程式碼小程式&Web&Native執行的探索01,本文都是一些探索性為目的的研究學習,在最終版輸出前,內中的內容可能會有點亂

參考:

https://github.com/fastCreator/MVVM

https://www.tangshuang.net/3756.html

https://www.cnblogs.com/kidney/p/8018226.html

經過之前的學習,發現Vue其實與小程式框架相識度比較高,業內也有mpvue這種還比較成熟的方案了,我們這邊依舊不著急去研究成熟的框架,現在看看自己能做到什麼程度,最近也真正的開始接觸了一些Vue的東西,裡面的程式碼真的非常不錯,研究學習了下Vue的結構,發現其實跟我們要的很類似,這裡想要嘗試初步的方案:提供Html模板->解析Html模板,其實這裡就是Vue裡面Parse部分的邏輯,一小部分程式碼,這樣有很多Vue的程式碼可以借鑑,也變相的學習Vue的原始碼,一舉兩得,於是我們速度開始今天的學習

首先,我們設定一個簡單的目標:設定一段簡單的小程式模板,當我們做完web版本後,他可以在小程式中執行

1234 <
view class="c-row search-line"data-flag="start"ontap="clickHandler"><view class="c-span9 js-start search-line-txt">{{name}}</view></view>
12345678910 Page({data:{name:'hello world'},clickHandler:function(){this.setData({name:'葉小釵'})}})

這裡第一個關鍵便是將html模板轉換為js程式碼,如果是之前我們直接會用這種程式碼:

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 _.template=function(text,data,settings){varrender;settings=_.defaults({},settings,_.templateSettings);// Combine delimiters into one regular expression via alternation.varmatcher=newRegExp([(settings.escape||noMatch).source,(settings.interpolate||noMatch).source,(settings.evaluate||noMatch).source].join('|')+'|$','g');// Compile the template source, escaping string literals appropriately.varindex=0;varsource="__p+='";text.replace(matcher,function(match,escape,interpolate,evaluate,offset){source+=text.slice(index,offset).replace(escaper,function(match){return'\\'+escapes[match];});if(escape){source+="'+\n((__t=("+escape+"))==null?'':_.escape(__t))+\n'";}if(interpolate){source+="'+\n((__t=("+interpolate+"))==null?'':__t)+\n'";}if(evaluate){source+="';\n"+evaluate+"\n__p+='";}index=offset+match.length;returnmatch;});source+="';\n";// If a variable is not specified, place data values in local scope.if(!settings.variable)source='with(obj||{}){\n'+source+'}\n';source="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+source+"return __p;\n";try{render=newFunction(settings.variable||'obj','_',source);}catch(e){e.source=source;throwe;}if(data)returnrender(data,_);vartemplate=function(data){returnrender.call(this,data,_);};// Provide the compiled function source as a convenience for precompilation.template.source='function('+(settings.variable||'obj')+'){\n'+source+'}';returntemplate;};// underscore裡面的程式碼

將上述程式碼做字串處理成字串函式,然後將data傳入,重新渲染即可。然而技術在變化,在進步。試想我們一個頁面某個子節點文字發生了變化,全部重新渲染似乎不太划算,於是出現了虛擬DOM概念(React 導致其流行),他出現的意義就是之前我們使用jQuery操作10次dom的時候瀏覽器會操作10次,這裡render過程中導致的座標計算10次render tree的形成可能讓頁面變得越來越卡,而虛擬DOM能很好的解決這一切,所以這裡我們就需要將我們模板中的程式碼首先轉換為虛擬DOM,這裡涉及到了複雜的解析過程

PS:回到最初Server渲染時代,每次點選就會導致一次伺服器互動,並且重新渲染頁面

Virtual DOM

我們做的第一步就是將模板html字串轉換為js物件,這個程式碼都不要說去實現,光是想想就知道里面必定會有大量的正則,大量的細節要處理,但我們的目標是一套程式碼多端執行,完全沒(能力)必要在這種地方耗費時間,所以我們直接閱讀這段程式碼:https://johnresig.com/blog/pure-javascript-html-parser/,稍作更改後,便可以得到以下程式碼:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 /* * Modified at https://github.com/blowsie/Pure-JavaScript-HTML5-Parser */// Regular Expressions for parsing tags and attributeslet startTag=/^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z_:@][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/,    endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/,    attr = /([a-zA-Z_:@][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g// Empty Elements - HTML 5let empty = makeMap("area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr")// Block Elements - HTML 5let block = makeMap("a,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video")// Inline Elements - HTML 5let inline = makeMap("abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var")// Elements that you can, intentionally, leave open// (and which close themselves)let closeSelf = makeMap("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr")// Attributes that have their values filled in disabled="disabled"let fillAttrs = makeMap("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected")// Special Elements (can contain anything)let special = makeMap("script,style")function makeMap(str) {    var obj = {}, items = str.split(",");    for (var i = 0; i < items.length; i++)        obj[items[i]] = true;    return obj;}export default function HTMLParser(html, handler) {    var index, chars, match, stack = [], last = html;    stack.last = function () {        return this[this.length - 1];    };    while (html) {        chars = true;        // Make sure we're notinascript orstyle elementif(!stack.last()||!special[stack.last()]){// Commentif(html.indexOf("<!--")==0){index=html.indexOf("-->");if(index>=0){

相關推薦

程式碼程式&Web&Native執行探索02

接上文:一套程式碼小程式&Web&Native執行的探索01,本文都是一些探索性為目的的研究學習,在最終版輸出前,內中的內容可能會有點亂 參考: https://github.com/fastCreator/MVVM https://www.tangshuang.net/3756.htm

程式碼程式&Web&Native執行探索1

前言 之前一直在跟業務方打交道後面研究了下後端,期間還做了一些運營、管理相關工作,哈哈,最近一年工作經歷十分豐富啊,生命在於不斷的嘗試嘛。 當然,不可避免的在前端技術一塊也稍微有點落後,對React&Vue沒有進行過深入一點的研究,這裡得空我們便來一起研究一番(回想起來寫程式碼的日子才是最快樂的

程式碼程式&Web&Native執行探索03

我們在研究如果小程式在多端執行的時候,基本在前端框架這塊陷入了困境,因為市面上沒有框架可以直接拿來用,而Vue的相識度比較高,而且口碑很好,我們便接著這個機會同步學習Vue也解決我們的問題,我們看看這個系列結束後,會不會離目標進一點,後續如果實現後會重新整理系列文章...... 參考: https:/

程式碼程式&Web&Native執行探索2

接上文:一套程式碼小程式&Web&Native執行的探索01,本文都是一些探索性為目的的研究學習,在最終版輸出前,內中的內容可能會有點亂 參考: https://github.com/fastCreator/MVVM https://www.tangshuang.net/3756.html

程式碼程式&Web&Native執行探索04——資料更新

參考: https://github.com/fastCreator/MVVM(極度參考,十分感謝該作者,直接看Vue會比較吃力的,但是看完這個作者的程式碼便會輕易很多,可惜這個作者沒有對應部落格說明,不然就爽了) https://www.tangshuang.net/3756.html htt

程式碼程式&Web&Native執行探索05——snabbdom

參考: https://github.com/fastCreator/MVVM(極度參考,十分感謝該作者,直接看Vue會比較吃力的,但是看完這個作者的程式碼便會輕易很多,可惜這個作者沒有對應部落格說明,不然就爽了) https://www.tangshuang.net/3756.html h

程式碼程式&Web&Native執行探索07——mpvue簡單調研

前言 最近工作比較忙,加之上個月生了小孩,小情人是各種折騰他爸媽,我們可以使用的獨立時間片不多,雖然這塊研究進展緩慢,但是一直做下去,肯定還是會有一些收穫的 之前我們這個課題研究一直是做獨立的研究,沒有去看已有的解決方案,這個是為了保證一個自己獨立的思維,無論獨立的思維還是人格都是很重要的東西,然獨學

程式碼程式&Native&Web階段總結篇】可以這樣閱讀Vue原始碼

前言 在實際程式碼過程中我們發現,我們可能又要做H5站又要做小程式同時還要做個APP,這裡會造成很大的資源浪費,如果設定一個規則,讓我們可以先寫H5程式碼,然後將小程式以及APP的業務差異程式碼做掉,豈不快哉?但小程式的web框架並不開源,不然也用不著我們在此費力了,經過研究,小程式web端框架是一套自

課堂|通過遊戲學習Ethereum DApps程式設計2

1 solidity語言的知識點 for ETH網路中,對於區塊鏈的寫入操作,是需要使用者支付Gas的,所以我們很多時候選用 memory 而不是 storage。 memory用於臨時儲存,類似於RAM。 這樣定義多個 memory。 uint[] memo

.NET Core 程式開發零基礎系列2——程式服務通知模板訊息

基於上一篇檔案“.NET Core 小程式開發零基礎系列(1)——開發者啟用並校驗牽手成功”的反映,個人覺得效果很不錯,大家對公眾號開發還是有很大需求的,同時也收到了很多同學的問題,後面我也會通過實戰性文章慢慢的表現出來 ,讓大家更容易吃得透一些。在這裡特別感謝

web服務程式設計探索2——外掛模型

一、模型圖 該模型是自己摸索出來的一種web服務設計模型,整個圍繞核心業務邏輯處理模組進行。在這個模型中,core業務邏輯處理中心處理負責執行所有邏輯處理流程,該模組所需要的所有副作用操作都以“外掛”的形式從引數中傳入。而所謂的“外掛”,其實就是一些處理副

java web程式啟動自動執行方法spring

場景:將web專案部署到tomcat後,啟動tomcat後自動執行程式重的某個方法。 環境:spring、springmvc 直接新建一個controller類,讓該類實現ApplicationLis

程式picker---級聯效果三級

一、WXML <!-- 部門 --> < picker bindchange = "bindPickerChange1" value =

課堂|通過遊戲學習Ethereum DApps程式設計1

這篇文章,是通過製作一款可愛的遊戲(DAPP,也可以稱做智慧合約),從而學習Solidity語言。和ETH網路的一些基礎知識。 全程線上程式設計,無需搭建複雜的環境,只需要有任何其他語言的程式設計經驗,即可馬上學習。 這篇文章是一篇關於製作遊戲的總結。 1

課堂|通過遊戲學習Ethereum DApps程式設計3

1 solidity語言的知識點 Random Numbers 很多時候我們都需要隨機數。 在solidity裡面,我們可以通過 keccak256 來產生hash隨機數。 // Generate a random number between 1 and 1

課堂|通過遊戲學習Ethereum DApps程式設計5

1 ERC721 tokens 在這個遊戲裡面,我們使用ERC721 tokens標準,通常的情況下,使用的是ERC20 tokens。 有興趣的童學可以研究一下兩個標準的不同。 ERC721 tokens有兩種方式交易"金幣"的方式。雖然在這裡我用的"金幣"

程式學習之路--UI1

button.wxss /* pages/button/button.wxss */ .container{ align-items: flex-start; justify-content:

程式---清除系統盤垃圾BAT

複製以下內容(黑框部分)至文字文件, 檔名稱改為“小程式---清除系統盤垃圾.bat”, 右鍵“以管理員身份執行”即可。 @echo off color 2F ::設定視窗顏色,2代表背景顏色為綠色,F代表文字顏色為亮白色 mode con cols=80 line

python高階——多工執行2執行緒UDP聊天器

import socket import threading def recv_msg(udp_socket): # 接收資料 while True: recv_data = udp_socket.recvfrom(1024) print(recv