成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

讓你的「微信小程序」運行在Chrome瀏覽器上,讓我們使用WebStorm

HitenDev / 3865人閱讀

摘要:微信小程序的開發(fā)框架體驗起來,還不錯自帶了框架。微信在微信小程序引導(dǎo)著開向封閉,我們再也不能愉快地分享我們的代碼了。好了,廢話說完了文章太長不想看,可以直接看哈哈預(yù)覽真實世界下的三基本元素微信小程序的背后運行的是一個名為框架。

「微信小程序」的開發(fā)框架體驗起來,還不錯——自帶了UI框架。但是問題是他的IDE,表現(xiàn)起來相當(dāng)?shù)脑愀狻鋵嵵饕且驗?,我?dāng)時買WebStorm License買了好多年。所以,我覺得他的IDE真不如我這個付費好用。

而且,作為一個擁護(hù)自由和開源的 「GitHub 中國區(qū)首席Markdown程序員」。微信在「微信小程序」引導(dǎo)著Web開向封閉,我們再也不能愉快地分享我們的代碼了。

如果我們放任下去,未來的Web世界令人堪憂。

好了,廢話說完了:

文章太長不想看,可以直接看Demo哈哈:

GitHub: https://github.com/phodal/weapp-webdemo
預(yù)覽:http://weapp.phodal.com/

真實世界下的MINA三基本元素

「微信小程序」的背后運行的是一個名為MINA框架。在之前的幾篇文章里,我們介紹得差不多了?,F(xiàn)在讓我們來作介紹pipeline:

Transform wxml和wxss

當(dāng)我們修改完WXML、WXSS的時候,我們需要重新編譯項目才能在瀏覽器上看到效果。這時候后臺就會執(zhí)行一些transform動作:

wcc來轉(zhuǎn)換wxml為一個genrateFun,執(zhí)行這個方法將會得到一個virtual dom

wxss就會轉(zhuǎn)換wxss為css——這一點有待商榷。

wcc和wxss,可以從vendor目錄下獲取到,在“微信web開發(fā)者工具”下敲入help,你就會得到下面的東東:

運行openVendor(),你就會得到上面的wcss、wxss、WAService.js、WAWebview.js四個文件了。

Transform js文件

對于js文件來說,則是一個拼裝的過程,如下是我們的app.js文件:

App({
onLaunch: function () { }
})

它在轉(zhuǎn)換后會變成:

define("app.js", function(require, module){var window={Math:Math}/*兼容babel*/,location,document,navigator,self,localStorage,history,Caches;
        App({
            onLaunch: function () {

            }
        })
});
require("app.js");

我假裝你已經(jīng)知道這是什么了,反正我也不想、也不會解釋了~~。同理于:

define("pages/index/index.js", function(require, module){var window={Math:Math}/*兼容babel*/,location,document,navigator,self,localStorage,history,Caches;
        Page({
            data: {
                text: initData
            }
        });
    require("pages/index/index.js");

至于它是如何replace或者apend到html中,我就不作解釋了。

MINA如何運行?

為了運行一個Page,我們需要有一個virtual dom,即用wcc轉(zhuǎn)換后的函數(shù),如:

 /*v0.7cc_20160919*/
        var $gwxc
        var $gaic={}
        $gwx=function(path,global){
            function _(a,b){b&&a.children.push(b);}
            function _n(tag){$gwxc++;if($gwxc>=16000){throw "enough, dom limit exceeded, you don"t do stupid things, do you?"};return {tag:tag.substr(0,3)=="wx-"?tag:"wx-"+tag,attr:{},children:[]}}
            function _s(scope,env,key){return typeof(scope[key])!="undefined"?scope[key]:env[key]}
            function _wl(tname){console.warn("template `" + tname + "` is being call recursively, will be stop.")}
            function _ai(i,p,e,me){var x=_grp(p,e,me);if(x)i.push(x);else{console.warn("path `"+p+"` not found from `"+me+"`")}}
            function _grp(p,e,me){if(p[0]!="/"){var mepart=me.split("/");mepart.pop();var ppart=p.split("/");for(var i=0;i

然后在我們的html中加一個script,如

document.dispatchEvent(new CustomEvent("generateFuncReady", {
        detail: {
            generateFunc: $gwx("index.wxml")
        }
    }))

就會湊發(fā)這個事件了。我簡單的拆分了WXWebview.js得到了幾個功能組件:

define.js,這里就是定義AMD模塊化的地方

exparser.js,用于轉(zhuǎn)換WXML標(biāo)簽到HTML標(biāo)簽

exparser-behvaior.js,定義不同標(biāo)簽的一些行為

mobile.js,應(yīng)該是一個事件庫,好像我并不關(guān)心。

page.js,核心代碼,即Page、App的定義所在。

report.js,你所說的一切都能夠用作為你的呈堂證供。

virtual_dom.js,一個virtual dom實現(xiàn)結(jié)合wcc使用,里面應(yīng)該還有component.css,也可能是叫weui

wa-wx.js,定義微信各種API以及WebView和Native的地方,和下面的WX有沖突。

wx.js,同上,但是略有不同。

wxJSBridge.js,Weixin JS Bridge

于是,我就用上面的組件來定義不同的位置好了。當(dāng)我們觸發(fā)自定義的generateFuncReady事件時,將由virtual_dom.js來接管這次Render:

document.addEventListener("generateFuncReady", function (e) {
    var generateFunc = e.detail.generateFunc;
    wx.onAppDataChange && generateFunc && wx.onAppDataChange(function (e) {
        var i = generateFunc((0, d.getData)());
        if (i.tag = "body", e.options && e.options.firstRender){
            e.ext && ("undefined" != typeof e.ext.webviewId && (window.__webviewId__ = e.ext.webviewId), "undefined" != typeof e.ext.downloadDomain && (window.__downloadDomain__ = e.ext.downloadDomain)), v = f(i, !0), b = v.render(), b.replaceDocumentElement(document.body), setTimeout(function () {
                wx.publishPageEvent(p, {}), r("firstRenderTime", n, Date.now()), wx.initReady && wx.initReady()
            }, 0);
        } else {
            var o = f(i, !1), a = v.diff(o);
            a.apply(b), v = o, document.dispatchEvent(new CustomEvent("pageReRender", {}));
        }
    })
})

因此,這里就是負(fù)責(zé)DOM初始化的地方了,這里得到的Dom結(jié)果是這樣的:


    
        
        add line
        remove line
    

而我們寫的wxml是這樣的:


  
    {{text}}
    
    
  

很明顯view會被轉(zhuǎn)換為wx-view,text會被轉(zhuǎn)換為wx-text等等,以此類推。這個轉(zhuǎn)換是在virtual dom.js中調(diào)用的,調(diào)用的方法就是exparser。

遺憾的是我現(xiàn)在困在 data初始化上面了~~,這里面有兩套不同的事件系統(tǒng),有一些困擾。其中有一個是:WeixinJSBridge、還有一個是app engine中的事件系統(tǒng),兩個好像不能互調(diào)。。。

使用WebStorm開發(fā)

在瀏覽器上運行之前,我們需要簡單的mock一些方法,如:

window.webkit.messageHandlers.invokeHandler.postMessage

window.webkit.messageHandlers.publishHandler.postMessage

WeixinJSCore.publishHandler

WeixinJSCore..invokeHandler

然后把 config.json中的一些內(nèi)容變成__wxConfig,如:

__wxConfig = {
    "debug": true,
    "pages": ["index"],
    "window": {
        "backgroundTextStyle": "light",
        "navigationBarBackgroundColor": "#fff",
        "navigationBarTitleText": "WeChat",
        "navigationBarTextStyle": "black"
    },
    "projectConfig": {
    
    },
    "appserviceConfig": {
       
    },
    "appname": "fdfafafafafafafa",
    "appid": "touristappid",
    "apphash": 2107567080,
    "isTourist": true,
    "userInfo": {}
}

如這里我們的appname是哈哈哈哈哈哈哈——我家在福建。

然后在我們的html中引入各個js文件,啦啦。

我們還需要一個自動化的glup腳本來watch wxml和wxss的修改,然后編譯,如:

exec("./vendor/wcc -d " + inputPath + " > " + outputFileName, function(err, stdout, stderr) {
            console.log(stdout);
            console.log(stderr);
});

說了這么多,你還不如去看代碼好了:

GitHub: https://github.com/phodal/weapp-webdemo
預(yù)覽:http://weapp.phodal.com/

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/80490.html

相關(guān)文章

  • 前端資源系列(3)-信小程序開發(fā)資源匯總

    摘要:微信小程序應(yīng)用號開發(fā)資源匯總文檔工具教程代碼插件組件文檔從搭建一個微信小程序開始小程序開發(fā)文檔小程序設(shè)計指南工具小程序開發(fā)者工具官方支持微信小程序?qū)崟r預(yù)覽的支持的微信小程序組件化開發(fā)框架轉(zhuǎn)在線工具小程序云端增強(qiáng)社區(qū)微信小程序 微信(小程序or應(yīng)用號)開發(fā)資源匯總-文檔-工具-教程-代碼-插件-組件 文檔 從搭建一個微信小程序開始 小程序開發(fā)文檔 小程序設(shè)計指南 工具 小程序開發(fā)者...

    paney129 評論0 收藏0
  • 使用Labrador 0.4構(gòu)建組件化自動化測試信小程序

    摘要:自定義組件的自定義組件,是基于微信小程序框架的組件之上,進(jìn)一步自定義組合,擁有邏輯處理和樣式。這樣做的目的請參見微信小程序開發(fā)三宗罪和解決方案項目中通用自定義組件存放在目錄,一個組件一般由三個文件組成,和分別對應(yīng)微信小程序框架的和文件。 Labrador 是一個專為微信小程序開發(fā)的組件化開發(fā)框架。 特性 使用Labrador框架可以使微信開發(fā)者工具支持加載海量NPM包 支持ES6/7...

    LiuRhoRamen 評論0 收藏0

發(fā)表評論

0條評論

HitenDev

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<