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