Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 91福利电影福利在线观看,成人欧美在线,婷婷综合网站

          整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          從前端到全端:JavaScript逆襲之路

          年來,前端技術(shù)日新月異,前端已經(jīng)不僅僅是網(wǎng)頁,更多的開始由狹義向廣義發(fā)展。

          先后涌現(xiàn)出了具備后端能力的node,具備移動(dòng)開發(fā)能力的react native,具備游戲渲染能力的cocos2d-js,以及iOS上的熱修復(fù)技術(shù)JSPatch等等新技術(shù)。

          咋一看,幾乎各個(gè)端都被JavaScript攻陷,大有一統(tǒng)江湖之勢(shì)。

          究竟,JavaScript如何做到上天入地?zé)o所不能?JavaScript真的能一統(tǒng)江湖嗎?

          亂世出英雄:JavaScript的誕生故事要從JavaScript的由來說起。

          高能瞎扯淡版,正經(jīng)臉的同學(xué)可以忽略

          有人的地方就有江湖,有江湖的地方就有紛爭。

          故事要從當(dāng)年的瀏覽器之戰(zhàn)說起。

          時(shí)間回到1994年,

          (→ 那時(shí)候我還是個(gè)寶寶~ #天真臉#)

          景兄弟橫空出世,并自帶神器網(wǎng)景導(dǎo)航,戰(zhàn)斗力爆表,勢(shì)如劈竹,瞬時(shí)間威震天下。

          一出世就武裝到牙齒,武力值這么高還自帶兵器,這個(gè)科學(xué)嗎?

          港真,我也覺得不科學(xué),也許跟熊孩子哪吒、女漢子雅典娜是一個(gè)品種吧?

          這一切北方的老前輩微軟大濕,都看在眼里,不甘天下盡歸景兄弟這個(gè)初出茅廬的毛孩子,大濕積淀多年,潛心修煉一年,終于帶著大殺器IE 1.0出關(guān)了,誓于景兄弟爭個(gè)高低。

          自此景兄弟的網(wǎng)景導(dǎo)航 VS 微軟大濕的IE 的軍備戰(zhàn)爭開始。

          景兄弟仔細(xì)掂量,微軟大濕財(cái)大氣粗,內(nèi)功深厚,臣妾實(shí)在是辦不到啊啊啊啊啊啊。

          景兄弟緊急召集門人商議對(duì)策,有一門人曰:”以我們微薄之力硬磕,是萬萬使不得的。如今我們,一是宜施行合縱之策,抱大腿,組成聯(lián)盟!二是避其鋒芒,出奇招致勝?!?/p>

          于是景兄弟依照此策略,一方面找到了當(dāng)時(shí)德高為重的另一位前輩SUN,組成了開發(fā)者聯(lián)盟。

          (微軟大濕:握草,聯(lián)盟都粗來了,那我是不是得搞個(gè)部落?)

          另一方面,景兄弟找到了鍛造大師布蘭登,請(qǐng)布大師幫忙升級(jí)兵器網(wǎng)景導(dǎo)航,大師就是大師,不費(fèi)吹灰之力就完成了強(qiáng)化升級(jí),然而布大師突發(fā)奇想,本來這是近距離攻擊兵器,要是有多一個(gè)遠(yuǎn)距離攻擊的能力那豈不是更好?Just do it. 想罷大師就加了一個(gè)遠(yuǎn)距離攻擊的feature。于是有了自帶遠(yuǎn)距離攻擊能力的網(wǎng)景導(dǎo)航2.0。景兄弟一看這么流弊心里甚是歡喜,不過遠(yuǎn)距離攻擊的技能叫做LiveScript,感覺不是特別Fashion。特然想到這不是跟SUN前輩聯(lián)盟嘛,SUN家的Java正是獨(dú)霸武林之時(shí)。不如把名字改成跟Java有關(guān),蹭一把東風(fēng),蹭點(diǎn)光環(huán)。一拍腦袋,JavaScript?。?!眾門人一聽:”好好好,JavaScript 流弊炫酷吊炸天!“

          果然第一節(jié)下半場(chǎng),景兄弟攜強(qiáng)化過的網(wǎng)景導(dǎo)航2.0 戰(zhàn)個(gè)痛快,那是杠杠的!人家一問,你咋還能遠(yuǎn)程攻擊,你這個(gè)遠(yuǎn)程攻擊用的是啥?答曰:JavaScript。“JavaScript,一定是跟SUN家Java是一個(gè)系列產(chǎn)品,一定很流弊!”#光環(huán)加成,各種膜拜臉#

          微軟大濕虧了一場(chǎng),痛定思痛,也要搞遠(yuǎn)程攻擊功能,果然不久,就祭出了同樣帶有遠(yuǎn)程攻擊能力的IE 3.0,鑒于景兄弟的遠(yuǎn)程攻擊叫做JavaScript,J開頭的感覺應(yīng)該比較流弊,所以微軟大濕的叫做JScript。

          然后戰(zhàn)爭就從地面貼身肉搏戰(zhàn),開始逐步升級(jí)到了遠(yuǎn)距離核戰(zhàn)爭。

          正所謂,城門失火,殃及池魚。這么打下去苦逼的是搬磚的頁面仔,就是我這種,到處都是雷區(qū),無處下腳。

          最后到了1997年,“聯(lián)合國安理會(huì)秘書長”艾瑪(ECMA)出來調(diào)停,多方簽署了“核不擴(kuò)散條約”,約束各種遠(yuǎn)程攻擊武器的使用,這才走上了正軌。

          1995年SUN開發(fā)了Java技術(shù),這是第一個(gè)通用軟件平臺(tái)。Java擁有跨平臺(tái)、面向?qū)ο?、泛型編程的特性,廣泛應(yīng)用于企業(yè)級(jí)Web應(yīng)用開發(fā)和移動(dòng)應(yīng)用開發(fā)。Java也伴隨著互聯(lián)網(wǎng)的迅猛發(fā)展而發(fā)展,逐漸成為重要的網(wǎng)絡(luò)編程語言。名噪一時(shí)。

          1994年Netscape公司成立,并推出了自己的瀏覽器的免費(fèi)版本 Netscape Navigator,很快就占有了瀏覽器市場(chǎng)。到了 1995 年,微軟公司開始加入,并很快發(fā)布了自己的 Internet Explorer 1.0。

          1995年,當(dāng)時(shí)在Netscape就職的Brendan Eich(布蘭登·艾克),正為Netscape Navigator 2.0瀏覽器開發(fā)的一門名為LiveScript的腳本語言,后來Netscape與Sun Microsystems組成的開發(fā)聯(lián)盟,為了讓這門語言搭上Java這個(gè)編程語言“熱詞”,將其臨時(shí)改名為“JavaScript”,日后這成為大眾對(duì)這門語言有諸多誤解的原因之一。

          JavaScript最初受Java啟發(fā)而開始設(shè)計(jì)的,目的之一就是“看上去像Java”,因此語法上有類似之處,一些名稱和命名規(guī)范也借自Java。但JavaScript的主要設(shè)計(jì)原則源自Self和Scheme。JavaScript與Java名稱上的近似,是當(dāng)時(shí)Netscape為了營銷考慮與SUN達(dá)成協(xié)議的結(jié)果。

          ==> 所以,JavaScript和Java其實(shí)沒有半毛錢關(guān)系。

          JavaScript推出后在瀏覽器上大獲成功,微軟在不久后就為Internet Explorer 3.0瀏覽器推出了JScript,以與處于市場(chǎng)領(lǐng)導(dǎo)地位的Netscape產(chǎn)品同臺(tái)競(jìng)爭。JScript也是一種JavaScript實(shí)現(xiàn),這兩個(gè)

          JavaScript語言版本在瀏覽器端共存意味著語言標(biāo)準(zhǔn)化的缺失,對(duì)這門語言進(jìn)行標(biāo)準(zhǔn)化被提上了日程,在1997年,由Netscape、SUN、微軟、寶藍(lán)等公司組織及個(gè)人組成的技術(shù)委員會(huì)在ECMA(歐洲計(jì)算機(jī)制造商協(xié)會(huì))確定定義了一種名叫ECMAScript的新腳本語言標(biāo)準(zhǔn),規(guī)范名為ECMA-262。JavaScript成為了ECMAScript的實(shí)現(xiàn)之一。ECMA-262 第五版,即是ES5。

          ==> ECMA-262,包括ES5, ES6等是一個(gè)標(biāo)準(zhǔn),JavaScript是ECMAScript的一個(gè)實(shí)現(xiàn)。

          完整的JavaScript實(shí)現(xiàn)應(yīng)該包含三個(gè)部分:

          在網(wǎng)景導(dǎo)航2.0和IE 3.0出現(xiàn)之后的幾年間,網(wǎng)景和微軟公司不停的發(fā)布新版本的瀏覽器,支持更多的新功能。自此拉開了瀏覽器之戰(zhàn)的序幕。這場(chǎng)瀏覽器之戰(zhàn)到現(xiàn)在還在繼續(xù),以下一張圖看清楚過程。

          從瀏覽器之戰(zhàn)可以看出,各家瀏覽器比拼的大致兩個(gè)方面視覺體驗(yàn)(渲染排版)和速度(腳本運(yùn)行)。

          ==> 所以一個(gè)完整的瀏覽器組成,至少包含兩個(gè)部分:

          補(bǔ)充一個(gè)市面常見瀏覽器的內(nèi)核和JavaScript引擎搭配:

          其他JavaScript引擎,Rhino,由Mozilla基金會(huì)管理,開放源代碼,完全以Java編寫,可以看做SpiderMonkey的Java版。

          注意:webkit不單單只是一個(gè)排版引擎,webkit = 排版引擎 + JavaScript引擎。

          ==> 所以,JavaScript是動(dòng)態(tài)語言,它的運(yùn)行都是基于JavaScript引擎,引擎大都是由靜態(tài)語言實(shí)現(xiàn)C++、Java、and so on。JavaScript的能力也是由引擎賦予。不管是瀏覽器環(huán)境中是window,亦或是node環(huán)境中的process,均是由引擎提供。

          (番外:Mozilla的人不知道為啥特別喜歡猴子,經(jīng)常以猴子命名技術(shù),所以看到帶Monkey的,十有八九估計(jì)是他們搞的。)

          諾曼底登陸:JavaScript Binding/Bridge 橋接技術(shù)

          在瀏覽器環(huán)境中,DOM、BOM、window對(duì)象、setTimeout/setInterval,alert,console等方法均不是JavaScript自身具備的能力,而是瀏覽器native實(shí)現(xiàn),然后通過JavaScript引擎注入到JS運(yùn)行的全局上下文中,供JS使用。

          鑒別方式,在調(diào)試器console中打出來,帶有[native code]的即是:

          講道理:

          1. JavaScript運(yùn)行 → 依賴于JavaScript引擎 ← 瀏覽器集成了JavaScript引擎,同時(shí)通過JavaScript引擎注入native代碼工JS腳本使用

          2. 發(fā)散一下思維,只要有JavaScript引擎,就能運(yùn)行JS腳本,不管有沒有瀏覽器!只是缺少瀏覽器提供的alert,window等方法。

          3. 既然瀏覽器可以往JavaScript引擎中注入代碼,賦予JS腳本在網(wǎng)頁中特殊的能力,同理我們可以自己集成JavaScript引擎,自己定義自己的方法往JavaScript引擎中注入,賦予JS更多更強(qiáng)的自定義能力!

            注入的關(guān)鍵是:值類型相互對(duì)應(yīng),Obj映射class的一個(gè)實(shí)例,function映射一個(gè)句柄或者引用

          JavaScript數(shù)值型中的坑

          JavaScript內(nèi)部,所有數(shù)字都是以64位浮點(diǎn)數(shù)形式儲(chǔ)存,即使整數(shù)也是如此

          這就是說,在JavaScript語言的底層,根本沒有整數(shù),所有數(shù)字都是小數(shù)(64位浮點(diǎn)數(shù))。容易造成混淆的是,某些運(yùn)算只有整數(shù)才能完成,此時(shí)JavaScript會(huì)自動(dòng)把64位浮點(diǎn)數(shù),轉(zhuǎn)成32位整數(shù),然后再進(jìn)行運(yùn)算。由于浮點(diǎn)數(shù)不是精確的值,所以涉及小數(shù)的比較和運(yùn)算要特別小心。盡量避免使用JavaScript做精準(zhǔn)計(jì)算和密集計(jì)算。

          根據(jù)國際標(biāo)準(zhǔn)IEEE 754,JavaScript浮點(diǎn)數(shù)的64個(gè)二進(jìn)制位,從最左邊開始,是這樣組成的。

          • 第1位:符號(hào)位,0表示正數(shù),1表示負(fù)數(shù)

          • 第2位到第12位:儲(chǔ)存指數(shù)部分

          • 第13位到第64位:儲(chǔ)存小數(shù)部分(即有效數(shù)字)

            符號(hào)位決定了一個(gè)數(shù)的正負(fù),指數(shù)部分決定了數(shù)值的大小,小數(shù)部分決定了數(shù)值的精度。

            IEEE 754規(guī)定,有效數(shù)字第一位默認(rèn)總是1,不保存在64位浮點(diǎn)數(shù)之中。也就是說,有效數(shù)字總是1.xx…xx的形式,其中xx..xx的部分保存在64位浮點(diǎn)數(shù)之中,最長可能為52位。因此,JavaScript提供的有效數(shù)字最長為53個(gè)二進(jìn)制位(64位浮點(diǎn)的后52位+有效數(shù)字第一位的1)。

          內(nèi)部表現(xiàn)公式:(-1)^符號(hào)位 1.xx…xx 2^指數(shù)位

          精度最多只能到53個(gè)二進(jìn)制位,這意味著,絕對(duì)值小于2的53次方的整數(shù),即-(253-1)到253-1,都可以精確表示。

          而大部分的后端語言,C++、Java、Python等的long型都是可以支持到64位,因此long型數(shù)據(jù)從后端語言傳給JavaScript會(huì)發(fā)生低位截?cái)?/strong>。遇到這種情況一般使用String處理,如需要在JavaScript中做long型計(jì)算,需要自行實(shí)現(xiàn)計(jì)算器。

          有了自行往JavaScript引擎中注入的想法,接下來就是分析可行性。

          大部分是JavaScript引擎是使用C++編寫,如果自己的程序使用的是C++可以很方便的進(jìn)行注入,如果是OC,可以使用OC和C++混編的形式。

          其他語言怎么破?

          要在一門靜態(tài)語言上與動(dòng)態(tài)語言JavaScript相互調(diào)用,最便捷的方式是找到一個(gè)這門語言實(shí)現(xiàn)的JavaScript引擎(開源),直接進(jìn)行集成,注入。如果沒有,則需要使用多一層橋接,把這門語言的接口暴露給C++,再由C++實(shí)現(xiàn)的JavaScript引擎將接口注入供JavaScript使用。

          服務(wù)端集成思路&實(shí)踐:

          nodeJS中的橋接

          我們都知道nodeJS,但是nodeJS的運(yùn)行依賴于Google的V8 引擎,V8是C++實(shí)現(xiàn),底層使用C++實(shí)現(xiàn)底層功能,比如網(wǎng)絡(luò),數(shù)據(jù)庫IO,對(duì)外暴露一個(gè)構(gòu)造器接口注入到上下文中,注意此處暴露的只是一個(gè)構(gòu)造器接口而不是一個(gè)創(chuàng)建完的實(shí)例。然后實(shí)現(xiàn)了一個(gè)require的hook函數(shù)。當(dāng)使用require加載一個(gè)JS模塊時(shí),跟網(wǎng)頁中使用AMD 的require并無異樣,當(dāng)使用require加載系統(tǒng)庫,既是C++的模塊時(shí),會(huì)調(diào)用暴露出來的構(gòu)造器接口,得到一個(gè)實(shí)例對(duì)象。不管是裝載JS模塊還是裝載C++模塊,得到的都可以看做是一個(gè)Module Object,node會(huì)將裝載完的模塊緩存到binding_cache中,下次在別處的代碼中使用require裝載模塊時(shí),就會(huì)先去binding_cache中查找,如果找到了則返回該module object,如果沒找到再執(zhí)行上面的裝載流程。

          這就是node的基本原理:C++封裝底層操作,通過V8注入,使得JS腳本有網(wǎng)絡(luò)和IO能力

          基于Spring的橋接

          以上說到的幾個(gè)都是C++層面的應(yīng)用,那么經(jīng)典的Java怎么玩?是不是Java就必須是靜態(tài)語言的玩法,沒有辦法像C++之類的,可以使用JS的動(dòng)態(tài)特性?

          當(dāng)然不是。這個(gè)時(shí)候,我們需要說起前面介紹過的一個(gè)JS引擎 Rhino,Rhino是完全由Java編寫,可想而知,Rhino幾乎就是為Java應(yīng)用而生的。

          用法是這樣:

          1. 首先在我們的Java應(yīng)用中集成Rhino;

          2. 所有的IO操作,網(wǎng)絡(luò)操作等,都封裝成service,并提供增刪改查,setter && getter等多種方法

          3. 通過spring,把這些service bean注入到Rhino中;

          4. 把業(yè)務(wù)邏輯寫到JS代碼中,JS代碼調(diào)用多個(gè)已注入的Java service處理業(yè)務(wù)邏輯,拼裝數(shù)據(jù)返回!

          好處:修改業(yè)務(wù)邏輯不需要修改Java代碼,也就是不需要重新編譯和部署,只需要刷新下跑在Rhino中的JS代碼即可。以往Java應(yīng)用的一個(gè)痛點(diǎn)是部署,需要重新編譯,打包,部署重啟服務(wù)器,現(xiàn)在以這種形式開發(fā),可以達(dá)到服務(wù)端的熱更新和熱部署。既可以享有Java服務(wù)的穩(wěn)定性和可靠性,又可以享有JS的靈活性。

          這種技術(shù)和用法在差不多十年前就有過,前EMC的工程師基于EMC著名的商業(yè)產(chǎn)品Documentum,設(shè)計(jì)了一套Java開源的中小企業(yè)CMS系統(tǒng)Alfresco,在該系統(tǒng)中實(shí)現(xiàn)了這種技術(shù),這種技術(shù)基于spring,叫做spring-surf,做了一個(gè)膠水層??梢钥醋鲂∈昵暗膎ode吧。

          Demo,使用spring-surf框架的系統(tǒng)中一個(gè)webscript模塊

          1. categorynode.get.xml定義URL攔截器和權(quán)限控制;

          2. .get指明是處理GET請(qǐng)求,RESTful;

          3. 在categorynode.get.js中調(diào)用已注入的Java Bean處理業(yè)務(wù)邏輯;

          4. 若為網(wǎng)頁請(qǐng)求返回.html.ftl,若為Ajax,返回.json.ftl;

          (此處配套使用的是FreeMarker模板引擎)

          ==> categorynode.get.desc.xml

          ==> categorynode.get.js

          ==> categorynode.get.html.ftl

          ==> categorynode.get.json.ftl

          移動(dòng)端集成思路&實(shí)踐:

          React Native中的橋接

          React Native目前也是異?;鸨?,RN程序的運(yùn)行依賴于Facebook的RN框架。在iOS、Android的模擬器或是真機(jī)上,React Native使用的是JavaScriptCore引擎,也就是Safari所使用的JavaScript引擎。但是在iOS上JavaScriptCore并沒有使用即時(shí)編譯技術(shù)(JIT),因?yàn)樵趇OS中應(yīng)用無權(quán)擁有可寫可執(zhí)行的內(nèi)存頁(因而無法動(dòng)態(tài)生成代碼),在安卓上,理論上是可以使用的。JavaScriptCore引擎也是使用C++編寫,在iOS和安卓中,JavaScriptCore都做了一層封裝,可以無須關(guān)心引擎和系統(tǒng)橋接的那一層。iOS/Android系統(tǒng)通過JavaScriptCore引擎將定制好的各種原生組件注入,如:listview,text等。

          Cocos2d-JS中的橋接

          cocos2dx是游戲開發(fā)中非常常用的游戲渲染引擎,有一系列的產(chǎn)品,如:cocos2dx(C++),cocos2d-lua(lua), cocos2d-js(JavaScript)等多個(gè)產(chǎn)品。其中最新退出的是cocos2dx的JS版本的cocos2d-js,編寫游戲渲染特效代碼相比于C++和lua非常方便。對(duì)于做需要經(jīng)常更新的渲染場(chǎng)景,C++是靜態(tài)語言,每次修改都需要重新編譯才能運(yùn)行,顯然是不合適的。自然也就想到了腳本語言,lua和js,兩者有些類似,都是動(dòng)態(tài)語言,只需要集成一個(gè)運(yùn)行引擎,提供一個(gè)運(yùn)行的容器即可運(yùn)行,同時(shí)通過引擎注入底層方法供腳本調(diào)用即可。lua好處是精簡,語法精簡,引擎頁很小很精簡,所以不可避免的代碼量會(huì)比js多,同時(shí)學(xué)習(xí)成本比較高。js的好處是有ECMAScrtpt的核心,語法比較豐富,同時(shí)有支持一些高級(jí)屬性。在cocos2d-js中,cocos2dx(C++)集成了SpiderMonkey(C++)作為JS運(yùn)行引擎,中間做了一個(gè)膠水層既是JS Binding,通過引擎注入了一個(gè)cc的全局對(duì)象,映射的是底層C++的一個(gè)單例C++實(shí)例。表面上寫的是JS代碼,實(shí)際上操作的是底層的C++。cocos2d-js是代碼可以運(yùn)行在多種環(huán)境中,當(dāng)運(yùn)行的網(wǎng)頁環(huán)境中時(shí),使用的是cocos2d-html5引擎,底層操作的是canvas;當(dāng)運(yùn)行在客戶端上時(shí),使用的是cocos2dx引擎,底層操作的是C++,再由C++去操控openGL做繪制和渲染。提供相同的API,對(duì)開發(fā)者幾乎是透明無差異的,開發(fā)者只需要關(guān)注實(shí)現(xiàn)效果即可。達(dá)到一套代碼,多端運(yùn)行(網(wǎng)頁端,客戶端)。

          JSPatch技術(shù)中的橋接

          JSPatch是目前比較流行的iOS上的熱修復(fù)技術(shù),JSPatch 能做到通過 JS 調(diào)用和改寫 OC 方法最根本的原因是 Objective-C 是動(dòng)態(tài)語言,OC 上所有方法的調(diào)用/類的生成都通過 Objective-C Runtime 在運(yùn)行時(shí)進(jìn)行,我們可以通過類名/方法名反射得到相應(yīng)的類和方法。JSPatch 的基本原理就是:JS 傳遞字符串給 OC,OC 通過 Runtime 接口調(diào)用和替換 OC 方法。

          關(guān)鍵技術(shù)之一是 JS 和 OC 之間的消息互傳。JSPatch里包含了,一個(gè)JS引擎JavaScriptCore(Safari,React Native用的同款)。用到了 JavaScriptCore 的接口,OC 端在啟動(dòng) JSPatch 引擎時(shí)會(huì)創(chuàng)建一個(gè) JSContext 實(shí)例,JSContext 是 JS 代碼的執(zhí)行環(huán)境,可以給 JSContext 添加方法,JS 就可以直接調(diào)用這個(gè)方法。本質(zhì)上就是通過JavaScriptCore引擎注入,暴露OC的方法供JS調(diào)用來實(shí)現(xiàn)動(dòng)態(tài)修改OC的反射。

          Demo,iOS熱更新,熱修復(fù):

          1. 集成JavaScriptCore引擎;

          2. 通過引擎,橋接JS和OC;

          3. 通過JS修改OC反射。

          詳細(xì)的JSPatch技術(shù)介紹請(qǐng)移步:https://github.com/bang590/JSPatch/wiki

          關(guān)于JavaScript引擎:

          在iOS 或 android 上能夠運(yùn)行的JavaScript 引擎有4個(gè):JavaScriptCore,SpiderMonkey,V8,Rhino。下面這個(gè)表格展示各個(gè)引擎在iOS 和 Android 的兼容性。

          因?yàn)閕OS平臺(tái)不支持JIT即時(shí)編譯,而V8只有JIT模式,所以V8無法在iOS平臺(tái)使用(越獄設(shè)備除外,想體驗(yàn)iOS JIT的同學(xué)可以自行越獄)。

          所以,目前可以做到橫跨iOS和Android雙平臺(tái)的JS引擎,只有兩款,即是SpiderMonkey和JavaScriptCore。

          JavaScript引擎會(huì)受很多東西影響,比如交叉編譯器的版本、引擎的版本和操作系統(tǒng)的種類等。

          至于如何選擇,可以參考:《Part I: How to Choose a JavaScript Engine for iOS and Android Development》

          至此,JavaScript從立足于前端,到征戰(zhàn)全端的逆襲之路,可以總結(jié)為“攜引擎以令天下”。

          不足之處,還請(qǐng)各位看官輕拍~

          參考文章:

          bang590/JSPatch中問參考文檔

          Cocos2d-JS | Cocos2d-x官方參考文檔

          Alfresco官方參考文檔

          《Browser Wars: The End or Just the Beginning?》

          《Part I: How to Choose a JavaScript Engine for iOS and Android Development》

          《React Native 從入門到源碼》

          eact Native (簡稱RN)是Facebook于2015年4月開源的跨平臺(tái)移動(dòng)應(yīng)用開發(fā)框架,是Facebook早先開源的UI框架 React 在原生移動(dòng)應(yīng)用平臺(tái)的衍生產(chǎn)物,目前支持iOS和安卓兩大平臺(tái)。RN使用Javascript語言,類似于HTML的JSX,以及CSS來開發(fā)移動(dòng)應(yīng)用,因此熟悉Web前端開發(fā)的技術(shù)人員只需很少的學(xué)習(xí)就可以進(jìn)入移動(dòng)應(yīng)用開發(fā)領(lǐng)域。

          React Native使你能夠在Javascript和React的基礎(chǔ)上獲得完全一致的開發(fā)體驗(yàn),構(gòu)建世界一流的原生APP。

          React Native著力于提高多平臺(tái)開發(fā)的開發(fā)效率 —— 僅需學(xué)習(xí)一次,編寫任何平臺(tái)。(Learn once, write anywhere)

          Facebook已經(jīng)在多項(xiàng)產(chǎn)品中使用了React Native,并且將持續(xù)地投入建設(shè)React Native。

          React Native主要特性如下:

          • 原生的iOS組件

          React Native主張“Learn once, write everywhere”而非其他跨平臺(tái)工具一直宣揚(yáng)的“Write once, run everywhere”。通過React Native,開發(fā)者可以使用UITabBar、UINavigationController等標(biāo)準(zhǔn)的iOS平臺(tái)組件,讓應(yīng)用界面在其他平臺(tái)上亦能保持始終如一的外觀、風(fēng)格。

          • 異步執(zhí)行

          JavaScript應(yīng)用代碼和原生平臺(tái)之間所有的操作都采用異步執(zhí)行模式,原生模塊使用額外線程,開發(fā)者可以解碼主線程圖像、后臺(tái)保存至磁盤、無須顧忌UI等諸多因素直接度量文本設(shè)計(jì)布局。

          • 觸摸處理

          React Native引入了一個(gè)類似于iOS上Responder Chain響應(yīng)鏈?zhǔn)录幚頇C(jī)制的響應(yīng)體系,并基于此為開發(fā)者提供了諸如TouchableHighlight等更高級(jí)的組件。

          需要的小伙伴可以私聊我,發(fā)送關(guān)鍵字‘RN資料’即可

          017 年 1 月 9 日,微信小程序正式發(fā)布。在近一年里,不管外界評(píng)價(jià)如何,小程序一直在堅(jiān)定的向前走。同時(shí)它的理念和模式受到廣泛認(rèn)可,也被其它公司所模仿。

          在微信小程序尚在內(nèi)測(cè)之時(shí),外界對(duì)它所采用的技術(shù)就有很多猜測(cè),正式發(fā)布的小程序解答了人們的一些疑惑,但有些問題官方并未正式對(duì)外公開說過。在即將于 10 月 17 日舉辦的 QCon 上海 2017 大會(huì)上, 微信小程序相關(guān)項(xiàng)目負(fù)責(zé)人王躍將向大家分享小程序的核心架構(gòu)及實(shí)戰(zhàn)案例,我們也對(duì)他進(jìn)行了采訪,提前了解了一些我們關(guān)心的問題。

          受訪嘉賓介紹

          王躍(微信號(hào):springwang),微信小程序相關(guān)項(xiàng)目負(fù)責(zé)人,擁有 10+ 年前端開發(fā)經(jīng)驗(yàn),曾就職于搜狐和新浪,2013 年加入騰訊,負(fù)責(zé)互娛游戲營銷系統(tǒng),道聚城等多個(gè)項(xiàng)目前端架構(gòu)和開發(fā)。對(duì)小程序底層架構(gòu)原理有深入的研究和理解,并且有騰訊多款小程序開發(fā)實(shí)戰(zhàn)經(jīng)驗(yàn)。

          Q:王老師好,您在負(fù)責(zé)小程序前端之前,做過哪些事情?

          王躍:在微信小程序項(xiàng)目之前,我負(fù)責(zé)過騰訊互娛游戲高級(jí)營銷系統(tǒng)的前端架構(gòu)和開發(fā),它承載騰訊幾百款游戲業(yè)務(wù)的日常營銷活動(dòng),另外還有騰訊道聚城前端架構(gòu)和開發(fā),覆蓋像王者榮耀,LOL,CF 游戲道具的交易,在騰訊之前我還負(fù)責(zé)過搜狐白社會(huì) SNS 的前端核心框架和模塊開發(fā),新浪微博的前端開發(fā)工作。

          Q:當(dāng)時(shí)小程序還沒發(fā)布時(shí),坊間傳說小程序使用了類似 RN 的技術(shù),發(fā)布后人們發(fā)現(xiàn)它還是運(yùn)行在 WebView 里的,不知道實(shí)際情況如何?

          王躍:從技術(shù)實(shí)現(xiàn)的層面來說,不管是小程序,還是 RN,或者 Weex,都有共同點(diǎn),比如 JS 和 Native 的通訊機(jī)制,比如 JS 直接調(diào)用原生組件的渲染,如在 iOS 平臺(tái),小程序和 RN 都采用 JavaScriptCore 來執(zhí)行 JS。但是小程序和 RN 設(shè)計(jì)初衷和應(yīng)對(duì)的場(chǎng)景不一樣,我們知道小程序的場(chǎng)景主要是在當(dāng)前實(shí)際物理場(chǎng)景用戶可以即掃即用,用完即走,整個(gè)交互都是非常輕量級(jí)的,不涉及特別復(fù)雜的交互邏輯,所以在設(shè)計(jì)上考慮盡量簡單,首先是系統(tǒng)底層框架簡單,其次開發(fā)者開發(fā)簡單,再次用戶使用簡單,所以小程序大部分的 UI 組件還是 H5 的渲染方式,而不是像 RN 設(shè)計(jì)成 Native 的 UI 組件。

          當(dāng)然小程序本身為了解決部分組件性能的問題也采用了 Native 的方式,所以方案上的選項(xiàng)主要是基于實(shí)際場(chǎng)景考慮,不是純技術(shù)上的考量。

          另外準(zhǔn)確的說小程序不僅僅運(yùn)行在 Webview 里,需要區(qū)分不同的部分,這個(gè)在我的分享里會(huì)有詳細(xì)的解釋。

          Q:在 Android 上小程序是運(yùn)行在 X5 引擎上的,X5 團(tuán)隊(duì)有為小程序做一些特別的優(yōu)化,或者添加特性嗎?

          王躍:微信Android版的瀏覽服務(wù)用的確實(shí)是我們騰訊瀏覽器團(tuán)隊(duì)提供的X5引擎,在性能方面小程序和X5團(tuán)隊(duì)之間一直有保持溝通和協(xié)調(diào),雙方都盡可能設(shè)法優(yōu)化并持續(xù)提升用戶體驗(yàn)。

          Q:剛發(fā)布時(shí)有人發(fā)現(xiàn)小程序的一些代碼和 Vue 的有點(diǎn)像,而單向數(shù)據(jù)流又讓人聯(lián)想到 React,在當(dāng)初開發(fā)小程序核心框架的時(shí)候有哪些思考?

          王躍:這個(gè)跟問題 2 類似,首先小程序和 Vue,React 本質(zhì)上還是不一樣的,小程序是需要特定的 Native 層支持,同時(shí)底層功能也更強(qiáng)大,而 Vue 和 React 運(yùn)行在通用的 WebView 之上,不需要特定 Native 支持,但大家為什么覺得會(huì)有些類似呢,主要是指在數(shù)據(jù)綁定,事件綁定等部分的實(shí)現(xiàn)上會(huì)有一些類似,當(dāng)然這幾種技術(shù)沒有好壞,主要還是看我們是解決什么場(chǎng)景下的什么問題。

          Q:iOS 和 Android 平臺(tái)的小程序有一些區(qū)別,比如 Android 上可以把小程序圖標(biāo)放到主屏,還有人發(fā)現(xiàn)微信小程序在 Android 下有單獨(dú)的進(jìn)程,小程序是不是對(duì) Android 進(jìn)行過更多 Native 化的探索?

          王躍:Android 可以放到主屏幕而 iOS 不行這個(gè)主要是 OS 層面的限制,至于 Android 下的運(yùn)行方式,主要是通過單獨(dú)的 Activity 來承載視圖,設(shè)置為單獨(dú)的進(jìn)程主要是為了保證小程序的運(yùn)行內(nèi)存,跟 Native 化沒有直接的聯(lián)系。

          前面問題也提到了,小程序本身已經(jīng)有好幾個(gè)組件是使用 Native 方式實(shí)現(xiàn)的,主要目的還是為了保證小程序的執(zhí)行效率,達(dá)到更好的用戶體驗(yàn),Native 的組件也不是針對(duì) Android 一個(gè)平臺(tái),Android 和 iOS 都有做,后續(xù)是否會(huì)有更多的 Native 化的實(shí)現(xiàn),還是看實(shí)際組件在采用 Web 實(shí)現(xiàn)時(shí)是否符合我們對(duì)用戶體驗(yàn)的標(biāo)準(zhǔn)。

          Q:前段時(shí)間有人發(fā)現(xiàn)小程序出了自己的腳本格式 WXS,它是小程序新的 DSL 嗎?

          王躍:目前,WXS對(duì)于小程序開發(fā)不是必須的,它的主要目的是為了增強(qiáng)WXML的數(shù)據(jù)處理能力而新引入一種技術(shù)實(shí)現(xiàn),其實(shí)際解析的語言規(guī)范還是JS,并沒有引入新的語法,僅僅對(duì)JS做了上層的封裝和限制,所以學(xué)習(xí)上基本沒什么成本,大致了解下開發(fā)文檔馬上就能上手,這里WXS跟DSL也沒太大關(guān)系,沒有可對(duì)比性。

          Q:小程序和 PWA 可以說代表著移動(dòng) Web 的兩條不同的發(fā)展路線,從旁人的眼光來看,小程序更加務(wù)實(shí),但人們也期待小程序更加開放一些。在這方面您是怎么看的?

          王躍:這里我說下個(gè)人的想法,不代表官方意見,任何一種模式都是為了在特定環(huán)境下解決特定問題而設(shè)計(jì)的,所以 PWA 有它的應(yīng)用場(chǎng)景,而小程序有小程序的應(yīng)用場(chǎng)景,兩種模式都有其優(yōu)勢(shì)和限制,這兩種模式的差異其實(shí)跟我們現(xiàn)在的 Web 和 Native 很像,Web 提供相對(duì)常用和通用的功能(大部分功能和基本使用體驗(yàn)),而個(gè)性定制(更流程復(fù)雜的功能和交互體驗(yàn))可以充分發(fā)揮當(dāng)前平臺(tái)的能力,我個(gè)人覺得這兩種模式都會(huì)一直存在,關(guān)鍵是看能否為用戶提供價(jià)值,不過,未來這兩種模式一定會(huì)有越來越多的融合,就像 web 和 Native 的融合產(chǎn)生了 Hybird 模式一樣,想象一下,未來一定會(huì)有一種新的模式,可以像 PWA 一樣具有更通用的運(yùn)行場(chǎng)景(提供核心功能),同時(shí)又可以根據(jù)當(dāng)前的運(yùn)行環(huán)境接入定制化的高級(jí)能力,實(shí)現(xiàn) Write Once,Run Anywhere 的美好愿景。

          活動(dòng)推薦:

          Google 如何用 AI 造聊天機(jī)器人?Pinterest 如何用機(jī)器學(xué)習(xí)獲得兩億活躍用戶?10 月 QCon 上海站,還有來自 Uber、Paypal、LinkedIn、Airbnb 等頂尖技術(shù)專家前來分享前沿實(shí)踐經(jīng)驗(yàn)。

          QCon 報(bào)名即將結(jié)束,識(shí)別下方二維碼或點(diǎn)擊【閱讀原文】與 100+ 國內(nèi)外技術(shù)大咖零距離,如有問題歡迎聯(lián)系票務(wù)經(jīng)理 Hanna ,電話:15110019061,微信:qcon-0410。


          主站蜘蛛池模板: 精品久久久久一区二区三区| 中文字幕一区二区人妻| 不卡一区二区在线| 一区二区三区福利视频免费观看| 亚洲综合一区国产精品| 中文字幕一区二区三区四区| 亚洲AV成人精品日韩一区| 伊人久久大香线蕉av一区| 动漫精品一区二区三区3d| 亚洲码欧美码一区二区三区| 午夜福利一区二区三区在线观看| 爆乳熟妇一区二区三区| 日本一区视频在线播放| 久久精品日韩一区国产二区| 精品国产鲁一鲁一区二区| 人妻无码视频一区二区三区| 另类免费视频一区二区在线观看| 亚洲国产综合无码一区二区二三区 | 国产成人精品a视频一区| 日本一区中文字幕日本一二三区视频| 2020天堂中文字幕一区在线观 | 久久se精品一区二区| 国产精品被窝福利一区| www亚洲精品少妇裸乳一区二区| 国产人妖视频一区在线观看| 国产在线一区二区三区av| 国产精品一区二区在线观看| 动漫精品第一区二区三区| 精品国产一区二区三区久久狼| eeuss鲁片一区二区三区| 无码人妻精一区二区三区| 日韩视频一区二区在线观看| 四虎永久在线精品免费一区二区| 亚洲福利视频一区二区| 日本精品一区二区三区在线观看| 亚洲AV综合色区无码一区| tom影院亚洲国产一区二区| 九九无码人妻一区二区三区| 亚洲Av高清一区二区三区| 国产一区二区三区在线视頻| 久久久无码一区二区三区|