精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

mobl 針對移動(dòng)Web開發(fā)的DSL

開發(fā) 前端
mobl 是一個(gè)新的開源的編程語言,主要用于加速手機(jī)應(yīng)用的開發(fā),mobl 可方便構(gòu)建手機(jī) web 應(yīng)用程序,包括 iOS、Android 和其他支持 HTML5 技術(shù)的手機(jī)。一起來看本文。

mobl 是一個(gè)新的開源的編程語言,主要用于加速手機(jī)應(yīng)用的開發(fā),mobl 可方便構(gòu)建手機(jī) web 應(yīng)用程序,包括 iOS、Android 和其他支持 HTML5 技術(shù)的手機(jī)。下面一起來看,mobl在移動(dòng)Web開發(fā)上,作者的觀點(diǎn)。

現(xiàn)在,針對移動(dòng)設(shè)備——像智能手機(jī)和平板電腦——的應(yīng)用開發(fā)很流行。Apple公司的AppStore(針對iPhone、iPod和iPad)擁有超過350,000種應(yīng)用,而Android的marketplace也快速追趕上來,現(xiàn)在已經(jīng)擁有超過200,000種應(yīng)用。

然而,Android和iOS并非是僅有的兩種移動(dòng)平臺(tái)。BlackBerry也是有力的競爭者,此外還有Nokia。最近Microsoft發(fā)布了Windows Phone 7,HP也發(fā)布了新的WebOS設(shè)備。這樣,對于用戶來說有了多種選擇,但對我們這些開發(fā)者來說卻是個(gè)噩夢。我們應(yīng)該針對哪種平臺(tái)來開發(fā)應(yīng)用程序呢?

在移動(dòng)平臺(tái)之間共享代碼極度困難。每種平臺(tái)都選擇了自己的開發(fā)框架,還有自己的語言和API。對于iOS開發(fā),你需要使用Objective-C和CocoaTouch API;對于Android開發(fā),你要使用Java和Android API;對于Windows Phone 7,你需要使用.NET和Silverlight API。

然而,我們還是擁有一種解決方案:web開發(fā),特別是:Webkit。我們會(huì)看到,所有主要的移動(dòng)平臺(tái)供應(yīng)商(除了Microsoft之外)都在Webkit之上構(gòu)建了他們的移動(dòng)瀏覽器,而Webkit是當(dāng)前最新的、速度最快的開源瀏覽器引擎。Webkit支持多種移動(dòng)應(yīng)用所需要的HTML5 特性,包括偵測觸摸手勢(輕擊、強(qiáng)擊和縮放)、定位API(確定用戶的位置),并且支持本地?cái)?shù)據(jù)庫(瀏覽器中的SQLite數(shù)據(jù)庫,用于在本地緩存數(shù)據(jù))。

當(dāng)前,在Android、iOS、WebOS以及BlackBerry OS的六款瀏覽器中,都對這些特性提供了本地支持。對于不包含基于Webkit的瀏覽器的設(shè)備,我們還可以使用PhoneGap。PhoneGap讓我們可以使用web技術(shù)(包括HTML5)開發(fā)本地應(yīng)用程序,并把應(yīng)用程序包裝成為本地應(yīng)用程序,那樣就可以分發(fā)給用戶了(例如,通過平臺(tái)的應(yīng)用程序市場)。如果平臺(tái)還沒有內(nèi)建的WebKit瀏覽器,那么PhoneGap就會(huì)為其提供。PhoneGap應(yīng)用程序可以在六種不同的移動(dòng)平臺(tái)上運(yùn)行。

JavaScript框架廠商注意到了這是個(gè)機(jī)會(huì),于是就構(gòu)建了多種能夠在移動(dòng)web上運(yùn)行的框架。jQuery Mobile和Sencha Touch都是比較典型的例子。這些框架很容易給人留下深刻的印象,因?yàn)閷τ诋?dāng)前的開發(fā)者來說,使用它們來為移動(dòng)網(wǎng)絡(luò)開發(fā)應(yīng)用程序是一種不錯(cuò)的方式。然而,它們還都是基于JavaScript、HTML和CSS的,它們的目的都不是要開發(fā)應(yīng)用程序,而是要開發(fā)包含超鏈接文檔的網(wǎng)絡(luò)應(yīng)用。各種框架試圖對這些語言進(jìn)行調(diào)整,從而適合他們的新角色,但是這會(huì)引起你的思考,專門為開發(fā)移動(dòng)應(yīng)用程序 而設(shè)計(jì)的語言應(yīng)該是什么樣子的呢?

如果我們想要設(shè)計(jì)這樣的一種語言,需要解決什么樣的問題呢?

1、首先要解決的就是工具的支持。從事企業(yè)級(jí)開發(fā)的開發(fā)者(比方說Java和.NET的開發(fā)者)習(xí)慣使用像Eclipse之類的IDE特性,像在鍵入的時(shí)候就能夠突出顯示錯(cuò)誤、代碼自動(dòng)完成、引用解析、代碼大綱以及重構(gòu)等等。JavaScript和HTML在本質(zhì)上就是動(dòng)態(tài)的,這讓它們很強(qiáng)大,但是也讓工具廠商很難為其創(chuàng)建出Eclipse和InteliJ那種級(jí)別的IDE。對于當(dāng)前所有語言來說,良好的IDE支持都是前提條件。

2、第二個(gè)要解決的問題是簡潔。例如,用戶界面框架經(jīng)常會(huì)包含大量類似的代碼,它們的作用就是把數(shù)據(jù)從數(shù)據(jù)庫中復(fù)制到用戶界面,或者把界面上的數(shù)據(jù)復(fù)制回?cái)?shù)據(jù)庫。我們的新語言應(yīng)該減少開發(fā)者所需要編寫的樣板化代碼。

3、第三個(gè)問題是JavaScript的異步編程模型。在瀏覽器中,JavaScript是單線程的,開發(fā)者需要使用回調(diào)機(jī)制來執(zhí)行數(shù)據(jù)庫查詢之類耗費(fèi)資源的操作,比方說,我們不會(huì)編寫像下面這樣的同步代碼:

  1. var results = tx.executeQuery("SELECT * FROM User");  
  2. for(var i = 0; i < results.length; i++)  
  3. {  
  4. ...  

我們需要使用回調(diào)函數(shù)來編寫代碼:

  1. tx.executeQuery("SELECT * FROM User"function(results)  
  2. {  
  3. for(var i = 0; i < results.length; i++)   
  4. {  
  5. ...  
  6. }); 

當(dāng)在大型應(yīng)用程序中使用回調(diào)函數(shù),就會(huì)導(dǎo)致編寫出很難閱讀的意大利面式代碼。我們的新語言應(yīng)該支持對于開發(fā)者更友好的異步編程模型。

我們的研究小組(軟件工程研究小組,位于荷蘭代爾夫特理工大學(xué))專注于編程的轉(zhuǎn)換與實(shí)現(xiàn)。當(dāng)前,我們主要專注于領(lǐng)域特定語言。對于當(dāng)前移動(dòng)領(lǐng)域的開發(fā),我們覺得有一個(gè)很好的機(jī)會(huì),可以為移動(dòng)web開發(fā)出一種領(lǐng)域特定語言。我們自問:如果從頭開始的話,一門專注于開發(fā)移動(dòng)web應(yīng)用程序的語言,應(yīng)該是什么樣子的呢? 結(jié)論就是mobl。

mobl:從10,000英尺高處俯瞰

mobl是一種文本式的、靜態(tài)類型、編譯的語言,主要是通過它的Eclipse插件應(yīng)用。這個(gè)插件提供了語法高亮顯示、內(nèi)嵌的錯(cuò)誤突出顯示、引用解析以及代碼自動(dòng)完成。mobl編譯器(集成在IDE中)會(huì)在每次保存的時(shí)候把mobl模塊編譯成HTML、JavaScript和CSS的組合。mobl應(yīng)用程序不依賴于任何特定的服務(wù)端技術(shù),而只會(huì)處理應(yīng)用程序的客戶端部分。我們可以使用AJAX的方式調(diào)用(JSON)web服務(wù)。

mobl語言有大量特性,目的都是為了提高移動(dòng)開發(fā)者的生產(chǎn)率:

1.聲明式的用戶界面:使用mobl定義的用戶界面是以一種聲明式的方式指定的,并且會(huì)對應(yīng)用程序狀態(tài)的改變做出響應(yīng),這與其它方法不同,在那些方法中狀態(tài)和視圖是嚴(yán)格分離的。

2.透明的數(shù)據(jù)持久性:mobl擁有使用實(shí)體定義來定義數(shù)據(jù)模型的語言結(jié)構(gòu)。對實(shí)體對象做出的變更會(huì)自動(dòng)實(shí)體化到數(shù)據(jù)庫中。對數(shù)據(jù)的查詢也是在實(shí)體級(jí)別完成的,而并不需要字符串嵌入式的SQL查詢,這和很多其它框架都是類似的。

3.原則上是靜態(tài)的,在需要的時(shí)候可以是動(dòng)態(tài)的:mobl語言是靜態(tài)類型的語言,支持像錯(cuò)誤突出顯示、引用解析和代碼自動(dòng)完成等IDE特性。盡管如此,正如類型推論所說,在很多情況下我們不需要顯式指定類型。有些情況下,動(dòng)態(tài)類型更方便,我們可以使用Dynamic類型,從而可以對Dynamic變量的屬性和方法進(jìn)行任意地訪問。

4.同步編寫腳本:我們可以在腳本語言中編寫應(yīng)用程序的邏輯,那看起來和帶有類型的JavaScript非常相似。代碼是以同步的風(fēng)格編寫的,并且會(huì)由編譯器使用持續(xù)傳遞的樣式轉(zhuǎn)換(continuation-passing style transform)將其自動(dòng)轉(zhuǎn)換為異步的JavaScript代碼。

#p#

簡單的To-do列表

為了真正了解mobl是什么樣子的,我會(huì)在這個(gè)部分演示如何實(shí)現(xiàn)一個(gè)簡單的to-do列表管理器。

首先我們要在Eclipse中創(chuàng)建一個(gè)新的mobl項(xiàng)目,這樣會(huì)得到mobl項(xiàng)目的基本框架,其中有唯一的應(yīng)用程序文件,我們把它命名為todo.mobl:

  1. application todo  
  2. import mobl::ui::generic  
  3. screen root()  
  4. {  
  5. header("todo")  

這個(gè)mobl模塊的第一行定義這是一個(gè)application模塊。mobl有三種不同類型的模塊:

1.application模塊:通常每個(gè)項(xiàng)目有一個(gè),這是應(yīng)用程序的主要入口點(diǎn)。

2.regular模塊:這是一個(gè)定義的庫,通常會(huì)由一個(gè)或者多個(gè)其他(應(yīng)用程序)模塊導(dǎo)入。

3.configuration模塊(config.mobl):定義應(yīng)用程序的配置選項(xiàng)。

application和regular模塊包含任意數(shù)量的定義:用戶界面、數(shù)據(jù)模型、樣式、web服務(wù)接口和函數(shù)等等。

首先,讓我們來使用entity定義來定義一個(gè)數(shù)據(jù)模型。實(shí)體的實(shí)例會(huì)持久化到移動(dòng)設(shè)備本身的本地?cái)?shù)據(jù)庫中。我們的to-do應(yīng)用程序只需要唯一一個(gè)實(shí)體,名稱為Task。對于每個(gè)task對象,我們都希望能夠記錄它的名稱,以及任務(wù)是否已經(jīng)完成。

  1. entity Task  
  2. {  
  3. name : String (searchable)  
  4. done : Bool  

對于每個(gè)屬性我們都會(huì)指定名稱和類型,并有選擇地加上一個(gè)或者多個(gè)注解。mobl支持兩種類型的注解:inverse注解(定義反向的關(guān)系)和searchable(在全文搜索中包含字段)。盡管這個(gè)應(yīng)用程序不需要,但我們還是可以指定多個(gè)實(shí)體以及它們之間的關(guān)系,包括一對一、一對多和多對多的關(guān)系。

接下來,我們對root屏幕進(jìn)行改寫,從而顯示我們能夠勾選和取消勾選的任務(wù)列表。在mobl中,用戶界面是用screen和control定義的。通常screen會(huì)通過組合大量control來定義實(shí)體屏幕布局。這樣,control會(huì)定義更小的用戶界面元素,像按鈕、標(biāo)簽和表格等等。此外,屏幕或者控件也能夠定義本地狀態(tài)(使用變量),并使用控件結(jié)構(gòu)來對集合進(jìn)行迭代,從而根據(jù)條件顯示用戶界面的各個(gè)部分。

下面是我們的root屏幕的最初定義(當(dāng)程序運(yùn)行時(shí)所顯示的第一個(gè)屏幕)。它使用了大量mobl::ui::generic庫中的控件,包括header(渲染出屏幕的標(biāo)題)、group(對一個(gè)或者多個(gè)item進(jìn)行分組)和checkBox。

  1. screen root() {  
  2. header("Tasks")  
  3. group {   
  4. list(t in Task.all()) {   
  5. item { checkBox(t.done, label=t.name) }  
  6. }  
  7. }  

list控件的結(jié)構(gòu)與for-each循環(huán)類似:它會(huì)遍歷一個(gè)集合,對于集合中的每個(gè)項(xiàng)目,它都會(huì)進(jìn)行渲染。checkBox與兩個(gè)Task對象屬性綁定:done和name。數(shù)據(jù)綁定會(huì)在應(yīng)用程序狀態(tài)(例如本地變量或者實(shí)體屬性)和用戶界面之間創(chuàng)造出同步的關(guān)系。例如,當(dāng)用戶選擇復(fù)選框或者取消對它的選擇時(shí),t.done的值就會(huì)據(jù)此更新。類似地,當(dāng)應(yīng)用程序的某些其他部分更新任務(wù)t的name屬性時(shí),復(fù)選框也會(huì)自動(dòng)更新它的標(biāo)簽。這被叫做反應(yīng)性編程(reactive programming),這也是根本的mobl特性之一——用戶界面會(huì)對應(yīng)用程序狀態(tài)的改變做出反應(yīng)。

最初時(shí),數(shù)據(jù)庫是空的,從而在我們的列表中不會(huì)顯示任何任務(wù)。我們怎樣才能添加任務(wù)呢? 為了這個(gè)目的,我們定義了addTask屏幕:

  1. screen addTask() {  
  2. var newTask = Task()  
  3. header("Add") {  
  4. button("Done", onclick={  
  5. add(newTask);  
  6. screen return;  
  7. })  
  8. }   
  9. group {  
  10. item { textField(newTask.name, placeholder="Task name") }  
  11. }  

使用 var結(jié)構(gòu)我們可以創(chuàng)建嵌入在特定屏幕中的狀態(tài)。在這種情況下,我們定義了變量newTask,并使用新建的Task實(shí)體實(shí)例對其進(jìn)行初始化。我們把textField控件與newTasks的name屬性綁定。當(dāng)用戶輸入完任務(wù)的名稱時(shí),他就會(huì)點(diǎn)擊顯示在應(yīng)用程序標(biāo)題處的“Done”按鈕。按鈕擁有名為onclick的參數(shù),它的值是Callback,當(dāng)事件發(fā)生的時(shí)候,就會(huì)執(zhí)行一段命令式的應(yīng)用程序邏輯。在這個(gè)特定的情況下,發(fā)生了兩件事情:

1.向數(shù)據(jù)庫添加了newTask對象。這會(huì)在后臺(tái)對Task.all()集合做出改變,使得新建的任務(wù)被自動(dòng)添加到root屏幕的list中。

2.然后用戶會(huì)返回當(dāng)初的屏幕(screen return和函數(shù)中的return類似)。

然而,盡管我們定義了root和addTask屏幕,但沒有辦法從一個(gè)屏幕跳轉(zhuǎn)到另一個(gè)。我們需要做的就是向root屏幕添加一個(gè)“Add”按鈕,它會(huì)帶我們跳轉(zhuǎn)到addTask屏幕。因此,我們需要在root中把對header控件的調(diào)用調(diào)整為下面這樣:

  1. header("Tasks") {  
  2. button("Add", onclick={ addTask(); })  

正如你所看到的,對屏幕的調(diào)用和對一般函數(shù)的調(diào)用類似,事實(shí)上,和函數(shù)一樣,屏幕也能夠返回值。

現(xiàn)在我們的應(yīng)用程序的功能已經(jīng)基本完備。我們還要添加最后一個(gè)特性:搜索。在我們的數(shù)據(jù)模型中,我們對Task的name屬性使用了(searchable)注解。利用,我們就可以使用搜索來過濾任務(wù)列表(從而更快地找到我們想要查找的任務(wù))。

我們需要把root屏幕調(diào)整為下面這樣:

  1. screen root(){    
  2. var phrase = ""   
  3. header("Tasks") {     
  4. button("Add", onclick={ addTask(); })     
  5. }     
  6. searchBox(phrase)     
  7. group {     
  8. list(t in Task.searchPrefix(phrase)) {     
  9. item { checkBox(t.done, label=t.name) }     
  10. }      
  11. } }  

 

我們向屏幕中添加了新的本地變量phrase,可以在其中存放查詢的短語。我們使用searchBox,并將其與phrase綁定。然后,我們并沒有遍歷list中的Task.all(),而是遍歷了搜索集合Task.searchPrefix(phrase)。在運(yùn)行的時(shí)候,當(dāng)我們在搜索查詢中輸入內(nèi)容時(shí),搜索結(jié)果的列表就會(huì)更新。此時(shí)用戶界面會(huì)再一次根據(jù)應(yīng)用程序的狀態(tài)(這種情況下是phrase變量)自動(dòng)調(diào)整。

現(xiàn)在我們已經(jīng)完成了包含搜索功能的基本to-do列表應(yīng)用程序的構(gòu)建工作,接下來可以部署了。當(dāng)我們保存mobl模塊的時(shí)候,同時(shí)也會(huì)把它們編譯成JavaScript、HTML和CSS,這些文件位于Eclipse項(xiàng)目的www/目錄下。我們可以把這些生成的文件部署到任意一個(gè)能夠?yàn)殪o態(tài)文件提供服務(wù)的web服務(wù)器上(例如:Apache、IIS或者Tomcat),mobl完全不需要后端程序。

To-do列表之外

當(dāng)然,to-do列表只是個(gè)玩具一樣的例子,它只使用了一些簡單的控件,像group、item、button和textField。mobl的標(biāo)準(zhǔn)庫還提供了一些高級(jí)的控件,像標(biāo)簽組、主從視圖、上下文菜單以及可擴(kuò)展的列表等等。

除了定義用戶界面、數(shù)據(jù)模型以及應(yīng)用程序邏輯的語言結(jié)構(gòu)之外,mobl還擁有以下結(jié)構(gòu):

1、定義樣式,在此它使用一種與CSS非常類似的語言。

2、對Web服務(wù)的訪問。從服務(wù)器拉入數(shù)據(jù)并緩存在本地。在將來,mobl還會(huì)支持透明的數(shù)據(jù)同步。
想要了解這些特性,你可以查看mobl站點(diǎn)上的教程。

使用DSL還是不使用DSL

我們可以把mobl描述為一種領(lǐng)域特定語言(DSL),也就是一種針對特定應(yīng)用程序領(lǐng)域的語言。在傳統(tǒng)上,DSL的領(lǐng)域很有限。例如,HTML是一種定義結(jié)構(gòu)化web頁面的DSL。SQL是用來解釋數(shù)據(jù)庫查詢的DSL。移動(dòng)應(yīng)用程序的領(lǐng)域比上述要大得多。事實(shí)上,它非常大,以至于需要大量你通常只能在一般目的的語言或者GPL——像Java、Python和Ruby——中才能夠找到的特性。這些典型的GPL特性包括面向?qū)ο缶幊獭f指令和for循環(huán)等等。既然mobl擁有GPL特性,那么它還是一種DSL嗎?

我們覺得是,因?yàn)樗鼡碛姓Z言結(jié)構(gòu),這些結(jié)構(gòu)都特別地適合數(shù)據(jù)驅(qū)動(dòng)的移動(dòng)web應(yīng)用程序領(lǐng)域。例如,如果我們使用一種帶有樣式支持的一般目的語言,編寫的是用于處理科學(xué)計(jì)算的程序,那么就不太合理了。而把screen結(jié)構(gòu)應(yīng)用于服務(wù)端計(jì)算也不是很合理。像實(shí)體、屏幕、控件、樣式以及web服務(wù)等語言特性并不針對一般目的——它們都是針對特定領(lǐng)域的。

mobl不僅僅是針對移動(dòng)開發(fā)的DSL。類似的還包括Applause和由此衍生的Applitude。然而,這些DSL的靈活性都有限。它們都擁有一系列的內(nèi)建控件、內(nèi)建函數(shù),一旦這些都無法滿足你的需求,你就需要重新使用Objective-C或者Java來編碼了。mobl的目標(biāo)就是,既要靈活,又要具備較強(qiáng)的表達(dá)能力。

為了達(dá)到這個(gè)目的,我們讓這門語言盡可能小,并且通過使用mobl本身編寫庫來增加功能。例如,我們用來構(gòu)建to-do列表應(yīng)用程序的控件都沒有內(nèi)建在語言之中。相反,它們都是從mobl庫導(dǎo)入的,而這個(gè)庫本身又是使用mobl定義的。在最低層級(jí)上,對控件的實(shí)現(xiàn)使用了低級(jí)的HTML標(biāo)簽和CSS樣式。一般用戶只會(huì)使用高級(jí)別的概念控件,像標(biāo)題或者按鈕等等,而專家級(jí)的開發(fā)者能夠通過調(diào)整庫中的底層HTML代碼來精確地設(shè)計(jì)按鈕的顯示樣式。

mobl除了能夠在庫中定義控件之外,它還擁有暴露了大量HTML5 API的庫,包括集合定位、使用Canvas進(jìn)行2D繪圖以及WebSockets等等。這些庫只是封裝了已存在的JavaScript API,而mobl API使用mobl的本地接口,這使得它能夠調(diào)用“本地”JavaScript代碼。這樣,mobl就可以通過庫機(jī)制進(jìn)行擴(kuò)展,這讓用戶可以擴(kuò)展平臺(tái),而不需要擴(kuò)展語言和編譯器本身。

在特定的情況下,mobl會(huì)為特定的庫添加句法的特性。例如,對于查詢,mobl暴露了Collection類型,它擁有對實(shí)體對象的集合進(jìn)行過濾、排序和分頁的方法。我們可以像下面這樣來調(diào)用這些方法:

  1. var doneTasks = Task.all().filter("done""="true).order("date"false).limit(10); 

很明顯,這些語法有些麻煩。因此,mobl為查詢添加了句法特性,讓我們可以把上面的查詢寫成這樣:

  1. var doneTasks = Task.all() where done == true order by date desc limit 10; 

這不僅更加簡潔,而且現(xiàn)在IDE可以檢查事實(shí)上Task是否擁有done和date屬性,并且提供了恰當(dāng)?shù)拇a自動(dòng)完成功能。

結(jié)論

mobl沒有在已存在的語言基礎(chǔ)之上構(gòu)建框架,而是從頭開始,構(gòu)建了一種外部DSL。這種方法有優(yōu)點(diǎn)也有缺點(diǎn)。缺點(diǎn)在于用戶需要學(xué)習(xí)新語言、新庫以及新的工具。優(yōu)點(diǎn)在于,選擇這種語言來進(jìn)行設(shè)計(jì),可以顯著減少開發(fā)者所要編寫的代碼。在mobl中,我們保持它的語法與語義與JavaScript類似,從而讓開發(fā)者覺得這種語言很熟悉。此外,mobl能夠集成到現(xiàn)有的Eclipse IDE和外圍工具中,提供在輸入時(shí)檢測錯(cuò)誤、引用解析、代碼自動(dòng)完成和保存時(shí)編譯等功能。

mobl還是一種很年輕的語言。第一次公開發(fā)布是在2011年1月。它的編譯器、工具和文檔還在逐步完善中。盡管如此,我們覺得它已經(jīng)顯示出在移動(dòng)領(lǐng)域使用DSL的潛力。

【編輯推薦】

  1. 移動(dòng)開發(fā)之編程語言教程
  2. 移動(dòng)開發(fā)者更傾向于iOS和Android平臺(tái)
  3. 移動(dòng)開發(fā)經(jīng)驗(yàn)分享:推送通知特性的最佳實(shí)踐
  4. 移動(dòng)開發(fā)者:打造成功應(yīng)用的十大密訣

 

責(zé)任編輯:于鐵 來源: InfoQ
相關(guān)推薦

2011-05-06 15:31:28

moblweb開發(fā)DSL

2011-05-11 10:12:05

Mobl

2013-09-04 14:49:10

移動(dòng)Web前端開發(fā)設(shè)計(jì)理念

2011-07-07 13:19:38

Web

2016-09-29 09:22:01

移動(dòng)WebHtml5

2019-08-29 09:00:55

開發(fā)Flutter框架

2015-02-05 09:42:00

移動(dòng)開發(fā)虛擬討論

2015-07-16 13:57:06

移動(dòng)web開發(fā)規(guī)范

2014-07-28 09:15:02

開發(fā)框架

2012-03-06 16:57:40

jQuery mobijQuery mobiframework

2012-09-28 09:12:39

移動(dòng)Web

2011-02-21 09:10:42

WebHTML 5JavaScript

2012-01-18 14:29:42

移動(dòng)Web應(yīng)用開發(fā)

2015-08-28 08:44:43

web移動(dòng)開發(fā)轉(zhuǎn)行

2015-08-28 09:19:53

Web開發(fā)移動(dòng)開發(fā)

2014-03-28 15:36:43

移動(dòng)WebJavaScript開發(fā)框架

2011-10-28 11:20:25

移動(dòng)Web

2013-09-10 16:16:19

移動(dòng)網(wǎng)站性能優(yōu)化移動(dòng)web

2011-12-28 17:08:11

移動(dòng)Web開發(fā)開發(fā)工具

2024-01-08 09:00:00

開發(fā)DSLKotlin
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

午夜精品久久久久久久久久久久久| 制服丝袜亚洲网站| 欧美日韩一区综合| 免费在线不卡av| 91高清一区| 亚洲国产精品久久91精品| 免费在线a视频| 免费在线观看黄色网| 国产成a人亚洲| 国产成人精品优优av| 日本黄色免费片| 一区二区视频| 色婷婷av一区二区三区大白胸 | 欧美国产激情二区三区| 91久色国产| 免费av中文字幕| 欧美日韩免费观看一区=区三区| 亚洲国产精品国自产拍av秋霞| 久久这里只精品| 国产美女精品写真福利视频| 中文字幕二三区不卡| 国产精品免费区二区三区观看| 亚洲精品毛片一区二区三区| 国内精品亚洲| 久久偷看各类女兵18女厕嘘嘘| 欧美一区二区三区成人精品| 免费一级欧美在线大片| 欧美吻胸吃奶大尺度电影| 国产精品久久久久7777| 毛片在线不卡| 国产精品视频一二三| 精品国产一区二区三区麻豆小说 | 精品免费日韩av| 久久久久久久久久久久91| 国产精品xx| 一区二区三区精密机械公司| 亚洲精品视频一二三| 日韩国产福利| 99国产精品久久久久久久久久| 亚洲一区二区三区乱码aⅴ蜜桃女| 久久久久久久亚洲| 国产农村妇女精品一二区| 欧美福利视频在线| 91香蕉一区二区三区在线观看| 不卡一区2区| 亚洲欧美成人一区二区在线电影| 波多野结衣有码| 99精品在免费线中文字幕网站一区| 91精品国产综合久久久久久| 亚洲小视频网站| 青草综合视频| 欧美日韩在线亚洲一区蜜芽| 亚洲三级视频网站| 天然素人一区二区视频| 色中色一区二区| 成年人小视频网站| 小黄鸭精品aⅴ导航网站入口| 黑丝美女久久久| 黄www在线观看| 在线天堂新版最新版在线8| 婷婷中文字幕一区三区| 免费一级特黄毛片| 中文字幕在线看片| 欧美视频免费在线观看| 国产视频在线视频| 高清欧美日韩| 欧美一区三区四区| 日批视频免费看| 欧美日韩导航| 国产亚洲人成网站在线观看| 影音先锋制服丝袜| 97精品一区| 久久国产精品亚洲| 日本少妇做爰全过程毛片| 1024日韩| 国产精品成人久久久久| 亚洲一级黄色大片| 国产一区二区三区视频在线播放| 亚洲xxxxx电影| 亚洲欧美激情另类| 97久久超碰精品国产| 麻豆精品传媒视频| 91caoporm在线视频| 亚洲欧美偷拍另类a∨色屁股| 欧美黄网在线观看| 老牛影视精品| 欧美午夜一区二区三区| 日本中文字幕观看| 国产精品jk白丝蜜臀av小说| 亚洲欧洲视频在线| 视频国产一区二区| 尤物网精品视频| 国产精品美女久久久免费| 国产婷婷在线视频| 91麻豆国产福利在线观看| 午夜精品一区二区三区在线观看 | 亚洲免费av高清| xxxx18hd亚洲hd捆绑| 成人va天堂| 日韩小视频在线观看专区| 插吧插吧综合网| 亚洲精品久久久| 欧美做爰性生交视频| 91麻豆成人精品国产免费网站| 国产91精品一区二区麻豆亚洲| 欧美在线播放一区二区| 黄色网在线播放| 欧美性高跟鞋xxxxhd| 国产又黄又猛的视频| 欧美亚洲色图校园春色| 精品国产一区二区三区四区在线观看 | 亚洲欧美手机在线| 欧美挤奶吃奶水xxxxx| 日韩在线免费观看视频| 精品成人久久久| 国产在线精品一区二区夜色| 欧美久久电影| 超碰资源在线| 日韩一区二区三区视频在线观看| 高潮毛片无遮挡| 亚洲精品乱码| 69堂成人精品视频免费| 成人免费在线电影| 欧美性xxxx在线播放| 无码国产精品一区二区免费式直播| 91亚洲国产高清| 国产成人一区二区三区| 色婷婷视频在线| 一区二区三区四区五区视频在线观看| 九一精品在线观看| 欧美日本成人| 91国内在线视频| 丰满人妻一区二区三区无码av| 国产精品久久久久国产精品日日| 亚洲成熟丰满熟妇高潮xxxxx| 嗯用力啊快一点好舒服小柔久久| 久久综合电影一区| 亚洲图片小说视频| 欧美国产日本视频| 国产理论在线播放| 国产探花一区| 国产精品wwwwww| 九一在线视频| 色婷婷久久一区二区三区麻豆| 中文在线观看免费视频| 黄色在线一区| 国产精品毛片va一区二区三区| 日本三级韩国三级欧美三级| 日韩一区二区三区视频在线| 国产探花在线播放| 国产福利电影一区二区三区| 女同性恋一区二区| 欧美a级大片在线| 欧美刺激性大交免费视频| 国产女人18毛片水18精| 亚洲色图.com| 又色又爽又黄18网站| 欧美黄在线观看| 国产精品一区二区三区精品 | 99精品视频在线观看播放| 国产精品video| 色的视频在线免费看| 欧美日韩久久久一区| 黄色片在线观看免费| 免费成人在线观看| 中文字幕色一区二区| 久久国产精品美女| 国模极品一区二区三区| 亚欧在线观看视频| 色哟哟一区二区在线观看| b站大片免费直播| 美日韩一级片在线观看| 亚洲国产精品女人| 亚洲一区 二区| 欧美一区二区三区艳史| 国产黄在线看| 欧美一区二区日韩一区二区| 久久久全国免费视频| 91亚洲精华国产精华精华液| 黑森林福利视频导航| 日韩高清欧美| 亚洲综合精品一区二区| sm在线播放| 国产亚洲精品成人av久久ww| 国产一区二区三区黄片| 五月天久久比比资源色| 超薄肉色丝袜一二三| 国产福利一区二区三区| 国产午夜伦鲁鲁| 亚洲成人免费| 久久精品五月婷婷| av在线播放一区二区| 97精品久久久| 免费黄色电影在线观看| 亚洲成人精品久久| 国产精品午夜一区二区| 亚洲国产精品影院| 一级在线观看视频| 成人激情黄色小说| www.日本一区| 国产欧美另类| 中文字幕精品在线播放| 亚洲图区在线| 高清不卡一区二区三区| 777午夜精品电影免费看| 久久久久久久色| 日本在线免费中文字幕| 亚洲精品一区中文| 亚洲第一色视频| 欧美色中文字幕| 国产精品久久久久久99| 亚洲精品中文在线影院| 国产又粗又黄又猛| 99精品久久只有精品| 樱花草www在线| 青青草伊人久久| 免费 成 人 黄 色| 欧美在线首页| 一区二区三区四区在线视频| 伊人久久大香线蕉无限次| 国产日产精品一区二区三区四区 | 欧美裸体一区二区三区| 亚洲乱码国产乱码精品| 五月天婷婷综合| 久久久久香蕉视频| 亚洲精品国产第一综合99久久| 国产又黄又粗视频| 26uuu久久天堂性欧美| 免费不卡的av| 国产成人精品1024| 激情久久综合网| 蜜乳av一区二区| 欧美大尺度做爰床戏| 亚洲主播在线| 欧洲黄色一级视频| 日韩亚洲在线| 无码人妻少妇伦在线电影| 国产一区美女| 日韩国产成人无码av毛片| 欧美fxxxxxx另类| av日韩在线看| 红桃视频亚洲| 免费在线看黄色片| 国产一区视频在线观看免费| 成年在线观看视频| 欧美日韩亚洲一区在线观看| 免费看污污视频| 综合日韩在线| 黄色一级大片免费| 国产精品mm| 国产尤物av一区二区三区| 亚洲福利一区| 日本少妇高潮喷水视频| 亚洲免费网站| 乱子伦视频在线看| 日韩精品一卡二卡三卡四卡无卡 | 国产福利一区在线| 亚洲熟女乱综合一区二区| 国产精品一区三区| 一级黄色大片免费看| 成人性生交大片免费看中文网站| 香蕉在线观看视频| 成人久久18免费网站麻豆| 免费黄色三级网站| 久久久精品免费免费| 在线观看免费小视频| 亚洲欧美区自拍先锋| 欧美日韩一级大片| 亚洲一区二区三区中文字幕在线| 久热精品在线观看| 狠狠躁夜夜躁久久躁别揉| 青青草视频在线观看免费| 欧美亚洲一区三区| 国产伦精品一区二区三区免.费 | 精品视频站长推荐| 久久综合久久综合九色| 久久午夜精品视频| 一区二区三区在线影院| 日本高清www免费视频| 色成年激情久久综合| 一道本无吗一区| 亚洲成年人在线| 国产对白叫床清晰在线播放| 久久精品电影一区二区| 丰乳肥臀在线| 国产精品毛片a∨一区二区三区|国| 日韩精品一区二区三区中文字幕| 精品国产中文字幕| 天天揉久久久久亚洲精品| 欧美国产视频一区| 久久亚洲精选| 乱码一区二区三区| 欧美激情一区二区三区| 免看一级a毛片一片成人不卡| 狠狠综合久久av一区二区小说| 国产精品久久欧美久久一区| 亚洲国产精品字幕| 亚洲1卡2卡3卡4卡乱码精品| 韩国视频理论视频久久| 欧美亚洲黄色| 久久精品99久久| 91精品一区国产高清在线gif| 播放灌醉水嫩大学生国内精品| 久久成人18免费观看| 国产中文一区二区| 国产一区日韩| 成人在线国产视频| 美女脱光内衣内裤视频久久网站| 午夜影院福利社| 国产精品每日更新| 国产成人精品网| 精品美女在线观看| 毛片在线播放a| 国产精品成人播放| 日韩在线黄色| 国产一区二区四区| 国产一区二区精品久久99| 级毛片内射视频| 激情久久av一区av二区av三区| 99国产揄拍国产精品| 深夜福利亚洲导航| 小黄鸭精品aⅴ导航网站入口| 狠狠爱一区二区三区| 中文字幕午夜精品一区二区三区 | 国产成人精品一区二三区| 欧美高清激情brazzers| 国产在线日本| 51精品在线观看| 韩国精品福利一区二区三区 | 色欲一区二区三区精品a片| 色哟哟一区二区三区| 深夜福利视频网站| 久久久亚洲天堂| 一区二区三区国产好| 青青草原国产免费| 久久电影国产免费久久电影| 天堂在线中文视频| 午夜精品一区在线观看| 波多野结衣a v在线| 亚洲成av人影院| 欧美 日韩 国产 成人 在线 91 | аⅴ天堂中文在线网| 色菇凉天天综合网| 国模吧精品人体gogo| 青青精品视频播放| 美女少妇全过程你懂的久久| av免费观看网| 久久蜜桃av一区二区天堂| 亚洲欧美精品一区二区三区| 国产视频精品免费播放| 性欧美xxx69hd高清| 欧美久久久久久| 日韩中文字幕区一区有砖一区| a级片在线观看| 在线观看一区不卡| 在线免费看黄网站| 成人在线国产精品| 欧美日韩网址| av鲁丝一区鲁丝二区鲁丝三区| 欧美日韩国产在线看| 久青青在线观看视频国产| 国产精品人成电影| 亚洲乱码电影| 亚洲美女高潮久久久| 亚洲成精国产精品女| 青青草在线播放| 国产精品手机播放| 综合久久亚洲| 屁屁影院国产第一页| 91极品美女在线| 麻豆tv免费在线观看| 成人动漫视频在线观看免费| 亚洲国产99| 欧美人妻一区二区三区| 欧美高清视频不卡网| 9999在线视频| 奇米视频888战线精品播放| 九九**精品视频免费播放| 欧美色图亚洲天堂| 亚洲老司机av| 在线不卡一区| 国产日本在线播放| 国产丝袜欧美中文另类| 国产三级第一页| 91精品国产91久久久久久最新| 国产探花一区| 自拍视频第一页| 91国偷自产一区二区使用方法| 黄网站在线免费| 好看的日韩精品| 久久99精品网久久| 久久久夜色精品| 一区二区欧美亚洲| 91成人午夜| 亚欧激情乱码久久久久久久久| 亚洲综合激情网| 啊v视频在线| 精品久久一区二区三区蜜桃| 久久66热偷产精品| 国产精品视频免费播放|