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