javascript 最常應(yīng)用的場(chǎng)合是 Web 頁(yè)面,因此,與WEB開(kāi)發(fā)相關(guān)的知識(shí),最好要有所了解。
優(yōu)先級(jí)高的相關(guān)知識(shí):
1. HTML,這是基本,最好自己能用 記事本 寫(xiě)一些靜態(tài)的html,來(lái)加深印象。
2. DHTML,這是 javascript 編程所要遇到的宿主對(duì)象,你要對(duì)這個(gè)對(duì)象進(jìn)行訪問(wèn)或控制。(加點(diǎn)說(shuō)明吧,javascript不單能運(yùn)行在如IE之類(lèi)的瀏覽器上,也可以直接在操作系統(tǒng)上運(yùn)行,還可以在WEB服務(wù)器上運(yùn)行,還可以在。。。,這運(yùn)行的平臺(tái)就是宿主,每個(gè)宿主有自己的對(duì)象。)
3. CSS,樣式,這也是必須的。
4. 后臺(tái)編程語(yǔ)言,特別是一些輸出標(biāo)簽,這樣,和后臺(tái)工程師合作就會(huì)順利得多。
5. 美工,這個(gè)不是很重要。
6. XML,數(shù)據(jù)庫(kù)。這些最好也要有所了解。
7. Flash,了解如何進(jìn)行通訊就可,不一定用得上。
8. js framwork,網(wǎng)上當(dāng)前比較流行的javascript框架,如yahoo yui, jquery, prototype。.有很多,大致了解幾種,用時(shí)再細(xì)學(xué),對(duì)于應(yīng)用來(lái)說(shuō),有個(gè)大概就行了。
9. 調(diào)試開(kāi)發(fā)工具, 有 eclipse,也有其它專(zhuān)用的,還有 firebug,一個(gè)很有名的瀏覽器(Firefox, google chorm)插件,IE下么有個(gè) devlopment tool,嗯,英文不好,拼錯(cuò)了別怪。
1.按APP的打包與發(fā)布方式來(lái)分類(lèi),APP分為三類(lèi):
需要安裝的APP,Native App、Hybird App、React App都屬于這一類(lèi),發(fā)布時(shí)需要將App打包成可執(zhí)行程序,然后掛到市場(chǎng)或者網(wǎng)站上,讓用戶(hù)下載安裝后才能運(yùn)行,其功能受限于平臺(tái)API與權(quán)限,但也可以通過(guò)一些技巧越過(guò)平臺(tái)API與權(quán)限限制,比如Hook技術(shù)。
不需要安裝的APP,Web App,其實(shí)本質(zhì)上就是個(gè)網(wǎng)站,只是做成了和手機(jī)APP相仿的樣子,發(fā)布方式與網(wǎng)站發(fā)布相同,用戶(hù)可以通過(guò)瀏覽器或者微信之類(lèi)的工具去加載這個(gè)網(wǎng)站,其功能相對(duì)于手機(jī),受限于瀏覽器引擎提供對(duì)手機(jī)本地服務(wù)(文件、相機(jī)等等)訪問(wèn)的JS接口,通常功能非常少,所以限制較大。
需要用戶(hù)已經(jīng)安裝某個(gè)第三方APP,然后跑在第三方APP上的APP,這類(lèi)技術(shù)安卓上較多(典型的Python程序可以跑在PythonOnAndroid APP上,或者Ruby解釋器可以跑Ruby程序),而iOS由于有對(duì)這類(lèi)行為做出過(guò)明確限制,上架審核規(guī)則里有明確指出,不準(zhǔn)APP可以下載源代碼從而擴(kuò)展功能,所以iOS上過(guò)去并不存在這樣的APP。
2.針對(duì)需要安裝的APP,APP開(kāi)發(fā)技術(shù)有如下分類(lèi)
基于官方推薦與支持的語(yǔ)言與框架開(kāi)發(fā)的App,安卓目前官方推薦的是Java、Kotlin與C/C++進(jìn)行開(kāi)發(fā),iOS目前官方推薦的是Objective-C、Swift與C/C++
基于一些第三方支持的語(yǔ)言和框架開(kāi)發(fā)的App,這類(lèi)大多是由一些互聯(lián)網(wǎng)巨頭與開(kāi)源組織維護(hù)的,典型的技術(shù)有:
Qt(知名的跨平臺(tái)GUI框架,基于C++,現(xiàn)在隨諾基亞倒臺(tái)被Digia收購(gòu)與商業(yè)化),可以用來(lái)開(kāi)發(fā)安卓和iOS,但問(wèn)題是我有了Java和OC,為啥還要去用Qt C++,是因?yàn)樘e或者覺(jué)得BUG不夠多嗎。
Mono,微軟.NET框架的開(kāi)源山寨版,與.NET兼容程度很高,一般使用C#開(kāi)發(fā),可以用來(lái)開(kāi)發(fā)安卓和iOS,性能不佳,C#的開(kāi)發(fā)效率也沒(méi)比Java和OC高到哪去,還要面對(duì)沒(méi)有官方支持的一堆坑,用他得靠信仰
Node.js,可以使用JS開(kāi)發(fā)然后編譯成Native程序,可以用來(lái)開(kāi)發(fā)安卓和iOS,但和大部分JS的東西一樣,你懂的,JS是一種宗教
Go,Google的高并發(fā)系統(tǒng)級(jí)語(yǔ)言,原目標(biāo)是用來(lái)替換C,但似乎并不是很美,新的語(yǔ)法似乎還不如老的C,看個(gè)人喜好吧,目前有一些第三方寫(xiě)的Android框架,iOS不清楚,沒(méi)官方支持
Erlang、Ruby、Python,只要能編譯二進(jìn)制程序的框架理論上都能支持安卓和iOS,當(dāng)然大多不靠譜,有病的可以試一下。
在 App 混合開(kāi)發(fā)中,app 層向 js 層提供接口有兩種方式,一種是同步接口,一種一異步接口(不清楚什么是同步的請(qǐng)看這里的討論)。
為了保證 web 流暢,大部分時(shí)候,我們應(yīng)該使用異步接口,但是某些情況下,我們可能更需要同步接口。同步接口的好處在于,首先 js 可以通過(guò)返回值得到執(zhí)行結(jié)果;其次,在混合式開(kāi)發(fā)中,app 層導(dǎo)出的某些 api 按照語(yǔ)義就應(yīng)該是同步的,否則會(huì)很奇怪——一個(gè)可能在 for 循環(huán)中使用的,執(zhí)行非??斓慕涌?,比如讀寫(xiě)某個(gè)配置項(xiàng),設(shè)計(jì)成異步會(huì)很奇怪。
那么如何向 js 層導(dǎo)出同步接口呢?我們知道,在 Android 框架中,通過(guò) WebView.() 這個(gè)函數(shù),可以將 java 接口導(dǎo)出到 js 層,并且這樣導(dǎo)出的接口是同步接口。但是在 iOS 的 Cocoa 框架中,想導(dǎo)出同步接口卻不容易,究其原因,是因?yàn)?UIWebView 和 WKWebView 沒(méi)有 這樣的功能。
同時(shí),Android 這個(gè)功能爆出過(guò)安全漏洞,那么,我們有沒(méi)有別的方式實(shí)現(xiàn)同步調(diào)用呢?我們以 iOS UIWebView 為例提供一種實(shí)現(xiàn),WKWebView 和 Android 也可以參考。為了找到問(wèn)題的關(guān)鍵,我們看一下 iOS 中實(shí)現(xiàn) js 調(diào)用 app 的通行方法:首先,自定義 UIWebViewDelegate,在函數(shù) :navigationType: 中攔截請(qǐng)求。
- (BOOL) webView:(UIWebView* _Nonnull):(NSURLRequest* _Nonnull)requestnavigationType:()navigationType {if ([request.HTTPMethod compare:@"GET" options:] != NSOrderedSame) {// 不處理非 get 請(qǐng)求return YES;}NSURL* url = request.URL;if ([url.scheme isEqualToString:@'YourCustomProtocol']) {return [self onMyRequest:request];}return YES;}這種做法實(shí)質(zhì)上就是將函數(shù)調(diào)用命令轉(zhuǎn)化為 url,通過(guò)請(qǐng)求的方式通知 app 層,其中 onMyRequest: 是自定義的 request 響應(yīng)函數(shù)。為了發(fā)送請(qǐng)求,js 層要建立一個(gè)隱藏的 iframe 元素,每次發(fā)送請(qǐng)求時(shí)修改 iframe 元素的 src 屬性,app 即可攔截到相應(yīng)請(qǐng)求。
12345678910111213/*** js 向 native 傳遞消息* @method js_* @memberof JSToNativeIOSPolyfill* @public* @param str {String} 消息字符串,由 HybridMessage 轉(zhuǎn)換而來(lái)*/JSToNativeIOSPolyfill.prototype.js_ = function (str) {if (!this.ifr_) {this._prepareIfr();}this.ifr_.src = 'YourCustomProtocol://__message_send__?msg=' + encodeURIComponent(str); }當(dāng) app 執(zhí)行完 js 調(diào)用的功能,執(zhí)行結(jié)果無(wú)法直接返回,為了返回結(jié)果,普遍采用回調(diào)函數(shù)方式——js 層記錄一個(gè) callback,app 通過(guò) UIWebView 的 函數(shù)調(diào)用這個(gè) callback(類(lèi)似 jsonp 的機(jī)制)。注意,這樣封裝的接口,天然是異步接口。
因?yàn)?js_ 這個(gè)函數(shù)會(huì)立即返回,不會(huì)等到執(zhí)行結(jié)果發(fā)回來(lái)。所以,我們要想辦法把 js 代碼“阻塞”住。
請(qǐng)回憶一下,js 中是用什么方法能把 UI 線程代碼“阻塞”住,同時(shí)又不跑滿(mǎn) CPU?1234var async = false;var url = '網(wǎng)頁(yè) 10.requst對(duì)象方法 .獲取客戶(hù)ip地址:request.ip .獲取上傳的文件:request.files 11.啟動(dòng)腳本package.json package.json用于指定app信息,nodejs版本號(hào)和其他組件的依賴(lài)關(guān)系 { "name": "demo", "description": "my first express app", "version": "0.0.1", "dependencies": { "express": "3.x" } } 12.app入口app.js app.js主要包含文件請(qǐng)求時(shí),服務(wù)器端就到public目錄尋找這個(gè)文件 如:<link href="/bootstrap/css/bootstrap.css" rel="stylesheet">, 服務(wù)器端就到public/bootstrap/css/目錄中尋找bootstrap.css文件。
android怎樣調(diào)用js文件里面的方法
如果多個(gè)線程同時(shí)訪問(wèn)一個(gè)集合,而其中至少一個(gè)線程修改了該集合,那么它必須 保持外部同步。這通常是通過(guò)對(duì)自然封裝該集合的對(duì)象執(zhí)行同步操作來(lái)完成的。如果不存在這樣的對(duì)象,則應(yīng)該使用 Collections.synchronizedSet 方法來(lái)“包裝”集合。最好在創(chuàng)建時(shí)完成這一操作,以防止對(duì) HashSet 實(shí)例進(jìn)行意外的不同步訪問(wèn):
Set s = Collections.synchronizedSet(new HashSet(。));
Angular目前比較大, 100+K,內(nèi)嵌還勉強(qiáng),如果遠(yuǎn)端頁(yè)面就有點(diǎn)大了。
我們的應(yīng)用場(chǎng)景比較特殊,和Native交互非常多, 架構(gòu)模式也不是單頁(yè)面應(yīng)用,而是一個(gè)頁(yè)面一個(gè)WebView,所以很多angular的特性用不到。很多頁(yè)面,業(yè)務(wù)形態(tài)很簡(jiǎn)單,只是簡(jiǎn)單的展示,用angular的綁定大材小用。
不支持服務(wù)端渲染。在某些奇葩機(jī)型上, #hash識(shí)別會(huì)出問(wèn)題,導(dǎo)致WebView 404, 要hack。
優(yōu)點(diǎn):在我接手之前,整個(gè)項(xiàng)目是無(wú)架構(gòu)模式,沒(méi)有任何復(fù)用性。接手后,迅速用angular架構(gòu)起框架, 移植代碼,把底層邏輯封裝完成開(kāi)發(fā)人員業(yè)務(wù)層的代碼非常之簡(jiǎn)單,開(kāi)發(fā)效率高在這過(guò)程中, 學(xué)習(xí)了angular的很多理念,讓團(tuán)隊(duì)在AOP單元測(cè)試,組件化等方面的有不錯(cuò)的認(rèn)知。
聲明:本網(wǎng)站尊重并保護(hù)知識(shí)產(chǎn)權(quán),根據(jù)《信息網(wǎng)絡(luò)傳播權(quán)保護(hù)條例》,如果我們轉(zhuǎn)載的作品侵犯了您的權(quán)利,請(qǐng)?jiān)谝粋€(gè)月內(nèi)通知我們,我們會(huì)及時(shí)刪除。
蜀ICP備2020033479號(hào)-4 Copyright ? 2016 學(xué)習(xí)鳥(niǎo). 頁(yè)面生成時(shí)間:3.222秒