整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Java 能抵擋住 JavaScript 的進攻嗎?

          Java 能抵擋住 JavaScript 的進攻嗎?

          者 | 劉欣

          本文經授權轉自公眾號“碼農翻身”

          JavaScript 的進攻

          公元 2014 年,Java 第八代國王終于登上了王位。

          第一次早朝,國王坐在高高的寶座上,看著畢恭畢敬的大臣,第一次體會到了皇權的威力。

          德高望重的 IO 大臣顫悠悠地走上前來:“啟稟陛下,昨日收到戰報,有個叫做 Node.js 的番邦又一次向我國進攻,我邊防將士死傷慘重。”

          “Node.js? 那是什么東西?” 國王心中一樂, 還真有人自不量力,想蚍蜉撼樹。 想我 Java 帝國人口之眾多,疆域之廣闊,踩死你小番邦還不像踩死一只螞蟻似的。

          “那是用 JavaScript 寫的一個框架。” IO 大臣看到國王不知道 Node.js,心里一沉。

          “JavaScript?愛卿說笑了,一個在瀏覽器中運行的東西,怎么可能進攻我 Java 后端。”

          “陛下有所不知,這 JavaScript 發展迅猛,不僅占領了前端,還通過 Node.js 向后端,尤其是我國滲透,臣還聽說他們用 Electron 開始蠶食桌面開發了!”

          “竟有這等事!難道他們想通吃?我們不是有 Tomcat 嗎?派 Tomcat 去把 Node.js 給鎮壓了。”

          國王開始怨恨自己的父親 JDK 7 世和祖父 JDK 6 世沒把這個 Node.js 當成一回事,沒有把 Node.js 給扼殺在搖籃之中,把這個禍害留給了自己,心里開始發虛。

          非阻塞異步 IO

          線程大臣走上前來:“陛下,Tomcat 已經率軍和 Node.js 惡戰了幾日,敗下陣來, 這 Node.js 有個獨門武器,叫做‘非阻塞異步 IO’。”

          “非阻塞? 我聽說我們的 Tomcat 也能實現非阻塞啊!” 國王有點驚訝。

          “不行的,陛下,Tomcat 在處理連接的時候能實現非阻塞,但是在真正處理請求的時候還是需要同步操作,一個請求對應一個線程來處理,不像 Node.js 那樣,都是異步操作,只有一個主線程在忙活。” 線程大臣做了一個簡明扼要的匯報,不知道國王能否聽懂。

          注: Node.js的故事請參見《Node.js: 我只需要一個店小二》

          “眾位愛卿,你們說說該怎么辦? 總不能讓這小小番邦屢次欺負我堂堂 Java 帝國吧。”

          “臣倒是有一計,” 集合大臣說道,“這 Node.js 雖然來勢洶洶,但是它也有個致命的缺點,那 JavaScript 是個動態語言,無法進行編譯時類型檢查,錯誤只有等到運行時才能暴露出來。用它開發個小項目還可以,一旦項目變大,代碼變多,人員變多,那就會變成噩夢了。”

          “愛卿說說具體怎么辦?”

          “我們可以派一些臥底去 Node.js, 到處傳播這樣的消息,瓦解他們的軍心和士氣,讓他們認為 Node.js 寫的系統,很快就會腐化,最終還是要用我堂堂正正的 Java 語言來重寫。”

          “嗯,此乃心理戰也,至少會穩住一些墻頭草,準奏,由愛卿來安排。 ” 國王說道,“不過,此法治標不治本,還是得想辦法直接把他們打敗。”

          “陛下真乃一代圣君,” 線程大臣馬上開始拍馬屁,與此同時,巧妙地把矛頭轉向老不死的 IO 大臣:“我 Java 帝國在第 4 代國王的時候就出現了非阻塞 IO,這么多年過去了,居然還沒發展出類似 Node.js 的系統,實在是不應該啊。”

          “老不死”的 IO 大臣是何等精明:“陛下明鑒, 我 Java 帝國應用服務器一直以來都是 Tomcat 獨大,他們采用了線程池,每個請求一個線程的方式,我也不好干預。”

          IO 大臣把責任推得一干二凈。

          “沒錯,” 集合大臣為 IO 大臣打抱不平,兩肋插刀,“還有一點就是這異步編程,聽起來很好,但是寫起來可就要命了,那么多的回調,簡直就是反人類,臣民們戲稱為回調地獄,沒人愿意那么寫,發展不起來也很正常。”

          線程大臣馬上接口:“此言差矣,陛下已經教會了臣民們如何使用 Lambda 表達式,并且現在也出現了 RxJava,已經沒什么回調地獄了!”

          “那是現在,以前可沒有!”

          “......”

          國王看到這幾位大臣要打起來,馬上施展和稀泥之術:“眾位愛卿各有道理,你們且說說,怎么才能打敗著來勢洶洶的 Node.js 吧。”

          沒人說話。

          國王只好退朝。

          京城酒館

          京城的小酒館向來是一個多方消息的集散地。

          一個金發碧眼的小伙子正在“危言聳聽”:“聽說了沒有,Node.js 又贏了幾仗,Tomcat 大軍死傷慘重,有不少臣民都投奔到那個番邦去了。”

          “這異步操作真的有這么厲害?” 有人問道。

          小伙子喝了一口酒: “其實不是異步操作更好,而是在高并發的環境異步操作更有效,大家都知道, 一個機器能支持的線程數目是有限的,不可能一直增加。Tomcat 那種一個請求一個線程的方式很快就會遇到瓶頸。”

          “你說說,到底有什么好處?”有人刨根問底。

          “現在服務器端的操作無非就是操作文件,讀寫數據庫,訪問遠程服務,這些都是所謂阻塞操作。” 小伙子展開了一張圖:

          “橙色的都是 IO 操作,綠色的才是真正的線程執行, IO 操作非常耗時,線程大部分時間都浪費在了等待上面!如果能讓線程不要等待,去做別的事情,那用少量的線程,甚至一個線程就可以了。”

          眾人紛紛點頭, 這小伙子已經看出了問題的關鍵,現在的很多系統,都是 IO 密集的, 高并發情況下,如果一個請求一個線程,浪費巨大。

          “想我 Java 虛擬機如此強悍,如果能實現異步操作,那還不把 Node.js 秒成渣?!”小伙子狠狠地用手錘了一下桌子。

          正在此時,酒館沖進一隊士兵,趕走眾人,圍住小伙子,領頭的喝問到:“大膽刁民,竟然到處宣揚異步思想,給我帶走!”

          士兵惡狠狠地把他五花大綁,推出門去, 留下一堆人在那里議論紛紛。

          IO 王府

          “我讓你們把他請來,怎么綁來了?快松綁!” IO 大臣呵斥完下屬,轉頭親切地問道:“叫什么名字啊?”

          “小人蒂姆, Tomcat 府上的幕僚。 ” 蒂姆一邊說一邊揉肩膀。

          “Tomcat 府上的人......” IO 大臣捻著胡須若有所思。

          “是的,大人,我還見過您呢,您上次半夜去 Tomcat 府上密談......”

          “住口! ” IO 大臣趕緊轉換話題, “我的下屬發現你到處宣揚異步思想,究竟要干什么? ”

          “小人發明了一個系統,叫做 Node.x。 ”

          “為什么不獻于 Tomcat 將軍?”

          “唉,小人進言多次,可是將軍不聽啊!”

          “你說說看,這是個什么東西? 是要模仿 Node.js 嗎?” IO 大臣問道。

          之前蒂姆給 Tomcat 將軍講述過 Node.js, 他理都不理,經常是一甩袖子就走, 自己是空有一身本領卻無人賞識, 難道這 IO 大臣能幫自己一把? 想到此處,蒂姆精神大振。

          “確實受到了它的啟發, 但是我的 Node.x 在架構和一些關鍵的抽象上和 Node.js 有很大不同。” 蒂姆不好意思地笑了笑,“先說說相同的部分,既然都是異步操作,那肯定是通過事件驅動的,所以都有一個事件循環。”

          IO 大臣之前和 Swing 大臣聊過, 知道事件循環是怎么回事,這是一個相當古老的概念了。

          無非就是有個線程在檢測一個隊列,如果隊列中有事件,就拿出來處理。

          “只不過我這里有所不同,可以創建多個事件循環出來,比如每一個 CPU 核心有一個,這樣可以充分利用 CPU 的多核性能。” 蒂姆得意地說道。

          (4 個 CPU Core, 4 個事件循環)

          IO 大臣點頭表示贊許, 他聽說 Node.js 好像只有一個主線程,沒法直接利用多核的能力。想利用多核的話還得開多個進程才行。

          異步操作

          “你圖中的那個 Hanlder 就是具體的業務代碼所在地吧? 具體長什么樣子啊,讓我看看!” IO 大臣問道。

          蒂姆趕緊呈上代碼,這是簡單的 Hello World。

          import io.vertx.core.AbstractVerticle;
          public class Server extends AbstractVerticle {
           public void start() {
           vertx.createHttpServer().requestHandler(req -> {
           req.response()
           .putHeader("content-type", "text/plain")
           .end("Hello Word!");
           }).listen(8080);
           }
          }
          

          這段代碼生成了一個簡單的 HTTP 服務器, 在 8080 端口監聽, 每當有請求來的時候,都返回一個字符串“Hello World!”。

          IO 大臣一看,大為吃驚:“你這代碼不需要外部容器,自己就搞了一個 HTTP 服務器啊?”

          “是的,這樣我們就完全不用 Tomcat 了。我把這種類起了一個名稱,叫做 Verticle, 部署以后,這個 Verticle 就可以和一個事件循環關聯了。每次有 HTTP 請求過來,Node.x 會封裝成事件,然后分派給它處理了。”

          真是個二愣子, IO 大臣心想, 怪不得 Tomcat 對你不待見,你這個東西出來,他的位置不保啊!

          IO 大臣問道:“那對于數據庫查詢,你這個 Handler,哦不,Verticle 該怎么寫? 查詢數據庫這么慢,豈不是把事件循環都阻塞了?什么事情都做不了了?”

          “大人您忘了,我們這里操作必須都是異步的,查詢數據庫也不例外。”

          蒂姆說著展示了一段代碼, 通過異步的方式來查詢數據庫。

          public class DatabaseVerticle extends AbstractVerticle{
           ......
           dbClient.getConnection(ar -> {
           if (ar.succeeded()) {
           SQLConnection connection=ar.result();
           connection.query("select .. from...", res -> { 
           if (res.succeeded()) {
           ......
           } else {
           ......
           }
           });
           } else {
           ......
           }
           });
          }
          

          IO 大臣感慨道:“唉,老了,真是不中用了,連異步都忘了。對了,這些個 Verticle 看起來都是獨立的,是被不同的線程調用的,他們之間怎么進行交互啊?難道也通過共享內存的方式?”

          “大人真是厲害,一下子就問到了核心問題,不能讓他們共享內存,那樣就需要加鎖了,我這里引入了 Event Bus 的方法,讓他們之間通過消息傳遞。”

          “嗯,不錯,實現了低耦合。”

          “不僅如此,這些 Verticle 還可以部署到不同的 JVM 中,通過 Event Bus 實現真正的分布式通信。” 蒂姆又拋出一個重磅炸彈。

          “如此甚好!” IO 大臣愛才之心驟起, “你愿不愿意到老夫府上做幕僚啊?”

          “小人愿意追隨大人!”

          “好!明日早朝,你隨我入宮,面見圣上,老夫保你一世榮華富貴。 ”

          為什么是 Vert.x?

          第二日早朝,IO 大臣迫不及待地給國王報喜:“陛下,我 Java 帝國也可以采用非阻塞異步編程了!擊敗 Node.js 之日可待。”

          IO 大臣講述了昨晚的情況, 細數了 Node.x 的種種好處。

          Tomcat 將軍臉上極為難看, 趕緊阻止:“陛下不可,我 Java 帝國采用同步處理已經很久了,臣民們已經習慣了,現在改成異步,怕激起民變。”

          “愛卿不要低估臣民采用新技術的能力嘛, 宣蒂姆進殿,呈上代碼。”

          蒂姆都不敢看 Tomcat, 從懷里掏出一張紙,雙手奉上。

          vertx.createHttpServer()
           .requestHandler(function (req) {
           req.response()
           .putHeader("content-type", "text/plain")
           .end("Hello World");
          }).listen(8080);
          

          國王盯著看了半天:“嗯?不對啊,你這不是 Java 代碼吧?”

          Tomcat 拿過國王遞過來的代碼,掃了一眼:““大膽! 你竟然敢在朝堂之上公然宣傳 JavaScript,來人,拿下!”

          “陛下息怒,這是小人制定的一個策略,我的 Node.x 支持很多語言編程, 除了 Java 之外,還有 JavaScript、Ruby、Scala、Kotlin 等等。”

          “哦? 是嗎? 這還能把番邦的人給吸引過來呢!你說呢,Tomcat 將軍?” 國王說道。

          Tomcat 有些不自在,想找回場子:“嗯嗯,有一定道理,不過這個 Node.x 這個名字不好,拾人牙慧,讓人看低我堂堂 Java 帝國。”

          “Node 是節點的意思,朕把他改成 Vertex 如何?也是節點的意思。”

          “ 陛下圣明,可否叫做 Vert.x ? ” IO 大臣提議。

          “好,準奏,即日起,命你和蒂姆訓練臣民使用 Vert.x,一個月后向 Node.js 開戰!” 國王已經忍 Node.js 很久了。

          不,不能讓 IO 大臣的 Vert.x 一家獨大!

          國王突然想到了親爹留下來的祖訓, 帝王之術是一定要平衡朝局。

          “吩咐下去,今晚朕要和 Spring 將軍,嗯,還有線程大臣,共進晚餐,朕有些事情要和他們好好談談......”

          *本故事純屬虛構,如有雷同,純屬巧合。

          聲明:作者獨立觀點,不代表 CSDN 立場。

          下討論只針對PC端和移動端。

          Java最大的優勢真的在于跨平臺嗎?

          以前是,但現在已經不是了。

          有跨平臺需求的僅僅是客戶端應用,而不是服務端。例如桌面應用,你的客戶可能是Windows用戶,也可能是Linux用戶,這時候如果不想多投入成本對各個平臺進行適配,那么Java所謂的“Write once, run everywhere”就顯得異常光彩。然而今天,整個軟件世界都在向B/S應用傾倒(嵌入式除外),即使要做客戶端跨平臺,QT等第三方框架遠遠比Swing更強大,Java在桌面應用領域基本被淘汰已經是不爭的事實了,而當初Java引以為豪的Applet也早已銷聲匿跡。如果說客戶端Java還有一點優秀的話,那只有Android了。安卓最初確實靠JVM屏蔽了不同硬件設備之間的區別并取得了巨大的成功,但在今天,Android L中ART模式的出現也即將顛覆這一情況,況且Google還可能會想用自家的Go語言取代Java成為Android平臺的第一語言。所以在客戶端,Java幾乎完敗

          服務端應用不需要跨平臺。做一個Web服務器,我想沒有哪家公司今天用Linux,下個月就換Windows吧?如果僅僅是更換Linux發行版,如從Debian到Fedora,本質上講其Linux內核是不變的,因此像C++這樣純編譯類型的語言已經沒什么問題。如果做游戲服務器,我想幾乎都會選擇Linux而不是Win平臺。Java的跨平臺優勢的實用性其實已經被大大弱化了,可以說在實際應用中并不明顯,在一般情況下幾乎感知不出Java還能跨平臺這個特性。作為三大商用JVM之一的JRockets是只有編譯器的JVM,即應用啟動時會將字節碼全部編譯為本地機器碼,這其實就很大程度上摒棄了跨平臺,而追求性能。

          今天,Java最大的優勢在于其龐大而完善的生態系統。一門編程語言是否能流行,主要是由其生態系統決定的。Java生態系統的完善性主要體現在以下幾個方面:

          Java擁有世界上數量最多的程序員。你說他們是農民也好,但數量放在那里,最明顯的效果就是公司招人的時候會比較容易地招到Java程序員。試想如果你想要做一套軟件,你有一個很棒的技術方案需要用C++,Scala或Ruby等語言實現,但招不到足夠的人手,那么計劃多半泡湯。這時候你的應用Java也能做到,并且很輕松就能招到足夠的人,那么你選擇Java的可能性就要大一些。

          Java擁有大量的第三方類庫。假如你想解析HTML,用C/C++這類語言恐怕多半只能自己編寫解析算法庫了,而如果是Java,你可以非常輕松地在Github上找到JSoup,使用Maven導入依賴后分分鐘就搞定HTML。為此還有一句諷刺Java的話是:“我們不生產代碼,我們只是Github的搬運工。”這句話從字面上看是很有道理的,但卻忽略了對軟件生產效率的提升所帶來的巨大價值。對于軟件的開發,公司的唯一成本其實就是“人頭費”,每減少一個月開發時間,就能幫助公司節省幾十萬幾千萬的研發成本。

          Java擁有功能強大的IDE。Eclipse,通過插件幾乎可以滿足你開發的任何需求。它雖然有些慢,但你可以通過JVM調優來提高程序的流暢度,千萬不要使用默認的JVM參數。不過,IntelliJ Idea已經完全超越Eclipse了,Idea的智能程度幾乎可以媲美Win平臺下的VS。我是那類離了Vim就活不下去的人,在這兩款IDE中都有Vim插件從而讓我愉快地存活下去。

          Java擁有很多殺手級應用。不必多說,Spring, Struts, Hibernate, Hadoop, Tomcat, JBoss等等。

          Java的語法特性很少。對,這也是一項優點。C++相比C添加了大量特性,學起來費事不說,用起來還會降低代碼可讀性,其實是費了工夫不討好。當今世界對編程語言的要求是語法簡單,代碼可讀,對性能已經是退而求其次了,因此才誕生了Python, Ruby這樣的編程語言。有很多人批評Java語法寫起來很臃腫,我承認這一點,但事實是,編程語言從來都不是因為語法臃腫而被淘汰的,決定其生死的是生態系統。對于批評者,引用知乎的一句話:“動態類型一時爽,代碼重構火葬場”

          Java的性能已經足夠高了。Sun/Oracle的HotSpot JVM內置的JIT編譯器在運行時對字節碼已經做出了非常大的優化努力,服務端應用啟動后對JVM進行足夠的“預熱”,并給出合理的啟動參數即可。如果不是對性能十分敏感的系統類應用,Java已經足夠快了。有一種簡單可行的方法可以形象地看出這點,在JVM啟動參數中添加+XX:PrintCompilation可以看到JIT編譯器的忙碌。當今世界對軟件的需求量越來越大,在性能可接受的情況下,開發效率才是第一位的,這也是Python這類動態腳本語言流行的主要原因。

          以上僅做客觀分析,并不想引起語言戰爭。畢竟,沒有最好的語言,只有最適合某種項目的語言。引用黑格爾的一句話:“存在即合理。”

          者 | Yanique Andre

          譯者 | Arvin,責編 | 屠敏

          頭圖 | CSDN 下載自東方 IC

          出品 | CSDN(ID:CSDNnews)

          以下為譯文:

          JavaScript被淘汰了嗎?

          我在許多不同的網站(最近是在Quora)上多次閱讀到這個問題,我一直在想這是不是真的。我在2018年才開始web開發,所以我不了解JavaScript的歷史,也不了解它在開發領域的現狀。

          因此,我進行了一些研究去了解JavaScript的過去和現在,我發現的結果相當令人震驚。

          我們曾經認識的JavaScript確實已經死了。

          自1995年首次建立JavaScript以來,JavaScript一直存在很多問題。盡管進行了一些更新,但許多主要問題仍然沒有得到解決。

          JavaScript的一些問題包括:

          • 缺少模塊系統

          • 弱類型

          • 高度依賴全局變量

          • 由于語法的原因很難找到錯誤

          在過去的十年中,用該語言很難創建框架。AngularJS最初是基于JavaScript的框架,直到遇到擴展框架的問題,所以他們決定使用TypeScript(JavaScript的一種變體)重新編碼整個框架,并將其重命名為Angular。

          人們對JavaScript的興趣似乎也在下降。通過查看過去5年“JavaScript”一詞在google上的搜索頻度,似乎也能看到這門語言正在慢慢走向衰落。

          這意味著什么呢?JavaScript真的要死了嗎?

          我當時也這么想。當我在2018年第一次學習JavaScript時,JavaScript已擴展為不僅僅面向客戶端應用程序,已經擴展出許多涉及應用程序不同周期的框架。

          基于js的框架包括下面這些:

          • 前端應用程序(Angular,React,Vue.js)

          • 后端應用程序(Node.js,Express.js,Meteor.js)

          • Android / iOS(React Native,NativeScript,Ionic)

          • 機器學習(TensorFlow)

          您可以在這里找到JavaScript庫的完整列表:https://en.wikipedia.org/wiki/List_of_JavaScript_libraries

          上面列表中的大部分JavaScript庫是在過去10年中創建的。這些庫有很多社區支持,并保持步調一致的更新(Angular平均每6個月更新一次)。開發人員對這些庫進行了大量修改(尤其是前端框架),并在保持JavaScript的相關性方面發揮了巨大作用。

          這也可以解釋為什么上面顯示的谷歌趨勢圖是向下的。對術語“JavaScript”的實際搜索呈下降趨勢,但對JavaScript庫的搜索呈上升趨勢。

          隨著JavaScript庫的興起,也有越來越多的用戶提出與這些庫有關的問題。StackOverflow趨勢記錄了他們的問題與某個標簽相關的百分比。看看在過去的十年中有多少關于JavaScript的問題:

          這解決了涉及JavaScript的問題,

          但是否解決了這門語言本身的問題呢?

          多年來,人們對JavaScript的抱怨主要集中在其糟糕的語言特性上。值得慶幸的是,我們正在看到一個舊標準的復蘇,這有助于使語言更加具體和有效。

          ECMAScript是一種編程語言,根據Ecma International創建的ECMA-262文檔進行標準化。該文檔包含JavaScript作為編程語言必須遵循的標準列表。

          ECMAScript創建于1997年,從1997年到2011年僅進行了5次更新。這使JavaScript在21世紀的前十年一直保持著陳舊和過時的標準。直到2015年ECMAScript 6發行,這是對JavaScript的重大更改,允許許多類似的庫對其進行修改。

          自此ECMAScript已發布了5個版本,從2015年到2020年每年發布1個版本,并且現在還沒有停止。隨著發布版本步調的一致性,JavaScript開始不斷接收更新,變得更加健壯、高效,并且適應性更強。

          說了這么多,JavaScript真的死了嗎?

          有些人會懷疑現在開始學習是否為時已晚。正確的答案是JavaScript從未像現在這樣活躍。

          隨著對該語言的貢獻和支持達到前所未有的高度,學習該語言對開發者來說將是一筆巨大的財富。因為有如此多的庫可以選擇,你可以只使用JavaScript框架組成整個堆棧。

          要求開發人員具有React和Angular經驗的公司數量正在大幅增加,并且沒有放緩的趨勢。

          我建議你花些時間學習JavaScript。無論你打算從事該行業還是只是想學習它,我認為將來需要在應用程序中使用JavaScript的地方有很多。該語言將被用在越來越多的框架中。它是未來的趨勢,而且發展得很快。

          原文:https://medium.com/dev-genius/is-javascript-development-dying-1dbce0094fc0

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


          主站蜘蛛池模板: 黑人一区二区三区中文字幕| 日韩精品视频一区二区三区| 一区二区网站在线观看| 亚洲AV成人一区二区三区AV| 无码少妇一区二区三区芒果| 亚洲国产综合无码一区| 一区二区三区电影网| 日本一区二区三区精品视频| 色偷偷久久一区二区三区| 精品一区二区三区无码视频| 性色av闺蜜一区二区三区| 亚洲AV无码一区二区三区人| 久久高清一区二区三区| 亚洲色精品aⅴ一区区三区| 女人和拘做受全程看视频日本综合a一区二区视频| 免费播放一区二区三区| 久久国产视频一区| 亚洲国产综合精品中文第一区| 在线精品亚洲一区二区三区 | 国产福利电影一区二区三区久久老子无码午夜伦不 | 一区二区三区免费精品视频| 风间由美在线亚洲一区| 国内精品视频一区二区三区八戒| 老熟妇仑乱一区二区视頻| 精品人妻码一区二区三区| 少妇激情一区二区三区视频| 日韩精品中文字幕无码一区| 无码人妻精品一区二区三区东京热| 日韩免费观看一区| 日韩精品一区二区三区中文| 亚洲AV无码一区二区三区DV| 无码人妻精品一区二区三区66| 在线视频一区二区| 日本一区二区在线播放| 国产福利微拍精品一区二区| 男插女高潮一区二区| 在线观看国产一区二区三区| 一区免费在线观看| 国产精品无码AV一区二区三区| 一区二区在线观看视频| 在线成人一区二区|