日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Dreamwear如何创建javascript_JavaScript 太糟糕,JVM 有妙招!

發布時間:2025/3/11 javascript 74 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Dreamwear如何创建javascript_JavaScript 太糟糕,JVM 有妙招! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

雖然 JavaScript 憑借其簡潔性、交互性等優勢橫掃了各大編程語言榜單,但是一直以來,JavaScript?應用程序的工具鏈極其復雜,引發不少開發者吐槽,在此,我們是否有更好的解決方案將其替代?

接下來,本文中將分享幾個 JVM 的替代方案,希望對大家有所裨益。

作者 |?Renato Athaydes

譯者 | 彎月

責編 | 屠敏

出品 | CSDN(ID:CSDNnews)

以下為譯文:

我是一個主要從事后端的開發人員,但時不時地也需要做一些前端工作。因為有時在個人的項目中也會用到前端。

出于這個原因,我一直在遠遠地關注JavaScript的發展,但說實話我并不喜歡JavaScript的世界。

我最不喜歡的一點是專業JavaScript應用程序的工具鏈極其復雜。從前,你只需要寫幾行HTML,然后用瀏覽器打開(file:///home/me/index.htlm)即可,在添加動態效果的時候只需要鏈接一個簡單的JS文件,然后刷新一下頁面就好了,但是這樣的日子已經一去不復返了。

JavaScript的MDN頁面(https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/What_is_JavaScript)上展示的方法才是正確地使用HTML和JS的方法——不需要構建工具,也不需要框架。然而,很少有人聽得進去。

如今,JavaScript的工具鏈包含了后端工具鏈所有的復雜性,有過之而無不及。甚至就在幾年前,工具鏈的許多部分和現在都是不同的!看看StackOverflow上一些問題的答案(https://stackoverflow.com/questions/1480186/what-is-in-your-javascript-toolchain),你會有覺得很有意思。

這個Pluralsight JS開發環境(https://github.com/coryhouse/javascript-development-environment)建議你利用32種工具來構建你的應用程序(例如babel、chai、cheerio、eslint、mocha、webpack ......)。

2016年的這篇文章(https://italonascimento.github.io/configuring-a-basic-environment-for-javascript-development/)中記錄了在Google和DuckDuckGo中搜索基本的JS開發環境時,搜索結果中包含哪些工具:

  • 依賴管理工具(npm或yarn)

  • 模塊打包(webpack或gulp、browserify、bower)

  • ES6編譯(babel)

  • 任務自動化(npm腳本)

  • 實時重新加載(live-server)

如果你按照上述文章的說明操作,那么最終會得到3個配置文件(npm、babel和webpack每個工具各一個),你需要通過嵌入到JSON配置文件的shell腳本來管理構建的過程,而且你的項目需要通過編譯和實時重新加載HTTP服務器才能運行。

我認為如果我需要編譯東西,那么至少我應該使用編譯器來檢查我的代碼!

那么為什么不試試TypeScript呢?!

于是,我按照這個教程(https://alligator.io/typescript/new-project/)所說,創建了一個TypeScript項目。

創建好后,除了前面提到的那些配置文件之外,我還多了兩個配置文件:tsconfig.json和tslint.json。

這一切太復雜了,所以Google創建了一個工具(Google TypeScript Style,簡稱GTS)來管理TypeScript配置。

我曾嘗試使用這個工具,然而,由于一些模塊相關的錯誤,瀏覽器拒絕運行我的JavaScript文件。我不知道在我使用的無數的工具中,哪一個可以解決這個問題,我快被這種錯綜復雜的工具逼瘋了,于是我決定尋找其他的解決方案!

在尋找的過程中,我發現了這篇優秀的博客文章(https://itnext.io/you-might-not-need-a-build-toolchain-324edcef7f9a),文中宣稱你不需要構建工具鏈。

這篇文章表明,你可以使用像React這樣的現代工具,就不需要構建工具了!然而不幸的是,一旦你開始使用依賴項,而且你的應用程序包含幾百行以上的JavaScript代碼,那么這種方法就不太實用了。

我又回到了原點。

似乎無論我們做什么,構建/編譯步驟都是一個避無可避的惡魔,而且長期以來在后端的開發工作中,我們了解了如何使用優秀的工具編寫大型應用程序,所以何妨在前端的開發中也嘗試使用這些工具呢?

畢竟,早在2011年,當我還在做Web開發時,就有人嘗試這種做法了……例如,2011年我曾使用過GWT(這是一個基于Java的Web工具包)……當然,8年后,基于Java的Web應用程序應該有了很多改進,不是嗎?

于是,我開始檢查都有哪些工具可以用。一個習慣了使用Java世界里優秀的工具和良好生態系統的后端開發人員能否進軍前端的工作,而不至于被JS世界里的瘋狂湮沒呢?

就讓我們拭目以待吧!

方法

為了在本文中比較每一種備選的方案,我決定仿照上述我提到的博客文章“不需要構建工具鏈”,創建一個非常簡單的計數器應用程序。

作為參考,以下是用React(沒有JSX)編寫的應用程序的代碼。

我比較不同備選方案的方法非常簡單:

  • 找一個入門教程,然后通過運行演示的應用程序,感受設置的難易程度。

  • 檢查框架與Java開發人員期望的契合程度。

  • 使用產品/框架提供的最基本的工具創建計數器應用程序。

  • 衡量應用程序的大小、代碼行數和性能。

  • 最后一個要點的靈感來自這篇博客文章“前端框架的真實比較”(https://medium.freecodecamp.org/a-realworld-comparison-of-front-end-frameworks-with-benchmarks-2019-update-4be0d3c78075)。

    應用程序大小是通過查看瀏覽器的網絡選項卡來確定的(為了避免使用依賴于大量非JS資源的框架,我包含了所有類型的資源)。

    對于性能,我使用了Google Chrome自帶的Lighthouse。

    以下是使用React的結果,僅供參考。

    為了進行比較,我選擇從本地服務器(而不是CDN)上下載并提供React JS文件。

    應用程序的大小:

    性能:

    好了,以上就是我們的對比標準。

    現在,讓我們來看看最原始的基于Java的Web工具包:GWT。

    GWT:Java-source-to-JS,服務器和客戶端框架

    網址:http://www.gwtproject.org

    GWT是第一個在沒有Applet或插件的情況下,在瀏覽器中使用Java的工具,創建于2006年。這是一項非常成熟的技術,但自2013年以來Google支持的框架不再支持GWT……我記得當時Google將其Web開發工作的重點放在了Dart上,而Dart作為JS的替代方案與GWT有著直接的競爭關系,而且當時的GWT社區已被人遺棄。不知怎地,GWT這個項目依然存在,所以我覺得我必須把它包含在這個比較中,這樣才能真正看出現代替代方案的狀況。

    如果你想使用GWT,那么可以按照官網的建議下載SDK或安裝Eclipse插件……我已經有很多年沒碰過Eclipse了(我改用了IntelliJ),所以我決定下載SDK:

    ./webAppCreator?-out?gwt-app?com.athaydes.GwtApp

    這個命令運行得非常快,而且還創建了一個Ant項目(什么東西?!)。我使用Java的時間已經超過了10年,而且我錯過了Ant的鼎盛時期——如果我沒記錯的話,Maven是Java的構建工具。

    但我不介意Ant!稍后我可以將其轉換為Gradle或Maven構建。而且IntelliJ可以很好地支持Ant項目,所以你可以在IntelliJ中打開這個項目,而且一切都會正常工作。

    運行演示應用程序:

    ant?devmode

    這一步可以打開一個Swing應用程序,你可以通過它控制開發服務器!我感覺它與2009年一模一樣!在瀏覽器上打開這個應用后,我發現除了一些新鮮的樣式之外,這個應用也幾乎沒有變化。

    演示應用會向你展示如何使用GWT最強大的功能:無縫的RPC框架讓開發人員幾乎忘記了客戶端和服務器之間的區別,兩者之間的通信猶如調用Java方法一樣簡單。

    但是在構建計數器應用的時候,我們并不需要兩者之間的通信。所以,我做的第一件事就是從入門應用中刪除RPC的代碼。

    一般來說,GWT應用程序只包含一個源代碼根,它分為:

    • 客戶端:僅在瀏覽器中運行的客戶端代碼。

    • 服務器:服務器端代碼,即后端。

    • 共享:客戶端和服務器皆可見的代碼。

    你可以通過應用最頂層軟件包的GwtApp.gwt.xml文件,設置應用客戶端可以看到哪些軟件包。該文件還可以控制應用應該使用的GWT主題,因此你可以很輕松地在應用中使用黑暗主題。

    在這個入門的應用程序中,Java源代碼位于src/目錄下,而Web的源代碼位于war/目錄中。初始頁面的HTML文件是war/GwtApp.index.html。打開這個文件,你可以看到一個非常普通的HTML,但奇怪的是,大部分視圖都已經實現了(利用

    我想用自己的代碼實現視圖,所以我刪除了這個

    在基于小部件的API的幫助下,在GWT中實現用戶界面是一件非常容易的事情。因此,我在5分鐘內就創建計數器應用(請不要忘記我之前有過使用GWT的經驗,即便我幾乎什么都想不起來了)。但是,當我嘗試重新編譯代碼時,遇到了lambdas的錯誤——ant文件說我們需要使用Java 7!為什么沒人更新呢?!GWT支持Java 8,所以我將其更新到了Java 8,然后一切都正常了。

    以下是我在GWT中實現計數器應用的代碼:

    package?com.athaydes.client;

    import?com.google.gwt.core.client.EntryPoint;
    import?com.google.gwt.user.client.ui.*;

    import?java.util.function.Consumer;

    public?class?GwtApp?implements?EntryPoint?{
    ????public?void?onModuleLoad()?{
    ????????RootPanel.get(?"content"?).add(?new?Counter()?);
    ????}
    }

    class?Counter?extends?Composite?{

    ????private?int?value;

    ????Counter()?{
    ????????HorizontalPanel?buttonsPanel?=?new?HorizontalPanel();
    ????????buttonsPanel.setSpacing(?10?);

    ????????Button?up?=?new?Button(?"Increment"?);
    ????????Button?down?=?new?Button(?"Decrement"?);
    ????????Label?out?=?new?Label();

    ????????Runnable?update?=?()?->?out.setText(?"The?current?count?is?"?+?value?);
    ????????update.run();

    ????????Consumer?handler?=?(?increment?)?->?{if?(?increment?)?{value++;
    ????????????}?else?{value--;
    ????????????}
    ????????????update.run();
    ????????};
    ????????up.addClickHandler(?clickEvent?->?handler.accept(?true?)?);
    ????????down.addClickHandler(?clickEvent?->?handler.accept(?false?)?);
    ????????buttonsPanel.add(?up?);
    ????????buttonsPanel.add(?down?);
    ????????VerticalPanel?root?=?new?VerticalPanel();
    ????????root.setSpacing(?20?);
    ????????root.add(?buttonsPanel?);
    ????????root.add(?out?);
    ????????initWidget(?root?);
    ????}
    }

    看起來不錯。實時地重新加載適用于超級開發模式,可以快速地修復用戶界面中的小問題。

    編譯出該應用的生產版本:

    ant?build

    生成的JS文件放在war/gwtapp目錄中。通過war目錄就可以在瀏覽器中運行應用,所以我只需在IntelliJ中打開war/GwtApp.html,然后單擊右上角的瀏覽器圖標,就可以讓IntelliJ啟動一個負責運行HTML文件的HTTP服務器,并在我想要的瀏覽器中打開HTML文件。結果表明,該應用運行良好。

    應用程序的大小:

    性能:

    TeaVM:Java-bytecode-to-JS編譯器

    網址:http://teavm.org/

    TeaVM這個項目據稱可以將Java字節碼轉換成JavaScript和Webassembly。 因為它不需要Java源代碼,所以它也可以用于從Kotlin和Scala(以及其他基于JVM的語言)進行編譯。

    如果你想學習使用TeaVM,那么需要使用Maven archetype:

    $?mvn?-DarchetypeCatalog=local?\????????????????
    ??-DarchetypeGroupId=org.teavm???-DarchetypeArtifactId=teavm-maven-webapp???-DarchetypeVersion=0.5.1?archetype:generate

    這一步會創建一個標準的Java項目,根據Maven的約定,你可以在提示框中輸入項目的保存目錄。Java源代碼位于src/main/java,而Web的index.html等文件位于src/main/webapp目錄中。

    以下是我編寫的計數器的Java代碼:

    package?com.athaydes;

    import?org.teavm.jso.dom.html.HTMLButtonElement;
    import?org.teavm.jso.dom.html.HTMLDocument;
    import?org.teavm.jso.dom.html.HTMLElement;

    import?java.util.function.Consumer;

    public?class?Client?{
    ????public?static?void?main(?String[]?args?)?{
    ????????HTMLDocument?document?=?HTMLDocument.current();
    ????????HTMLElement?div?=?document.createElement(?"h2"?);
    ????????div.appendChild(?document.createTextNode(?"TeaVM?CounterApp"?)?);
    ????????document.getBody().appendChild(?div?);
    ????????div.appendChild(?new?Counter().build()?);
    ????}
    }

    class?Counter?{
    ????private?int?value?=?0;

    ????HTMLElement?build()?{
    ????????HTMLDocument?document?=?HTMLDocument.current();
    ????????HTMLButtonElement?up?=?(?HTMLButtonElement?)?document.createElement(?"button"?);
    ????????up.appendChild(?document.createTextNode(?"Increment"?)?);
    ????????HTMLButtonElement?down?=?(?HTMLButtonElement?)?document.createElement(?"button"?);
    ????????down.appendChild(?document.createTextNode(?"Decrement"?)?);
    ????????HTMLElement?out?=?document.createElement(?"p"?);

    ????????Runnable?update?=?()?->?out.setInnerHTML(?"The?current?count?is?"?+?value?);

    ????????Consumer?handler?=?(?increment?)?->?{if?(?increment?)?{
    ????????????????value++;
    ????????????}?else?{
    ????????????????value--;
    ????????????}
    ????????????update.run();
    ????????};
    ????????up.listenClick(?(?event?)?->?handler.accept(?true?)?);
    ????????down.listenClick(?(?event?)?->?handler.accept(?false?)?);
    ????????update.run();
    ????????HTMLElement?div?=?document.createElement(?"div"?);
    ????????div.appendChild(?out?);
    ????????div.appendChild(?up?);
    ????????div.appendChild(?down?);return?div;
    ????}
    }

    有趣的是,Java Counter組件僅包含34行代碼,比React.js(55行以上的代碼量)少很多!

    運行如下命令編譯:

    $?mvn?package

    該命令會像往常一樣編譯所有的Java代碼,并在target/classes目錄中生成.class文件(與普通的Java項目一樣),但它還會在target/-/teavm下創建JavaScript代碼,我的項目名為mytea,因此相應的目錄為:target/mytea-1-0-SNAPSHOT/teavm。

    在運行該應用程序時,你只需啟動Web服務器即可將目錄`target/mytea-1-0-SNAPSHOT/掛出來。

    應用程序的大小:

    性能:

    JSweet:帶有庫生態系統的Java-source-to-JS(和TypeScript)編譯器

    網址:http://www.jsweet.org/

    JSweet可以將Java源代碼編譯為TypeScript和JavaScript。Java庫可以作為TypeScript庫發布。與其他備選方案不同,Java代碼可以與JS / TS代碼互相轉換!

    如果你想學習使用JSweet,那么我推薦你從GitHub克隆快速入門的項目:

    $?git?clone?https://github.com/cincheo/jsweet-quickstart.git
    $?cd?jsweet-quickstart
    $?mvn?generate-sources

    同樣,Java項目會使用標準的Maven約定,將Java源代碼放入src/main/java中。然而,Web資源會直接放在webapp目錄下。

    與TeaVM不同,JSweet編譯器根本不會生成類文件:這就是為什么你只能運行mvn generate-sources來生成JS代碼,而無法使用更常見的mvn package或mvn install。

    最終我寫的Java代碼幾乎與TeaVM一樣(但有一點例外:JSweet API選擇java.util.function.Function作為點擊處理程序,而不是Consumer,因此必須返回一個值,用lambda來編寫這段代碼就會很尷尬,你需要使用大括號并強制返回null):

    package?quickstart;

    import?def.dom.HTMLButtonElement;
    import?def.dom.HTMLElement;

    import?java.util.function.Consumer;

    import?static?def.dom.Globals.document;

    public?class?QuickStart?{
    ????public?static?void?main(?String[]?args?)?{
    ????????HTMLElement?div?=?document.createElement(?"h2"?);
    ????????div.appendChild(?document.createTextNode(?"JSweet?CounterApp"?)?);
    ????????document.body.appendChild(?div?);
    ????????div.appendChild(?new?Counter().build()?);
    ????}
    }

    class?Counter?{
    ????private?int?value?=?0;

    ????HTMLElement?build()?{
    ????????HTMLButtonElement?up?=?(?HTMLButtonElement?)?document.createElement(?"button"?);
    ????????up.appendChild(?document.createTextNode(?"Increment"?)?);
    ????????HTMLButtonElement?down?=?(?HTMLButtonElement?)?document.createElement(?"button"?);
    ????????down.appendChild(?document.createTextNode(?"Decrement"?)?);
    ????????HTMLElement?out?=?document.createElement(?"p"?);

    ????????Runnable?update?=?()?->?out.innerText?=?"The?current?count?is?"?+?value;

    ????????Consumer?handler?=?(?increment?)?->?{if?(?increment?)?{
    ????????????????value++;
    ????????????}?else?{
    ????????????????value--;
    ????????????}
    ????????????update.run();
    ????????};
    ????????up.onclick?=?(?event?)?->?{
    ????????????handler.accept(?true?);return?null;
    ????????};
    ????????down.onclick?=?(?event?)?->?{
    ????????????handler.accept(?false?);return?null;
    ????????};
    ????????update.run();
    ????????HTMLElement?div?=?document.createElement(?"div"?);
    ????????div.appendChild(?out?);
    ????????div.appendChild(?up?);
    ????????div.appendChild(?down?);return?div;
    ????}
    }

    應用程序的大小:

    性能:

    CheerpJ:完全在瀏覽器上實現JVM

    網址:https://leaningtech.com/cheerpj/

    CheerpJ絕對是最瘋狂的選擇(甚至可能是你見過的最瘋狂的項目!)

    實際上,它并不是Java到JavaScript的轉換器……其實它是一個完整的Java運行時!沒錯,它可以完成更傳統的JVM可以執行的所有操作。線程、文件系統(顯然它通過IndexDB模擬文件系統)、反射、類加載、網絡,等等。

    如果這還不足以讓你頭暈目眩,那么就讓我們來看看CheerpJ的入門教程。

    這個入門教程可以讓你感受如何在沒有插件的情況下,在瀏覽器上運行包含Swing應用(記住Swing,面向桌面系統的多平臺Java UI框架??)的編譯好的jar。

    它運行的不是applet,它真的是在瀏覽器中運行Swing代碼!!而且還沒有插件!!

    說出來連我自己都不相信,所以讓我們一起來看看這個入門教程吧。

    為了方便起見,我將這些步驟進行了如下總結:

    • 下載Swing應用程序的jar。

    • 使用本地Java運行這個jar。

    • 安裝CheerpJ(據說,你必須手動下載并放在你的主文件夾下)。

    • 確認你安裝好了python3(對啊,我也覺得很奇怪,使用CheerpJ的時候,還需要用到Python)。

    • 運行~/cheerpj_1.3/cheerpjfy.py TextDemo.jar。

    • 創建一個index.html文件。

    • 讓Web服務器指向當前目錄。

    目前看起來這個入門教程行不通啊,因為你一直卡在了加載中……但是你需要漫長的等待,長到你開始懷疑人生!但最后終于成功了!

    這個Swing應用跟我在本地Java上運行的應用相同,但它嵌入到了瀏覽器的網頁中!

    在Ubuntu上運行Swing TextDemo

    在瀏覽器中通過CheerpJ運行Swing TextDemo

    如果你有現成的Swing應用,那么可能CheerpJ適合你。但是如果你想要寫一個新的應用,那么你可能不想選用CheerpJ。

    我嘗試使用CheerpJ對DOM的支持(發行包中包含cheerpj-dom.jar文件)來實現計數器應用,但是我在10分鐘內遇到了2個bug。而且這兩個bug很麻煩,我完全無法繼續……更別提我必須將每個Java String都包裝成對Global.JSString()的調用!

    給CheerpJ開發人員的一點提示:將你的jar放入Maven庫中(Java開發人員都不愿意將依賴項硬編碼到本地文件),千萬不要放在目錄下,絕對行不通!另外,你需要習慣語言的約定:不要調用Java方法set_onclick,你應該調用setOnClick,謝謝。

    我準備放棄CheerpJ了,但后來我想起了此次實驗的一項承諾:

    使用產品/框架提供的最基本的工具創建計數器應用程序。

    無奈,只能硬著頭皮繼續了。對CheerpJ來說,似乎實現用戶界面的基本工具即是JVM本身!這個JVM提供了一個UI工具包:Swing!

    從Java 12開始,Swing是隨JVM一起發布的唯一UI工具包……JavaFX已經成為一個獨立的項目。不管怎樣,CheerpJ只支持Swing。

    所以,如下是我在純Swing中實現的計數器應用:

    import?javax.swing.*;
    import?java.awt.*;
    import?java.util.function.Consumer;

    public?class?Main?implements?Runnable?{

    ????@Overridepublic?void?run()?{
    ????????JFrame?frame?=?new?JFrame(?"CheerpJ?Demo"?);

    ????????frame.setDefaultCloseOperation(?JFrame.EXIT_ON_CLOSE?);
    ????????frame.setSize(?400,?80?);
    ????????frame.add(?new?Counter()?);
    ????????frame.setVisible(?true?);
    ????}

    ????public?static?void?main(?String[]?args?)?{
    ????????SwingUtilities.invokeLater(?new?Main()?);
    ????}
    }

    class?Counter?extends?JPanel?{
    ????private?int?value;

    ????public?Counter()?{
    ????????JButton?up?=?new?JButton(?"Increment"?);
    ????????JButton?down?=?new?JButton(?"Decrement"?);
    ????????JLabel?out?=?new?JLabel();

    ????????Runnable?update?=?()?->?out.setText(?"The?current?count?is?"?+?value?);
    ????????update.run();

    ????????Consumer?handler?=?(?increment?)?->?{if?(?increment?)?{value++;
    ????????????}?else?{value--;
    ????????????}
    ????????????update.run();
    ????????};
    ????????up.addActionListener(?event?->?handler.accept(?true?)?);
    ????????down.addActionListener(?event?->?handler.accept(?false?)?);
    ????????JPanel?buttonsPanel?=?new?JPanel();
    ????????buttonsPanel.add(?up?);
    ????????buttonsPanel.add(?down?);
    ????????JLabel?title?=?new?JLabel(?"CheerpJ?CounterApp?(Swing)"?);
    ????????setLayout(?new?BorderLayout()?);add(?title,?BorderLayout.PAGE_START?);add(?buttonsPanel,?BorderLayout.PAGE_END?);add(?out,?BorderLayout.CENTER?);
    ????}
    }

    你完全可以在桌面系統上正常運行:這完全就是一個普通的Swing應用!

    首先,我們需要創建普通的jar:

    mvn?package

    然后用Java運行:

    java?-jar?cheerpj-swing/target/cheerpj-swing-1.0-SNAPSHOT.jar

    結果如下:

    在Ubuntu中運行計數器應用

    瘋狂的是你也可以在CheerpJ的瀏覽器中運行該應用。

    看一看瀏覽器上的“網絡”選項卡,你會發現非常有趣的東西:它一直在下載東西,顯然每個Java的標準庫包都有一個JS文件,CheerpJ會根據需要下載它們。

    應用程序的大小:

    性能:

    為了方便你了解該應用有多糟糕,請參照Lighthouse 提供的如下診斷信息:

    這是我第一次看到Avoid enourmous network payloads的診斷,我絕對會遵循這個建議!

    Vaadin Flow:Java-source-to-JS-source,服務器和客戶端框架

    網址:https://vaadin.com/flow

    很久以前我就聽說Vaadin是一個基于GWT的框架……但似乎他們最近創建了一個基于Web組件的產品Vaadin Flow。

    我喜歡網絡組件,所以我決定試試看。

    入門教程的頁面里有幾個選項,可以創建與Spring或CDI等集成的項目。我選擇了我能找到的最基本選項Project Base,因為我想要的只是一個客戶端應用程序。

    我按照說明下載了zip,而且只用了幾分鐘就可以讓這些代碼運行了。這是一個熟悉的Maven項目(我希望Gradle成為最受歡迎的選擇,但顯然情況并非如此)......我沒有看到index.html文件,這有點令人驚訝。瀏覽器是如何加載應用程序的呢?

    不管怎樣,我們只需要一個命令就可以運行這個應用:mvn jetty:run,然后訪問http://localhost:8080就能看到正在運行的應用。

    看一下這個巨大的POM文件(一個hello world應用就有139行的代碼),似乎他們使用了jetty-maven-plugin。

    所以,我再一次選用了我最喜歡的選項IntelliJ服務器,來提供index.html文件。然而,情況開始有點混亂,這對我來說有點太神奇了......當然,我是一名Java開發人員,但也沒關系,我還是可以應付一兩個HTML文件。

    在我改代碼的時候,似乎服務器重啟了,所以我感覺它可能在實時重新加載。這很好!但不幸的是,雖然不知道服務器在干什么,但是它并沒有實時地重新加載我的代碼。我試過幾次刷新頁面,卻導致了幾處報錯!!看起來像Vaadin應用不喜歡頁面刷新(應用處于調試模式,不過我估計它背后的工作太多了,結果因自身的復雜性而崩潰)。

    但是,編寫UI的Java API非常出色,非常易于使用和學習,顯然是為Java程序員編寫的,讓我感覺賓至如歸,簡直太好了!

    如下是我編寫的計數器應用,你有沒有覺得這段代碼很酷:

    package?com.example.test;

    import?com.vaadin.flow.component.Composite;
    import?com.vaadin.flow.component.button.Button;
    import?com.vaadin.flow.component.html.Div;
    import?com.vaadin.flow.component.html.H2;
    import?com.vaadin.flow.component.html.Paragraph;
    import?com.vaadin.flow.component.orderedlayout.VerticalLayout;
    import?com.vaadin.flow.router.Route;

    import?java.util.function.Consumer;

    @Route(?""?)
    public?class?MainView?extends?VerticalLayout?{

    ????public?MainView()?{
    ????????H2?header?=?new?H2(?"Vaadin?Flow?CounterApp"?);
    ????????add(?header,?new?Counter()?);
    ????}
    }

    class?Counter?extends?Composite<Div>?{
    ????private?int?value;

    ????Counter()?{
    ????????Paragraph?out?=?new?Paragraph();
    ????????Runnable?update?=?()?->?out.setText(?"The?current?count?is?"?+?value?);
    ????????update.run();

    ????????Consumer?handler?=?(?increment?)?->?{if?(?increment?)?{
    ????????????????value++;
    ????????????}?else?{
    ????????????????value--;
    ????????????}
    ????????????update.run();
    ????????};
    ????????Button?up?=?new?Button(?"Increment",?event?->?handler.accept(?true?)?);
    ????????Button?down?=?new?Button(?"Decrement",?event?->?handler.accept(?false?)?);
    ????????getContent().add(?out,?up,?down?);
    ????}
    }

    為了測量這個應用的性能,我通過如下命令在生產模式下運行了該應用:

    $?mvn?jetty:run-exploded?-Pproduction-mode

    感覺這個頁面非常生氣勃勃,即便沒有經過特殊的設計,頁面風格也非常好。

    應用程序的大小:

    注意:這個Vaadin的計數器應用至少需要312KB才能運行(主要是因為一個巨大的HTML文件,vaadin-flow-bundle:JS資源的總大小只有46.7KB)……這比我想象的還要多。

    性能:

    在運行應用時,Chrome在控制臺上顯示了一個警告,這有點讓人擔心。

    似乎Vaadin在很早就采用了HTML導入等實驗性的功能,而現在這些功能都被棄用了。很可惜,但是如果他們能夠持續更新這個產品的話,這應該不是一個大問題。

    Vaadin比JSweet和TeaVM慢一點,但公平地說,這個版本的計數器比其他版本更強大,盡管這并非我所愿(有沒有辦法從Vaadin應用中刪除樣式和字體?)!

    Bck2Brwsr:Java-bytecode-to-JS編譯器

    網址:http://wiki.apidesign.org/wiki/Bck2Brwsr

    Bck2Brwsr始于2012,旨在創建一個能夠快速啟動并百分百在現代瀏覽器中運行的小型Java。

    然而,與CheerpJ不同,它未能實現完整的JVM,只有一小部分功能可以在瀏覽器上運行,更類似于TeaVM,因為它也是將Java字節碼編譯成JS。

    apidesign.org上有一個看起來很舊的wiki頁面(http://wiki.apidesign.org/wiki/Bck2Brwsr),說明了如何使用bck2brwsr。頁面上建議的一種做法是使用Bck2BrwsrViaCLI,還有一種是Knockout4Java。

    我并不是很想使用Knockout.js(它自2015年左右開始就在JS的世界中失寵了),所以我選擇了CLI。

    我按照wiki所說,運行Maven原型創建了一個新項目:

    $?mvn?archetype:generate?????-DarchetypeGroupId=com.dukescript.archetype?????-DarchetypeArtifactId=knockout4j-archetype??-DarchetypeVersion=0.26?????-Dwebpath=client-web
    小心wiki頁面上給出的命令!最后一行少了一個反斜杠,而且命令中的版本是0.16,當前版本應該是0.26。

    然后,編譯并打包應用:

    $?mvn?package?

    警告:這一步會打開一個帶有JUnit Browser Runner的彈出窗口。

    我沒想到會彈出這個窗口……不過,沒關系,我們繼續,wiki頁面上說我們可以通過以下命令運行帶有FXBrwsr的應用:

    $?mvn?-f?client?process-classes?exec:exec

    但是,我在運行這個命令的時候,收到了如下的錯誤:

    Exception?in?thread?"main"?java.lang.IllegalStateException:?Can't?find?any?Fn.Presenter
    ????at?net.java.html.boot.BrowserBuilder.showAndWait(BrowserBuilder.java:255)
    ????at?com.athaydes.Main.main(Main.java:16)
    [INFO]?------------------------------------------------------------------------
    [INFO]?BUILD?FAILURE
    [INFO]?------------------------------------------------------------------------

    我快速搜索了Google,結果什么都沒找到(我猜測他們沒有在Linux上測試),所以我嘗試了一下在真正的瀏覽器中運行應用:

    $?mvn?-f?client-web?clean?package?-DskipTests?bck2brwsr:show

    結果,又遇到了另外一個錯誤:

    [ERROR]?Failed?to?execute?goal?on?project?bck2brwsr-web:?Could?not?resolve?dependencies?for?project?
    com.athaydes:bck2brwsr-web:jar:1.0-SNAPSHOT:?
    Could?not?find?artifact?com.athaydes:bck2brwsr-js:jar:bck2brwsr:1.0-SNAPSHOT?->?[Help?1]

    這是一個Maven經典的問題:有時你需要把你的應用放到某些插件可見的地方……通常你可以通過下述命令解決這個問題:

    $?mvn?install

    然后,再次運行命令啟動應用,看似沒問題,但應用毫無反應。

    檢查控制臺,果然出錯誤了:

    VM69?bck2brwsr.js:6?Uncaught?Cannot?find?com.athaydes.BrowserMain
    w?@?VM69?bck2brwsr.js:6
    v?@?VM69?bck2brwsr.js:2
    r?@?VM69?bck2brwsr.js:2
    load?(async)
    z?@?VM69?bck2brwsr.js:3
    r?@?VM69?bck2brwsr.js:4
    w?@?VM69?bck2brwsr.js:6
    n.loadClass?@?VM69?bck2brwsr.js:6
    (anonymous)?@?index.html:28

    我翻看了代碼……希望找到一些可以幫助我了解這個問題的東西,結果卻什么都沒找到……

    然而,我找到了大量的XML。準確地說,在4個Maven pom文件中找到了931行XML。

    我還發現該項目包含3個Maven模塊:client、client-web和js。

    js模塊包含一個Java類,其中包含一些標記為native的方法,還用@JavaScriptBody進行了注釋,其中包含實現方法的JavaScript代碼,但是嵌入到了Java Strings中。

    client模塊包含一個bootstrapping主類以及一個帶有更多注釋的DataModel類,似乎是為了將數據模型綁定到視圖,同時嘗試使用js模塊中聲明的函數。

    它引用了另一個名為Data的類,然而源代碼中并沒有這個類……它是在編譯項目時自動生成的。而我卻搞不清楚這個類是由什么生成的。可能深埋在1000行的pom中吧。

    client-web模塊包含缺少的類:com.athaydes.BrowserMain。因為這是我們在上述Maven命令中運行的模塊,所以我不明白為什么瀏覽器找不到這個類。

    我希望能夠使用DOM API來創建UI,就像之前的一些示例一樣。我想了很多辦法,最終只發現了一些NetBeans API,這絕對不是我想要的東西。

    似乎唯一可以與網頁交互的方法就是通過HTML文本上的data-bind屬性,其背后的支持是Knockout.js!

    我以為我已經避開了Knockout,但是看看“CLI”頁面上顯示的Maven原型的ID吧!

    也許我可以通過可怕的@JavaScriptBody注釋,直接在Java Strings中編寫JavaScript代碼(請別這么干……理智一點),但我并不想知道這樣是否可行。

    我覺得做了這么多嘗試就夠了。因為幾乎沒有文檔可以幫助我調試這個問題,在線搜索答案也是浪費時間——根本就沒有答案。

    我很抱歉無法在這篇文章中給出有關bck2brwsr性能的實際數據,雖然我花了一天的時間,卻未能成功。我覺得我可以說除非你有迫不得已的理由,否則就不應該碰任何與這個項目相關的東西,包括DukeScript。

    你可能會注意到,整個bck2brwsr文檔甚至源代碼中多次引用了DukeScript。DukeScript的入門頁面中顯示的示例與我使用的Maven原型創建的示例完全相同,如此看來這兩個項目似乎密切相關,盡管Dukescript創始人說bck2brwsr只是項目的一小部分,而且也屬于實驗性質,另外他們也支持TeaVM。

    結論

    讓我們看看最后的結果:

    我沒有將Bck2brwsr包含在內,因為我未能調試成功。如果有人能告訴我問題所在,那么我會更新下面的結果。

    性能:

    * FCP = First Contentful Paint(此值用于打破性能相同的工具之間的聯系)

    應用程序的大小:

    代碼行數:

    代碼行數不包括導入和注釋。

    總結

    問題:性能至關重要?

    答案:那么你應該選擇JSweet或TeaVM。

    問題:你喜歡占用空間較小的方案?

    答案:那么JSweet可以輕松勝任,但TeaVM也相當不錯。

    問題:你希望維護的代碼庫最小?

    答案:那么Vaadin Flow非常棒。其他方案都非常接近,所以這個因素不會產生太大的影響......但它們都能夠輕松擊敗React!

    問題:你想要一些盡可能接近普通Java的東西?

    答案:如果你關心UI組件的話,可以選擇Vaadin Flow;如果你關心業務邏輯的話,則可以選擇TeaVM。

    問題:你希望盡可能接近JS生態系統,但仍使用Java工具?

    答案:那么JSweet非常適合你。

    問題:你想要的東西是Java,但希望在瀏覽器中運行?

    答案:那么JSweet非常適合你。

    問題:你想嘗試一些與Java不同的東西,而不是JS?

    答案:Elm是一種現成的函數式編程語言,旨在創建Web應用程序。它有很棒的工具,包括一個很棒的IntelliJ插件,所以非常適合那些一直想要功能的Java開發人員!另外一個理想的選擇是Dart,它與Java非常相似,但有很多語法糖,所以常見的功能都很容易實現。Ant帶有很棒的工具,包括實時重新加載的服務器,還包括類似于Angular和React等的框架(如果你需要的話)。

    如果你對JVM備選方案與Dart的比較感到好奇,那么我可以告訴你我已經將Dart的實現添加到了我的GitHub代碼庫中。比較結果如下:

    應用程序大小:79KB,性能:100(FCP:1.4s),代碼行數:31。

    本文中顯示的所有代碼都上傳到了如下GitHub代碼庫中,包括React.js和Dart實現。

    https://github.com/renatoathaydes/jvm-alternatives-to-js

    原文:https://renato.athaydes.com/posts/comparing-jvm-alternatives-to-js.html

    本文為CSDN翻譯,轉載請注明來源出處。

    【END】

    作為碼一代,想教碼二代卻無從下手:

    聽說少兒編程很火,可它有哪些好處呢?

    孩子多大開始學習比較好呢?又該如何學習呢?

    最新的編程教育政策又有哪些呢?

    下面給大家介紹CSDN新成員:極客寶寶(ID:geek_baby)

    戳他了解更多↓↓↓

    ?熱 文?推 薦?

    ??李彥宏候選工程院院士;陌陌回應探探下架;拼多多回應“刷單”質疑 | 極客頭條

    ??華為硬核招聘程序員!| 極客頭條

    ??他 25 歲進貝爾實驗室,32 歲創建信息論,40 歲辦達特茅斯會議 | 人物志

    ?真の硬核粉絲!小學生也參加楊超越杯,作品優秀!

    ??阿里半跪過,任正非差點跳樓,京東被騙光錢:成年人的生活哪有容易二字?

    ?不改變比特幣, 如何擴容?

    ?強推!盤點阿里巴巴 15 款開發者工具 | 程序員硬核評測

    ?17篇論文入選CVPR 2019,百度AI都在關注什么?(附論文地址)

    ? 她說:為啥程序員都特想要機械鍵盤?這答案我服!

    System.out.println("點個在看吧!");
    console.log("點個在看吧!");print("點個在看吧!");printf("點個在看吧!\n");
    cout?<"點個在看吧!"?<Console.WriteLine("點個在看吧!");
    Response.Write("點個在看吧!");alert("點個在看吧!")echo "點個在看吧!"

    你點的每個“在看”,我都認真當成了喜歡

    總結

    以上是生活随笔為你收集整理的Dreamwear如何创建javascript_JavaScript 太糟糕,JVM 有妙招!的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    久久五月婷婷丁香 | 免费在线一区二区 | 黄色片视频在线观看 | 亚洲精品在线免费 | 久久久久久久久久电影 | 丁香狠狠 | 久久艹影院 | 色网站视频 | 国产精品久久久久久久久久免费 | 亚洲黄色一级电影 | 成人一区二区三区在线观看 | 伊人国产在线播放 | 99久久精品免费看国产免费软件 | 青青河边草免费观看完整版高清 | 91中文在线观看 | 精品三级av | 免费观看一级特黄欧美大片 | 欧美日韩视频免费看 | 国产精品videoxxxx | 亚洲伊人av | 国产 日韩 中文字幕 | 中文字幕 国产视频 | 日日干视频 | 国产日韩精品欧美 | 久久免费看a级毛毛片 | 99精品久久久久久久久久综合 | 亚洲国产中文字幕在线视频综合 | 久久精品香蕉视频 | 精品久久网站 | 亚洲精品女人 | 九九99 | 久久久免费看 | 亚洲精品久久久久中文字幕二区 | 久热香蕉视频 | av国产在线观看 | 人人人爽| 色狠狠综合 | 精品久久久久久久久久久久久久久久久久 | 国产福利av| www.色五月.com | 国产一卡二卡在线 | 午夜精选视频 | 99久久99久久精品 | 啪啪小视频网站 | 日本午夜免费福利视频 | 亚洲无吗av| 91视频啊啊啊 | 在线观看中文字幕第一页 | 日韩av在线一区二区 | 一级一片免费看 | 99精品影视| 国产伦精品一区二区三区四区视频 | 亚洲乱码精品久久久久 | 久久视频免费看 | 午夜少妇一区二区三区 | 婷婷日韩 | 久久免费精彩视频 | 免费精品视频 | 欧美日韩中文字幕综合视频 | 国产理论在线 | 久久国产精品一国产精品 | 91.精品高清在线观看 | 91亚洲在线观看 | 久久99精品久久久久久秒播蜜臀 | 超碰97公开 | 欧美精品乱码久久久久久按摩 | 欧美少妇bbwhd | 日韩视频中文字幕在线观看 | 涩涩网站在线观看 | 青青草国产免费 | 久久久精品免费看 | 一区二区三区 亚洲 | 婷婷丁香花 | 欧美日韩精品免费观看视频 | 国产色视频一区二区三区qq号 | 成人在线你懂得 | 国产香蕉97碰碰碰视频在线观看 | 在线观看黄色小视频 | 狠狠干天天 | 最新中文在线视频 | 91麻豆精品国产91久久久久久久久 | 久久综合一本 | 黄色av三级在线 | 国产精品久久久久久久久久直播 | 91色网址| 97视频在线观看成人 | 激情五月网站 | 日韩免费在线视频观看 | 色播六月天 | 欧美精品久久久久久久久免 | 特级毛片爽www免费版 | 黄a网| 免费涩涩网站 | 波多野结衣在线观看一区二区三区 | 天天鲁一鲁摸一摸爽一爽 | 成人午夜网址 | 一区二区三区四区在线免费观看 | 青青河边草免费 | 在线观看一区 | 99精品久久精品一区二区 | 中文字幕丝袜美腿 | 97在线精品| 国产精品久久电影观看 | 国产在线观看h | 一级淫片a | 久久精品一级片 | 99国内精品久久久久久久 | 久久亚洲专区 | 免费视频xnxx com | 在线视频成人 | 免费国产一区二区 | 亚洲激情综合 | 69亚洲视频 | 一区二区 不卡 | 成人毛片久久 | 国产91精品高清一区二区三区 | 看片一区二区三区 | 亚洲日日日 | 精品国产电影一区二区 | 久久久免费毛片 | 日本精品视频在线播放 | 久久综合9988久久爱 | 日韩欧美高清视频在线观看 | 天天爱天天射 | av免费片 | 国内精品福利视频 | 亚洲精品视频免费在线观看 | 狠狠躁日日躁狂躁夜夜躁 | 91高清完整版在线观看 | 网址你懂的在线观看 | 91成人精品国产刺激国语对白 | 美女免费网视频 | 视频在线观看99 | 久草在线资源观看 | 伊人导航 | 国产高清在线视频 | 亚洲精品视频一 | 四虎永久免费在线观看 | 在线观看完整版免费 | 伊人天天狠天天添日日拍 | 久久在现视频 | www激情久久 | 久久99精品国产麻豆婷婷 | 欧美资源 | 欧美色图视频一区 | 亚洲精品字幕在线观看 | 国产黄a三级三级三级三级三级 | 一级黄视频 | 亚洲资源 | 深夜福利视频在线观看 | 国产亚洲成人网 | 天天干婷婷 | 精品不卡视频 | 在线精品亚洲一区二区 | 在线你懂的视频 | 午夜精品一区二区三区在线视频 | 免费欧美高清视频 | 麻豆传媒视频在线播放 | 国色天香永久免费 | 69国产精品视频免费观看 | 亚洲男模gay裸体gay | av免费在线观 | 久久免费资源 | 在线三级av | 欧美精品久久人人躁人人爽 | 中文字幕影视 | 五月激情丁香图片 | 一区二区不卡 | 久久精品一区二区国产 | 久久久一本精品99久久精品 | 一区二区精品视频 | 美女网站在线免费观看 | 99精品久久久久久久 | 久久久官网 | 黄网站免费看 | 日本一区二区三区视频在线播放 | 中文字幕在线观看的网站 | 精品国产片 | 国产精品va在线观看入 | 国产日韩欧美在线 | 国产大陆亚洲精品国产 | 欧美日韩国产一区二区三区在线观看 | 一区二区三区国产精品 | 免费视频99 | 日韩区欠美精品av视频 | 亚洲理论片在线观看 | 亚洲国产精品成人综合 | 99国产精品一区二区 | a级国产乱理论片在线观看 特级毛片在线观看 | 深爱五月激情网 | 在线观看日韩中文字幕 | 久久久亚洲电影 | 91精选| 永久中文字幕 | 久久九九影视网 | 亚洲综合在线视频 | 成年人黄色免费视频 | av看片网 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 欧美日韩国产一二 | 深夜男人影院 | 国产精品久久久久久久久大全 | 国内精品在线观看视频 | 色婷婷激情四射 | 全黄网站| av综合av| 精品久久九九 | 中文字幕丝袜一区二区 | 日韩精品视频第一页 | 国产一级大片在线观看 | 久久se视频 | 国产r级在线观看 | 奇米网在线观看 | 五月婷婷影院 | av丝袜在线 | 天天操天天爽天天干 | 毛片网站在线观看 | 又黄又刺激视频 | 最新动作电影 | 伊人电影天堂 | 中文字幕在线成人 | 狂野欧美激情性xxxx欧美 | 久久乐九色婷婷综合色狠狠182 | 91视频在线免费下载 | 欧美一区在线看 | 开心婷婷色 | 中文字幕免费不卡视频 | 亚一亚二国产专区 | 97电影网手机版 | 亚洲国产日韩欧美在线 | 色噜噜在线观看视频 | 国产一二三区av | 91人人澡| 欧美精品在线视频 | 超碰99在线 | 91av视频在线观看 | 手机av在线网站 | 国产在线97 | 亚洲欧洲日韩在线观看 | 色综合久久88色综合天天人守婷 | sesese图片| 国产亚洲精品久久久久动 | 丁香网婷婷 | 欧美日韩国产一区二区在线观看 | 99久久久国产精品免费99 | 国产黄色电影 | 欧美精品国产综合久久 | 欧美analxxxx | 午夜精品久久久久久久爽 | 色综合久久久久综合体桃花网 | 色狠狠干| 五月宗合网| 久久精品国产精品亚洲 | 国产成人久久av | 成人污视频在线观看 | 99操视频| 久草电影在线观看 | 国产人成看黄久久久久久久久 | 国色天香在线观看 | 国产精品女人久久久久久 | 亚洲欧美经典 | av色网站| 精品国产伦一区二区三区 | 久久久综合九色合综国产精品 | 在线97| 亚洲黄色小说网址 | 国产精品系列在线播放 | 国产精品99久久久久 | 国产一级淫片免费看 | 九九热在线精品视频 | 亚洲在线a | 久久精品女人毛片国产 | 中文区中文字幕免费看 | 一区二区精品久久 | 欧美成人久久 | 亚洲国产精品500在线观看 | 豆豆色资源网xfplay | 国产精品久久久区三区天天噜 | 日韩国产欧美在线播放 | 亚洲天堂激情 | 中文字幕久久久精品 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 在线影视 一区 二区 三区 | 91在线在线观看 | 久久综合九色欧美综合狠狠 | 狠狠躁日日躁狂躁夜夜躁av | 日韩av中文字幕在线免费观看 | 在线播放日韩 | 在线成人高清电影 | 亚洲精品视频免费 | av经典在线 | 久99久在线 | 久久影视中文字幕 | 成人黄色av免费在线观看 | 中文字幕中文中文字幕 | 精品国产一区二区三区久久久蜜月 | 日本黄色免费在线 | 国产女教师精品久久av | 天天插天天 | 在线亚洲欧美视频 | 九九免费精品视频在线观看 | 免费a网 | 欧美日韩xx | 免费观看视频的网站 | 91漂亮少妇露脸在线播放 | 天天色天天上天天操 | 国产成人高清 | 久久av伊人 | 久久免费观看视频 | 免费久久网站 | 97碰碰精品嫩模在线播放 | 精品国产理论片 | 国产香蕉视频在线观看 | 麻豆一区二区三区视频 | 免费看成人av | 国产无限资源在线观看 | 免费看黄色91 | 久久久久亚洲精品中文字幕 | 国产毛片久久久 | 五月婷婷一区二区三区 | 五月婷婷久久丁香 | 亚洲精品综合一二三区在线观看 | 天天操天天射天天爽 | 在线观看欧美成人 | 久草在线资源免费 | 国产精品久久久久久久午夜片 | 日批视频| 久热久草在线 | 亚洲精品乱码久久久久久按摩 | 中文字幕 国产专区 | 亚洲免费在线 | 久久久久久久久影院 | 天天操天天爽天天干 | 久久丁香 | 精品一区二区在线免费观看 | 国产在线不卡视频 | 国产精品久久久久久久久费观看 | 亚a在线 | 日本少妇高清做爰视频 | 黄色a在线观看 | 国产麻豆剧果冻传媒视频播放量 | 一区二区三区电影 | 久久视频在线免费观看 | 黄色高清视频在线观看 | 国产vs久久 | 国产不卡精品 | 国产精品麻豆视频 | 中文字幕亚洲欧美日韩2019 | 夜夜骑天天操 | 在线观看午夜 | 日韩欧美精品一区二区三区经典 | 国产成人精品一区二区三区福利 | www.福利视频 | 日韩精品91偷拍在线观看 | 亚洲码国产日韩欧美高潮在线播放 | 国产精品精品久久久 | 99精品视频免费在线观看 | 在线观看av中文字幕 | 国产精品1区 | 国产精品免费一区二区三区在线观看 | 97精品国产97久久久久久久久久久久 | 男女激情免费网站 | 亚洲黄在线观看 | 久久免费美女视频 | 免费大片黄在线 | 亚洲aⅴ在线 | 在线a视频免费观看 | 人人玩人人爽 | 人人揉人人揉人人揉人人揉97 | 精品一区二区在线免费观看 | 成人毛片100免费观看 | 国产不卡片 | 四虎小视频 | 麻豆91视频 | 黄色毛片电影 | 9色在线视频 | 国产91国语对白在线 | av 一区二区三区四区 | 肉色欧美久久久久久久免费看 | 天堂成人在线 | 在线一二三四区 | 日韩美在线观看 | 亚洲色综合 | 国产黄色片一级三级 | 精品嫩模福利一区二区蜜臀 | 成人激情开心网 | 久久国内免费视频 | 婷婷色在线观看 | 精品免费观看视频 | 亚洲综合在线观看视频 | 精品久久国产一区 | 欧美日韩在线视频一区 | 婷婷色吧 | 国产高清视频免费最新在线 | 国产直播av| 九九精品在线观看 | 成年人在线免费视频观看 | 久久网站最新地址 | 国产精品久久久久久一区二区 | 国产精品va在线播放 | 国产麻豆精品免费视频 | 黄色在线观看免费网站 | 啪啪午夜免费 | 18国产精品白浆在线观看免费 | 中文字幕你懂的 | 国产一区二区高清视频 | 免费看网站在线 | 成人av网页 | 亚洲永久精品在线观看 | 一级欧美日韩 | 国产精品九九久久久久久久 | 欧美日韩裸体免费视频 | 日韩欧美大片免费观看 | 91丨九色丨91啦蝌蚪老版 | 久久精品免费 | 五月综合网站 | 91九色视频| 成年性视频 | 女人高潮一级片 | 国产精品午夜av | 亚洲最大av在线播放 | av动态图片 | 亚洲激情视频在线观看 | 日韩电影在线观看一区 | 偷拍精偷拍精品欧洲亚洲网站 | 天天看天天干 | 国产三级午夜理伦三级 | 免费在线成人av电影 | 日韩中文字幕免费在线观看 | 日日成人网 | 久久伦理网 | 久久视频免费在线 | wwwwwww色| 久久综合综合久久综合 | 久久看片网 | 欧美激情精品久久久 | 91久久久久久国产精品 | 国产xxxx做受性欧美88 | 欧美一级在线看 | 中文字幕视频一区二区 | 久久99久久99精品免视看婷婷 | 免费网站看av片 | 亚洲三级精品 | 毛片.com| 狠日日| 久久精品视频网站 | 亚洲精品视频一 | 96精品在线 | 久久免费激情视频 | 欧美日韩国产精品一区二区三区 | 碰碰影院 | 五月婷婷激情网 | 天天干夜夜擦 | 在线免费观看视频 | 欧美日韩亚洲国产一区 | 久久免费福利视频 | 欧美成人黄色片 | 91 在线视频| 成人综合婷婷国产精品久久免费 | 日韩网站中文字幕 | 亚洲欧美综合精品久久成人 | 在线视频91| 国产又黄又爽又猛视频日本 | 欧美日韩中文另类 | 五月天色网站 | 国产精品99久久久久久久久久久久 | 日韩爱爱网站 | 国产精品一区二区av影院萌芽 | sm免费xx网站 | 日精品在线观看 | 色老板在线 | 国产高清视频在线免费观看 | 天天做夜夜做 | 夜色资源站wwwcom | 91大神精品视频在线观看 | 欧美日韩免费一区二区三区 | 色狠狠久久av五月综合 | 亚洲视频在线免费观看 | 日韩色高清 | 99久久这里有精品 | 国产成人久久精品亚洲 | 中文字幕在线视频第一页 | 精品播放 | 国产中文a | 欧美日产一区 | 人人草在线观看 | 欧美一级小视频 | 国产又粗又硬又长又爽的视频 | 欧美日韩国产精品一区 | 日韩免费看 | 日韩欧美视频免费在线观看 | 亚洲欧美日韩一区二区三区在线观看 | 综合国产在线观看 | 欧美日韩1区2区 | 免费视频97| 久久人人爽人人爽人人片av免费 | 69国产成人综合久久精品欧美 | 天堂久久电影网 | 久久免费视频在线观看6 | www.91成人 | 亚洲人成免费网站 | 欧美日韩一级久久久久久免费看 | 中文字幕日韩国产 | 色综合久久久久综合99 | 国产成人黄色在线 | 亚洲片在线观看 | 中文字幕一区二区三区在线视频 | www.婷婷com| 日日夜夜91 | 欧美一二三区在线播放 | 又爽又黄又无遮挡网站动态图 | 久久夜色精品国产欧美一区麻豆 | 日本精品一二区 | 中文字幕在线不卡国产视频 | 国产91免费在线 | 亚洲高清免费在线 | 免费网站在线观看成人 | a天堂最新版中文在线地址 久久99久久精品国产 | 在线免费观看一区二区三区 | 天天干亚洲 | 久久成人国产精品 | 一二三区视频在线 | 国产91精品在线观看 | 操操操影院 | 国产精品久久久精品 | 日本午夜在线亚洲.国产 | 婷婷久久综合九色综合 | 四虎8848免费高清在线观看 | 国产黄色片免费 | 日本久草电影 | 500部大龄熟乱视频 欧美日本三级 | 丁香久久 | 久久精品美女视频网站 | 国产视频欧美视频 | 久久国产视频网站 | 日韩在线在线 | 日本一区二区高清不卡 | 天天爽天天搞 | 8x成人在线| 国模视频一区二区 | 狠狠色丁香婷婷综合基地 | 99久久精品久久久久久动态片 | 99色婷婷| 超碰人人在线 | 午夜精品久久久久久久爽 | 99在线精品视频 | 久久精品一区二区三区中文字幕 | 天天做天天爱天天爽综合网 | 免费日韩在线 | 五月婷婷激情五月 | 天天色棕合合合合合合 | 久久久久www | 久久福利精品 | 天天爽天天爽天天爽 | 久久免费视频7 | 99精品免费久久久久久久久 | 欧美日韩久久久 | 国产精品亚洲综合久久 | 久久伊99综合婷婷久久伊 | 国产尤物一区二区三区 | 丁香花在线视频观看免费 | 五月天网页 | 日本最新中文字幕 | 精品国产一区二区三区在线 | 久久久久久久久影视 | 97超碰人人澡 | 国产999在线 | 亚洲成av人影院 | 在线观看视频一区二区三区 | 日韩在线视频精品 | 国产精品网站一区二区三区 | 亚洲永久精品国产 | 五月天婷亚洲天综合网精品偷 | 国产91精品看黄网站在线观看动漫 | 久久ww| 中文在线免费一区三区 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 国产不卡av在线 | 丝袜制服天堂 | 天天爽人人爽 | avav片| 国产精品a久久 | 国产一区在线视频 | 九九精品视频在线观看 | 国产亚洲欧洲 | 操久在线 | 黄色三级在线看 | 欧美伦理电影一区二区 | 主播av在线| 日本不卡一区二区 | 不卡的av在线播放 | 香蕉久草在线 | 久久综合加勒比 | 九九99视频 | 色偷偷男人的天堂av | 三上悠亚在线免费 | 日日碰狠狠添天天爽超碰97久久 | 国产一区在线视频观看 | 午夜电影中文字幕 | 亚洲香蕉视频 | 超碰免费久久 | 黄色不卡av | 88av色 | 亚洲狠狠操 | 日韩在线 | 免费看国产a | 免费av福利 | 91麻豆视频 | 久久视频一区 | 中文字幕一区二区三区四区久久 | 国产精品激情偷乱一区二区∴ | 国产特级毛片aaaaaa | 久久久久久蜜av免费网站 | 在线观看v片| 在线中文字母电影观看 | 精品久久久久久国产 | 国产精品青草综合久久久久99 | 精品亚洲视频在线观看 | 国产精品九九热 | 在线观看视频亚洲 | 免费精品久久久 | 久久精品5 | 99精品视频在线免费观看 | 播五月婷婷 | 日韩精品视频免费在线观看 | 日韩精品一区二区三区三炮视频 | 日本激情视频中文字幕 | 4p变态网欧美系列 | 婷婷激情av | 婷婷激情网站 | 狠狠躁夜夜躁人人爽超碰91 | 成人a v视频 | 黄色精品一区二区 | 狠狠干美女 | 91日韩在线专区 | 成全免费观看视频 | 亚洲精品国产视频 | 日韩欧美一区二区在线观看 | 久久久久久久久久久高潮一区二区 | 久久综合狠狠综合久久综合88 | 中文字幕日韩一区二区三区不卡 | 四虎影视成人永久免费观看视频 | 亚洲欧美婷婷六月色综合 | 人成在线免费视频 | 97在线观看免费观看高清 | 久久噜噜少妇网站 | 国产成人精品一区二 | 国产 日韩 在线 亚洲 字幕 中文 | 国产免费不卡av | 亚洲精选在线观看 | 蜜臀久久99静品久久久久久 | 久草免费在线观看视频 | 精品久久免费看 | 中文字幕观看在线 | a在线观看视频 | 综合久久久 | 日韩av中文在线 | 欧美国产日韩一区二区 | 中文在线字幕免费观 | 干av在线 | 成人免费观看视频网站 | 丁香久久| 国产精品成人免费一区久久羞羞 | 国产精品久久久久免费观看 | 91亚洲精品国偷拍自产在线观看 | 国产乱对白刺激视频不卡 | 日韩免费观看一区二区 | avcom在线| 国产精久久久久久妇女av | 欧美在线久久 | 中文字幕人成不卡一区 | 国产精品激情偷乱一区二区∴ | 婷婷在线看 | 欧美日韩在线视频观看 | 波多野结衣视频一区 | 综合久久综合久久 | www.91国产 | 成年人免费观看国产 | 999视频在线观看 | 亚洲激情综合 | 日韩毛片在线免费观看 | 亚洲精品免费在线播放 | 女女av在线 | 美女视频黄频大全免费 | 中文字幕在线不卡国产视频 | 久久久激情视频 | 久久久久久网 | 亚洲天天摸日日摸天天欢 | 91大神一区二区三区 | 日韩国产高清在线 | 亚洲电影在线看 | 综合网伊人| 中中文字幕av在线 | 久久在线 | 国产 视频 久久 | 日韩综合视频在线观看 | 免费视频97 | 国产黄色免费观看 | 很黄很色很污的网站 | 国产精品2区 | 99热 精品在线 | 久久久成人精品 | 成人亚洲精品久久久久 | 九九免费在线观看视频 | 亚洲色综合 | 中文在线中文资源 | 精品日韩在线一区 | 伊人狠狠色丁香婷婷综合 | 夜夜干夜夜 | 国产不卡免费 | 欧美性极品xxxx娇小 | 国产精品热视频 | 91亚洲视频在线观看 | 免费观看成人av | 日韩在线大片 | 一级片视频在线 | 久久精品精品 | 在线看的av网站 | 美女一级毛片视频 | 久久激情五月激情 | 天天操天天射天天爱 | 久久综合爱| 精品一区二区综合 | 精品国产1区2区3区 国产欧美精品在线观看 | 美女网站免费福利视频 | 天天干天天拍天天操天天拍 | 久久草| 欧美精品久久天天躁 | 欧美日韩国产精品一区二区三区 | 日韩视频a | 这里只有精彩视频 | 狠狠综合久久av | 日韩成人在线免费观看 | 国产视频99 | 国产二区免费视频 | 不卡的av在线 | 就要色综合 | 四虎在线永久免费观看 | 国产黄免费 | 国产精品亚州 | 日韩欧美视频免费在线观看 | 狠狠色丁香婷婷综合橹88 | 国产精品视频地址 | 国产日韩在线视频 | 国产精品尤物视频 | 国产在线观看免费 | 免费美女av | 久久亚洲电影 | 999抗病毒口服液 | 婷婷色 亚洲 | 久久精品国产一区二区三区 | 182午夜在线观看 | 一区二区视频在线观看免费 | 一级成人免费视频 | wwwww.国产| 97自拍超碰 | 精品久久网站 | 国产精品成人久久 | 国产成人av一区二区三区在线观看 | www五月| 日韩国产高清在线 | 狠狠色伊人亚洲综合网站野外 | 日韩视频免费观看高清完整版在线 | 亚洲天堂自拍视频 | 国产高清免费视频 | 精品国产区在线 | 日韩精品免费在线视频 | 操操操日日 | 99综合电影在线视频 | 波多野结衣在线观看一区二区三区 | 黄a网 | 日韩一区二区三区不卡 | 亚洲国产日韩欧美 | 日本aaa在线观看 | 亚洲另类人人澡 | 欧美少妇bbwhd | 国产精品18久久久久久不卡孕妇 | 91网在线| 日韩三级不卡 | 国产第一福利网 | 啪啪动态视频 | 久产久精国产品 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 午夜精品一区二区三区可下载 | 蜜臀av性久久久久av蜜臀三区 | 国产精品igao视频网网址 | 91精品国产成人观看 | 国产精品不卡视频 | 色婷婷久久 | 亚洲成人黄色av | 三级黄在线 | 九九日韩 | 国产又粗又猛又爽 | 蜜桃av久久久亚洲精品 | 亚洲免费在线观看视频 | 国产黄色片久久久 | 欧美在线视频免费 | 久久精品中文字幕 | 欧美日韩电影在线播放 | 亚洲综合一区二区精品导航 | 久久最新| 久久99免费视频 | 91在线免费播放 | 成人蜜桃视频 | 久久精品一级片 | 亚洲 成人 欧美 | 伊人五月天.com | 开心综合网 | 三级视频片 | 成人动漫视频在线 | 人人添人人澡人人澡人人人爽 | 亚洲色影爱久久精品 | 少妇搡bbbb搡bbb搡忠贞 | 免费日韩一级片 | 国产国产人免费人成免费视频 | 91在线视频导航 | 日韩三级视频 | 国产精品第一页在线观看 | 婷婷综合久久 | 国产一级在线观看视频 | 国产黄色片在线免费观看 | 色综合久久久久久久 | 日本精品在线视频 | 久草在线在线精品观看 | 精品久久久影院 | 国产精品久久一 | 久久婷婷一区二区三区 | 97超碰国产精品 | 国产精品久免费的黄网站 | 色噜噜狠狠色综合中国 | 精品一区二区三区香蕉蜜桃 | 99这里只有久久精品视频 | 91av在线免费观看 | 西西4444www大胆视频 | 五月婷婷中文网 | 亚洲三级黄 | 久久99国产精品久久 | 中文字幕国产一区二区 | 在线免费黄色毛片 | 欧美国产日韩一区二区三区 | 丁香婷婷深情五月亚洲 | 香蕉久久久久 | 国产视频高清 | 日韩欧美精品一区 | zzijzzij亚洲日本少妇熟睡 | 久久成人精品视频 | 成人av免费在线观看 | 91网免费看 | 就要干b | 久久av中文字幕片 | 亚洲第一av在线播放 | 中文字幕免费高清av | 久久伊99综合婷婷久久伊 | 亚洲欧美日韩中文在线 | 国产精品二区三区 | 超碰免费av| 亚洲精品婷婷 | 福利片免费看 | 在线播放 日韩专区 | 日韩成人精品一区二区三区 | 丁香在线观看完整电影视频 | 国产精品24小时在线观看 | 少妇搡bbbb搡bbb搡忠贞 | 九九久久免费视频 | 超碰在线免费福利 | 综合国产视频 | 欧美一区二区在线免费看 | 在线播放 日韩专区 | 在线观看视频一区二区三区 | 国产手机av在线 | 亚洲成av人影片在线观看 | 中文字幕在线观看三区 | 久久久精品欧美 | 欧美韩日精品 | 久热免费在线观看 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 国产精品成人a免费观看 | 国产视频色 | 日韩欧美精选 | 日韩在线视频一区二区三区 | 国产在线小视频 | 九九热视频在线播放 | 久草在线视频免费资源观看 | 黄色免费高清视频 | 天天插综合 | 国产精品久久久av久久久 | 99热只有精品在线观看 | 狠狠色综合欧美激情 | 欧美一级免费黄色片 | 免费在线观看国产黄 | 啪啪小视频网站 | 亚洲男男gaygay无套 | 亚洲片在线 | 亚洲免费av片 | 国产精品 国内视频 | 亚洲国产精品成人女人久久 | 在线观看aaa | 激情欧美国产 | 久草视频国产 | 91成人国产 | 精品欧美在线视频 | 五月综合色婷婷 | 国产高清小视频 | 日韩久久久久久 | 中文区中文字幕免费看 | 国产精品久久久久久久久久白浆 | 国产精品久久久久久婷婷天堂 | 日韩免费av网址 | 亚洲精品小视频 | 在线国产中文字幕 | 亚洲网站在线 | 9999精品 | 欧美性生活一级片 | 国产99久久久精品 | 色婷婷激情网 | 狠狠操91 | 国产精品婷婷午夜在线观看 | 天天操导航 | 中文字幕一区二区三区四区视频 | 国产视频亚洲 | 99在线国产 | 婷色在线| 日韩在线视频线视频免费网站 | 三级视频片 | 高清国产一区 | 99999精品 | 一级精品视频在线观看宜春院 | 国产精彩视频 | 97av视频在线观看 | 免费国产一区二区视频 | 96亚洲精品久久久蜜桃 | 色干干 | 国产一区在线观看视频 | av免费观看高清 | 久久免费资源 | 久久久国产网站 | 91九色综合 | 69国产精品成人在线播放 | 久久久精品一区二区三区 | 成人高清在线观看 | 亚洲小视频在线 | 成人综合婷婷国产精品久久免费 | 中文字幕91在线 | 午夜精品久久久久久久久久 | 欧美成年人在线观看 | 久草影视在线观看 | 久久久午夜电影 | 国产高清视频在线 | 中文字幕在线播放第一页 | 精品久久久免费视频 | 99福利影院| 亚洲国产无| 国产成人一区二区三区久久精品 | 在线观看中文字幕亚洲 | av天天草| 美女网站黄在线观看 | 国产一区在线免费 | 久久精品毛片 | 久久国产色 | 九九爱免费视频在线观看 | 成人免费观看网站 | av综合av| 日本精品一区二区在线观看 | 人人精品 | 中文字幕一区二 | 一区 在线观看 | 天天操天天弄 | 亚洲国产成人精品在线观看 | 日韩欧美一区二区三区黑寡妇 | 免费色视频在线 | 国产福利免费看 | 久久久久久久毛片 | 国产一级二级在线观看 | 中文字幕日本电影 | 麻豆精品传媒视频 | 日本一区二区三区免费看 | 在线看片一区 | 国产一级精品在线观看 | av一级一片 | 一级片免费观看视频 | 亚洲精品高清一区二区三区四区 | 成人av影视 | 国产亚洲一区二区在线观看 | 99热这里只有精品久久 | 操操操日日日干干干 | 91一区二区三区在线观看 | 国产97在线视频 | 日韩视频区 | 欧洲av不卡 | 国产免费观看高清完整版 | 久久视频热 | 亚洲精品2区 | www.久久久.com| 欧美视频日韩视频 | 一区精品在线 | 五月天久久婷 | 久久国产精品一二三区 | 婷婷久月 |