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

針對JavaScript開發人員的Rust簡介

開發 后端
亞馬遜和微軟都認可它是其系統中C / C ++的最佳替代品,但是Rust并不止于此。像Figma和Discord這樣的公司現在也通過在客戶端應用中使用Rust來引領潮流。

 [[381942]]

Rust是2010年起源于Mozilla Research的一種編程語言。如今,所有大公司都在使用它。

亞馬遜和微軟都認可它是其系統中C / C ++的最佳替代品,但是Rust并不止于此。像Figma和Discord這樣的公司現在也通過在客戶端應用中使用Rust來引領潮流。

本篇Rust教程旨在簡要介紹Rust,如何在瀏覽器中使用它,以及何時應該考慮使用它。我將從比較Rust和JavaScript開始,然后引導你完成Rust在瀏覽器中運行的步驟。最后,我將介紹一個使用Rust和JavaScript的COVID simulator web應用程序的快速性能評估。

簡而言之

Rust在概念上與JavaScript非常不同。但也有相似之處需要指出,讓我們來看看問題的兩面。

相似之處

這兩種語言都有一個現代化的包管理系統。JavaScript有npm,Rust有Cargo。Rust有 Cargo.toml 來代替 package.json 進行依賴管理。要創建一個新的項目,使用 cargo init,要運行它,使用 cargo run。不太陌生吧?

Rust中有許多很酷的功能,你已經從JavaScript中知道了,只是語法略有不同。利用這個常見的JavaScript模式,對數組中的每個元素都應用一個閉包:

  1. let staff = [ 
  2.    {name"George", money: 0}, 
  3.    {name"Lea", money: 500000}, 
  4. ]; 
  5. let salary = 1000; 
  6. staff.forEach( (employee) => { employee.money += salary; } ); 

在Rust中,我們可以這樣寫:

  1. let salary = 1000; 
  2. staff.iter_mut().for_each(  
  3.     |employee| { employee.money += salary; } 
  4. ); 

誠然,習慣這種語法需要時間,用管子( | )代替括號。但在克服了最初的尷尬之后,我發現它比另一組括號讀起來更清晰。

再舉一個例子,這是JavaScript中的對象解構:

  1. let point = { x: 5, y: 10 }; 
  2. let {x,y} = point; 

同樣在Rust中:

  1. let point = Point { x: 5, y: 10 }; 
  2. let Point { x, y } = point; 

主要的區別是,在Rust中我們必須指定類型(Point),更普遍的是,Rust需要在編譯時知道所有類型。但與大多數其他編譯語言不同的是,編譯器盡可能自己推斷類型。

為了進一步解釋這個問題,下面是在C++和許多其他語言中有效的代碼。每個變量都需要明確的類型聲明。

  1. int a = 5; 
  2. float b = 0.5; 
  3. float c = 1.5 * a; 

在JavaScript以及Rust中,這段代碼是有效的:

  1. let a = 5; 
  2. let b = 0.5; 
  3. let c = 1.5 * a; 

共享功能不勝枚舉:

  • Rust具有 async + await 語法。
  • 數組可以像讓 let array = [1,2,3] 一樣簡單地創建。
  • 代碼按模塊組織,有明確的導入和導出。
  • 字符串是用Unicode編碼的,處理特殊字符沒有問題。

我可以繼續列舉下去,但我想我的觀點現在已經很清楚了。Rust有一系列豐富的功能,這些功能在現代JavaScript中也有使用。

不同點

Rust是一種編譯語言,這意味著沒有運行時可以執行Rust代碼。一個應用程序只能在編譯器(rustc)完成它的魔法之后運行。這種方法的好處通常是更好的性能。

幸運的是,Cargo為我們解決了調用編譯器的問題。而有了webpack,我們還可以將 Cargo 隱藏在 npm run build 后面。有了這個指南,只要為項目設置好Rust,就可以保留Web開發者的正常工作流程。

Rust 是一種強類型語言,這意味著在編譯時所有類型必須匹配。例如,你不能調用一個參數類型錯誤或參數數量錯誤的函數。編譯器會在你運行時遇到這個錯誤之前為你捕捉到它。顯而易見的比較是TypeScript,如果你喜歡TypeScript,那么你很可能會喜歡Rust。

但別擔心:如果你不喜歡TypeScript,Rust可能還是適合你。Rust 是近幾年從頭開始構建的,它考慮到了過去幾十年來人類在編程語言設計方面所學到的一切。其結果是一種令人耳目一新的簡潔語言。

Rust中的模式匹配是我最喜歡的一個特征,其他語言有 switch 和 case 來避免像這樣的長鏈:

  1. if ( x == 1) {  
  2.   // ...  
  3. else if ( x == 2 ) { 
  4.   // ... 
  5. else if ( x == 3 || x == 4 ) { 
  6.   // ... 
  7. } // ... 

Rust使用了如下更優雅的匹配項:

  1. match x { 
  2.   1 => { /* Do something if x == 1 */}, 
  3.   2 => { /* Do something if x == 2 */}, 
  4.   3 | 4 => { /* Do something if x == 3 || x == 4 */}, 
  5.   5...10 => { /* Do something if x >= 5 && x <= 10 */}, 
  6.   _ => { /* Catch all other cases */ } 

我認為這是非常整潔的,我希望JavaScript開發人員也能欣賞這種語法擴展。

不幸的是,我們還得談談Rust的黑暗面。直言不諱地說,使用嚴格的類型系統有時會讓人感覺非常繁瑣。如果你認為C++或Java的類型系統很嚴格,那么請準備好迎接Rust的艱難之旅吧。

就我個人而言,我很喜歡Rust這部分。我依賴于嚴格的類型系統,因此可以關閉大腦的一部分——每當我發現自己在編寫JavaScript時,大腦的一部分就會劇烈地興奮起來。但是我知道對于初學者來說,總是和編譯器作對是很煩人的。我們將在稍后的Rust教程中看到一些。

Hello Rust

現在,讓我們用Rust在瀏覽器中運行一個 hello world ,我們首先要確保所有必要的工具都已安裝。

工具

使用rustup安裝Cargo + rustc。 Rustup是推薦的安裝Rust的方法,它將安裝最新的穩定版Rust的編譯器(rustc)和包管理器(Cargo)。它將安裝Rust最新穩定版本的編譯器(rustc)和包管理器(Cargo)。它還可以管理beta版和每夜構建版,但對于本例來說,這不是必需的。

  • 在終端機上輸入 cargo --version 來檢查安裝情況,你應該可以看到 cargo 1.48.0 (65cbdd2dc 2020-10-14) 這樣的內容。
  • 還要檢查Rustup:rustup --version 應該產生 rustup 1.23.0(00924c9ba 2020-11-27)。

安裝wasm-pack。 這是為了將編譯器與npm集成。

  • 通過輸入 wasm-pack --version 來檢查安裝,這應該為您提供 wasm-pack 0.9.1 之類的東西。

我們還需要Node和npm。我們有一篇完整的文章[1]解釋了安裝這兩個的最佳方法。

編寫Rust代碼

現在一切都安裝好了,讓我們來創建項目。最終的代碼也可以在這個GitHub倉庫[2]中找到。我們從一個可以編譯成npm包的Rust項目開始,之后會有導入該包的JavaScript代碼。

要創建一個名為 hello-world 的Rust項目,請使用 cargo init --lib hello-world。這將創建一個新目錄并生成Rust庫所需的所有文件:

  1. ├──hello-world 
  2.     ├── Cargo.toml 
  3.     ├── src 
  4.         ├── lib.rs 

Rust代碼將放在 lib.rs 中,在此之前我們必須調整 Cargo.toml。它使用 TOML[3] 定義了依賴關系和其他包的信息。如果想在瀏覽器中看到hello world,請在 Cargo.toml 中的某個地方添加以下行數(例如,在文件的最后)。

  1. [lib] 
  2. crate-type = ["cdylib"

這告訴編譯器在C兼容模式下創建一個庫。顯然我們在我們的例子中沒有使用C。C-compatible只是意味著不是Rust專用的,這是我們使用JavaScript中的庫所需要的。

我們還需要兩個外部庫,將它們作為單獨的一行添加到依賴關系部分。

  1. [dependencies] 
  2. wasm-bindgen = "0.2.68" 
  3. web-sys = {version = "0.3.45", features = ["console"]} 

這些都是來自 crates.io[4] 的依賴項,它是 Cargo 使用的默認包倉庫。

wasm-bindgen[5]是必要的,以創建一個我們以后可以從JavaScript中調用的入口點。(你可以在這里找到完整的文檔。)值 ”0.2.68" 指定了版本。

web-sys[6]包含了所有Web API的Rust綁定,它將使我們能夠訪問瀏覽器控制臺。請注意,我們必須明確地選擇控制臺功能,我們最終的二進制文件將只包含這樣選擇的Web API綁定。

接下來是 lib.rs 內部的實際代碼。自動生成的單元測試可以刪除。只需使用以下代碼替換文件的內容:

  1. use wasm_bindgen::prelude::*; 
  2. use web_sys::console; 
  3.  
  4. #[wasm_bindgen] 
  5. pub fn hello_world() { 
  6.     console::log_1("Hello world"); 

頂部的 use 語句是用于從其他模塊導入項目。這與JavaScript中的 import 類似)。

pub fn hello_world(){...} 聲明一個函數。pub 修飾符是“public”的縮寫,作用類似于JavaScript中的 export。注釋 #[wasm_bindgen] 特定于Rust編譯為[WebAssembly (Wasm)](https://webassembly.org/ "wasm_bindgen] 特定于Rust編譯為[WebAssembly (Wasm "wasm_bindgen] 特定于Rust編譯為[WebAssembly (Wasm)")")。我們在這里需要它來確保編譯器將包裝函數公開給JavaScript。

在功能主體中,“Hello world”被打印到控制臺上。Rust中的 console :: log_1() 是對 console.log() 的調用的包裝。

你是否注意到函數調用中的 _1 后綴?這是因為JavaScript允許使用可變數量的參數,而Rust不允許。為了解決這個問題, wasm_bindgen 為每種參數數量生成一個函數。是的,這很快就會變得丑陋!但這有效。在web-sys文檔[7]中提供了一個可以在Rust控制臺中調用的完整函數列表。

現在我們應該已經一切就緒,試著用下面的命令編譯它。這將下載所有的依賴項并編譯項目,第一次可能會花一些時間。

  1. cd hello-world 
  2. wasm-pack build 

哈!Rust編譯器對我們不滿意。

  1. error[E0308]: mismatched types 
  2.  --> src\lib.rs:6:20 
  3.   | 
  4. 6 |     console::log_1("Hello world"); 
  5.   |                    ^^^^^^^^^^^^^ expected struct `JsValue`, found `str` 
  6.   | 
  7.   = note: expected reference `&JsValue` 
  8.              found reference `&'static str 

注意:如果您看到其他錯誤(error: linking with cc failed: exit code: 1)并且你使用的是Linux,則說明缺少交叉編譯依賴性。sudo apt install gcc-multilib 應該可以解決此問題。

正如我前面提到的,編譯器很嚴格。當它期望一個 JsValue 的引用作為一個函數的參數時,它不會接受一個靜態字符串。為了滿足編譯器的要求,必須進行顯式轉換。

  1. console::log_1(&"Hello world".into()); 

方法 [into()](https://doc.rust-lang.org/std/convert/trait.Into.html "into( "into()")") 將一個值轉換為另一個值。Rust 編譯器很聰明,它可以推遲哪些類型參與轉換,因為函數簽名只留下了一種可能性。在這種情況下,它將轉換為 JsValue,這是一個由JavaScript管理的值的包裝類型。然后,我們還得加上 &,通過引用而不是通過值來傳遞,否則編譯器又會抱怨。

嘗試再次運行 wasm-pack build,如果一切順利,則最后一行應如下所示:

  1. [INFO]: :-) Your wasm pkg is ready to publish at /home/username/intro-to-rust/hello-world/pkg. 

如果你能走到這一步,你現在就可以手動編譯Rust了。下一步,我們將把它與npm和webpack集成,后者將自動為我們完成這項工作。

JavaScript整合

在這個例子中,我決定將 package.json 放在 hello-world 目錄內。我們也可以為Rust項目和JavaScript項目使用不同的目錄,這是個口味問題。

以下是我的 package.json 文件。遵循的最簡單方法是將其復制并運行 npm install,或者運行 npm init 并僅復制 dev 依賴項:

  1.     "name""hello-world"
  2.     "version""1.0.0"
  3.     "description""Hello world app for Rust in the browser."
  4.     "main""index.js"
  5.     "scripts": { 
  6.         "build""webpack"
  7.         "serve""webpack serve" 
  8.     }, 
  9.     "author""Jakob Meier <inbox@jakobmeier.ch>"
  10.     "license""(MIT OR Apache-2.0)"
  11.     "devDependencies": { 
  12.         "@wasm-tool/wasm-pack-plugin""~1.3.1"
  13.         "@webpack-cli/serve""^1.1.0"
  14.         "css-loader""^5.0.1"
  15.         "style-loader""^2.0.0"
  16.         "webpack""~5.8.0"
  17.         "webpack-cli""~4.2.0"
  18.         "webpack-dev-server""~3.11.0" 
  19.     } 

如你所見,我們使用的是webpack 5。Wasm-pack也可以和舊版本的webpack一起使用,甚至可以不使用捆綁程序。但每個設置的工作方式都有些不同,我建議你在跟隨這個Rust教程時使用完全相同的版本。

另一個重要的依賴項是 wasm-pack-plugin。這是一個Webpack插件,專門用于加載使用wasm-pack構建的Rust軟件包。

繼續,我們還需要創建 webpack.config.js 文件來配置webpack。它應該是這樣的:

  1. const path = require('path'); 
  2. const webpack = require('webpack'); 
  3. const WasmPackPlugin = require("@wasm-tool/wasm-pack-plugin"); 
  4.  
  5. module.exports = { 
  6.     entry: './src/index.js'
  7.     output: { 
  8.         path: path.resolve(__dirname, 'dist'), 
  9.         filename: 'index.js'
  10.     }, 
  11.     plugins: [ 
  12.         new WasmPackPlugin({ 
  13.             crateDirectory: path.resolve(__dirname, "."
  14.         }), 
  15.     ], 
  16.     devServer: { 
  17.         contentBase: "./src"
  18.         hot: true
  19.     }, 
  20.     module: { 
  21.         rules: [{ 
  22.             test: /\.css$/i, 
  23.             use: ["style-loader""css-loader"], 
  24.         }, ] 
  25.     }, 
  26.     experiments: { 
  27.         syncWebAssembly: true
  28.     }, 
  29. }; 

所有的路徑都配置為Rust代碼和JavaScript代碼并排。index.js 將在 src 文件夾中,緊挨著 lib.rs。如果你喜歡不同的設置,可以隨時調整這些。

你還會注意到,我們使用webpack experiments[8],這是webpack 5引入的新選項。請確保將 syncWebAssembly 設置為true。

最后,我們必須創建JavaScript入口點 src/index.js:

  1. import("../pkg").catch(e => console.error("Failed loading Wasm module:", e)).then
  2.     rust => 
  3.         rust.hello_world() 
  4. ); 

我們必須異步加載Rust模塊。調用 rust.hello_world() 會調用一個生成的封裝函數,而這個函數又會調用 lib.rs 中定義的Rust函數 hello_world。

現在,運行 npm run serve 應該可以編譯所有內容并啟動開發服務器。我們沒有定義HTML文件,因此頁面上沒有任何顯示。你可能還必須手動轉到 http://localhost:8080/index,因為http://localhost:8080只是列出文件而不執行任何代碼。

打開空白頁后,打開開發人員控制臺。Hello World應該有一個日志條目。

好吧,對于一個簡單的hello world來說,這是相當多的工作。但現在一切都到位了,我們可以輕松地擴展Rust代碼,而不用擔心這些。保存對 lib.rs 的修改后,你應該會自動看到重新編譯和瀏覽器中的實時更新,就像JavaScript一樣。

何時使用Rust

Rust不是JavaScript的一般替代品。它只能通過Wasm在瀏覽器中運行,這在很大程度上限制了它的作用。即使你可以用Rust替換幾乎所有的JavaScript代碼,如果你真的想的話,那是一個壞主意,而且不是Wasm的目的。例如,Rust并不適合與你網站的UI進行交互。

我認為Rust + Wasm是一個額外的選項,可以用來更有效地運行CPU重的工作負載。以較大的下載量為代價,Wasm避免了JavaScript代碼面臨的解析和編譯開銷。這一點,再加上編譯器的強力優化,可能會帶來更好的性能。這通常是公司為特定項目選擇Rust的原因。選擇Rust的另一個原因可能是語言偏好,但這是一個完全不同的討論,我不會在這里討論。

參考資料

[1]文章: https://www.sitepoint.com/quick-tip-multiple-versions-node-nvm/

[2]GitHub倉庫: https://github.com/sitepoint-editors/rust-wasm-hello-world

[3]TOML: https://github.com/toml-lang/toml

[4]crates.io: https://crates.io/

[5]wasm-bindgen: https://crates.io/crates/wasm-bindgen

[6]web-sys: https://crates.io/crates/web-sys

[7]web-sys文檔: https://rustwasm.github.io/wasm-bindgen/api/web_sys/console/index.html

[8]webpack experiments: https://webpack.js.org/configuration/experiments/

本文轉載自微信公眾號「前端全棧開發者」,可以通過以下二維碼關注。轉載本文請聯系前端全棧開發者公眾號。

 

責任編輯:武曉燕 來源: 前端全棧開發者
相關推薦

2019-10-17 09:00:00

GoRust編程語言

2021-03-23 14:48:34

iOS供應鏈攻擊網絡安全

2023-03-02 17:44:30

DevOps開發

2020-11-20 09:41:55

Python編程語言機器人

2023-08-30 12:14:05

2022-11-09 06:44:37

2017-10-24 11:59:41

JavaScript

2020-05-11 09:54:33

JavaScript開發技術

2010-08-09 16:09:25

2020-10-29 12:53:28

JavaScriptTypeScript開發

2009-11-23 20:07:51

ibmdw開發

2021-02-19 09:33:01

kubernetesJAVA服務

2009-12-11 14:50:14

Visual Basi

2012-05-30 15:15:42

ibmdw

2023-03-15 07:12:53

企業開發人員提供商

2022-01-13 23:15:29

Docker開發嵌入式

2012-03-20 13:58:50

JavaScript

2015-02-10 09:24:04

Web開發JavaScript工具

2022-03-31 09:53:58

攻擊惡意包npm包

2022-01-06 16:15:58

自測測試開發人員
點贊
收藏

51CTO技術棧公眾號

欧美日韩精品免费看| 丁香六月色婷婷| 成人h小游戏| 色天使综合视频| 极品少妇一区二区三区| 日本精品免费观看高清观看| 5566中文字幕一区二区| 国产午夜福利一区| 欧美黑人粗大| 91美女蜜桃在线| 欧美国产精品人人做人人爱| 亚洲最大天堂网| 国产午夜在线观看| 麻豆成人在线| 亚洲欧洲中文天堂| 国产极品粉嫩福利姬萌白酱| 国产综合无码一区二区色蜜蜜| 国产欧美大片| 日韩成人免费视频| 国产高清av在线播放| 韩国av在线免费观看| 日本在线不卡视频| 亚洲视频在线观看| 91视频福利网| 羞羞的视频在线观看| 国产一区二区0| 久久色精品视频| 黄黄视频在线观看| 国产女人18毛片水18精| 欧美激情理论| 91精品欧美久久久久久动漫| 综合国产精品久久久| 97超碰资源站| 欧美在线高清| 精品91自产拍在线观看一区| 精品国产一区三区| 九色在线视频| 蜜臀91精品一区二区三区| 日韩中文有码在线视频| www.51色.com| 欧美家庭影院| 97超碰欧美中文字幕| 日本高清视频一区| 黑人と日本人の交わりビデオ| 久久亚洲精品中文字幕| 亚洲精品视频自拍| 精品福利影视| 中文字幕无码乱码人妻日韩精品| 婷婷亚洲综合| 精品国产免费人成在线观看| 中文字幕国产高清| 大香伊人中文字幕精品| 久久午夜色播影院免费高清| 国产在线999| 国产一级片视频| 久久99影视| 91精品国产手机| 极品美女扒开粉嫩小泬| www中文字幕在线观看| 一区二区三区日韩欧美精品 | 国产女人18毛片| 麻豆tv入口在线看| 成人做爰69片免费看网站| 欧美综合激情网| 国产成人免费观看视频 | 精品一区二区三区三区| 日日噜噜噜噜久久久精品毛片| 麻豆传媒免费在线观看| 亚洲色图都市小说| 久久亚洲高清| 91好色先生tv| 国内精品伊人久久久久av影院| 97视频免费在线看| 99成人在线观看| 天堂日韩电影| 欧美一二三区精品| 国产a视频免费观看| 在线观看操人| 国产亚洲福利社区一区| 国产二区不卡| 一区二区 亚洲| 国产一区二区在线视频| 9a蜜桃久久久久久免费| 黄色av网站免费| 好吊一区二区三区| 久久久91精品| 精品一区在线视频| 中文精品久久| 日韩在线欧美在线国产在线| 污污的视频在线免费观看| 国产影视一区| 精品中文字幕久久久久久| 亚洲精品国产一区黑色丝袜| 农村少妇一区二区三区四区五区| 欧美一区二区三区在线视频| 黑人玩弄人妻一区二区三区| 伊人久久一区| 欧美日韩日日骚| 中文字幕第80页| 国产精品一区二区三区四区在线观看| 91福利资源站| 国产无套精品一区二区三区| 一区二区三区无毛| 亚洲黄色av网站| 国内精品免费视频| 激情五月综合| 久久久久久久91| 黄色一级片在线| 欧美粗暴jizz性欧美20| 日本精品一区二区三区在线| 97人人澡人人爽人人模亚洲| 蜜臀av性久久久久蜜臀aⅴ流畅| 波多野结衣久草一区| yiren22综合网成人| 亚洲一区二区三区自拍| 91黄色在线看| 毛片在线导航| 精品视频1区2区3区| 天天干天天爽天天射| 日韩毛片一区| 欧美精品aⅴ在线视频| 色91精品久久久久久久久| 欧美电影完整版在线观看| 久久久久999| 亚洲性猛交富婆| 久久99热这里只有精品| 91久久精品美女高潮| 国产黄色一区二区| 成人高清免费观看| 久久亚裔精品欧美| 日韩欧美一起| 欧美一级理论片| 你懂得视频在线观看| 午夜亚洲激情| 国产精品视频免费观看www| 伊人久久成人网| 久久久久久久久97黄色工厂| 亚洲国产精品综合| 国产91在线视频蝌蚪| 亚洲午夜私人影院| 国产一级片中文字幕| 久久影院100000精品| 国产精品18久久久久久首页狼| 在线免费av片| 国产一区二区美女| 一区二区三区四区欧美日韩| 亚洲电影视频在线| 91精品国产综合久久久久久漫画 | 视频一区欧美| 欧美在线视频观看免费网站| 韩国av在线免费观看| 亚洲午夜久久久久久久久电影院 | 久久夜色电影| 亚洲视频在线看| 亚洲成熟少妇视频在线观看| 精品一区二区三区免费观看| 亚洲国产另类久久久精品极度| 午夜av成人| 少妇久久久久久| 91片黄在线观看喷潮| 《视频一区视频二区| 欧美牲交a欧美牲交| 巨胸喷奶水www久久久免费动漫| 亚洲欧美成人一区二区在线电影| 小泽玛利亚一区二区免费| 久草中文综合在线| 最新av在线免费观看| 永久免费毛片在线播放| 欧美一卡二卡在线观看| 欧美黑吊大战白妞| 日本美女一区二区| 正在播放一区二区三区| 国产日韩在线观看视频| 欧美国产日本高清在线| 午夜影院在线视频| 亚洲美女少妇撒尿| 911亚洲精选| 国产精品入口66mio| 欧洲精品码一区二区三区免费看| 97caopor国产在线视频| 精品久久国产老人久久综合| 999福利视频| 久久中文字幕一区二区三区| 国产精品毛片va一区二区三区| 在线日本中文字幕| 欧美日韩美女在线| 婷婷五月精品中文字幕| 亚洲国产一成人久久精品| 国产精品wwwwww| 亚洲日本在线播放| 欧美天天综合网| 性高潮久久久久久久| 蜜桃视频在线观看一区| 成人区一区二区| 激情视频亚洲| 日韩亚洲精品视频| 国模私拍一区二区| 一级日本不卡的影视| 国产精品igao网网址不卡| 亚洲精品色图| 九9re精品视频在线观看re6| se69色成人网wwwsex| 欧美—级a级欧美特级ar全黄| 欧美日韩伦理片| 色综合一个色综合亚洲| 性色av蜜臀av色欲av| 99国产精品| 精品在线视频一区二区三区| 欧美日韩卡一| 欧美一级淫片videoshd| 男生女生差差差的视频在线观看| 欧美日韩免费视频| 国产www在线| 2023国产一二三区日本精品2022| 欧美一级特黄a| 久久久精品久久久久久96| 裸模一区二区三区免费| 日韩在线观看中文字幕| 久久久久久久久爱| 伊人在线视频| 日韩一级欧美一级| 欧美brazzers| 欧美日韩一区二区三区在线免费观看| 91n在线视频| 日本一区二区综合亚洲| 久热精品在线观看视频| 免费永久网站黄欧美| 亚洲色欲久久久综合网东京热| 91久久夜色精品国产按摩| 欧美综合77777色婷婷| 少妇高潮一区二区三区| 国产一区二区视频在线免费观看| 美女扒开腿让男人桶爽久久软| 亚洲精品98久久久久久中文字幕| 国产精品一区二区黑人巨大| 夜色激情一区二区| 久久久久久视频| 国产精品麻豆视频| 国产精品欧美性爱| 捆绑紧缚一区二区三区视频| 乱熟女高潮一区二区在线| 精品日产乱码久久久久久仙踪林| 亚洲精品日产aⅴ| 密臀av在线播放| 久久久久成人精品| 国产丝袜在线观看视频| 欧美国产精品日韩| 丁香花视频在线观看| 久久777国产线看观看精品| 天天干天天色天天| 欧美精品一卡两卡| 国产精品国产精品国产专区| 欧美精品久久一区| 97人妻人人澡人人爽人人精品| 精品视频999| 国产熟女一区二区三区四区| 日韩亚洲欧美中文三级| 亚洲女人18毛片水真多| 精品国精品自拍自在线| 蜜桃视频在线观看www| 欧美揉bbbbb揉bbbbb| 中文字幕av资源| 91精品久久久久久久久99蜜臂| 午夜精品无码一区二区三区| 欧美午夜电影一区| 国产一区二区三区中文字幕| 91精品欧美一区二区三区综合在 | 亚洲精品555| 91久久精品国产| 国产福利一区二区精品秒拍| 国产精品日韩精品| 成人乱码手机视频| 动漫一区二区在线| 要久久爱电视剧全集完整观看| av一区二区三区免费| 免费看成人人体视频| 日本一区二区在线视频观看| 999精品色在线播放| 蜜臀av色欲a片无码精品一区| 免费精品视频| 五月天视频在线观看| 成人avav影音| 人妻熟人中文字幕一区二区| 一区二区三区四区蜜桃| 日韩精品一区二区亚洲av| 亚洲国产成人高清精品| 欧洲第一无人区观看| 中文字幕欧美一| 久久久全国免费视频| 色综合天天在线| 久久久久久福利| 偷偷要91色婷婷| 校园春色 亚洲| 亚洲韩国一区二区三区| 人妻中文字幕一区二区三区| 欧美欧美午夜aⅴ在线观看| 中文字幕欧美人妻精品一区蜜臀| 日韩精品资源二区在线| 久久久久精彩视频| 9191久久久久久久久久久| 亚洲av成人精品一区二区三区在线播放| 亚洲欧美另类国产| 欧美日本高清| 欧美精品videos| 色8久久影院午夜场| 国产欧美一区二区三区不卡高清| 亚洲最好看的视频| 影音先锋男人的网站| 欧美激情777| 毛片在线播放视频| 国产一区二区日韩精品| 大又大又粗又硬又爽少妇毛片| 国产精品一区三区| 人妻av一区二区三区| 久久人人超碰精品| av成人免费网站| 欧美日韩一二三| 手机在线精品视频| 日韩视频在线观看免费| 日本不卡网站| 7777精品久久久大香线蕉小说| 日韩免费一区| 日韩高清国产精品| 国产高清一区| 不卡av免费在线| 不卡一区中文字幕| 欧美成人aaa片一区国产精品| 欧美中文字幕一区二区三区亚洲| 日本熟女毛茸茸| 精品福利一二区| 黄色在线免费看| 欧美乱熟臀69xxxxxx| 久久久资源网| 国模吧一区二区| 一区二区三区电影大全| 国产91成人在在线播放| www欧美在线观看| 一区二区三区|亚洲午夜| 久久精品五月| 娇妻高潮浓精白浆xxⅹ| 亚洲国产一区二区在线播放| 国产精品久久久久久久免费看| 在线播放日韩专区| 深夜成人影院| 色综合电影网| 91久久国产| 九九热免费精品视频| 国产精品网站在线| 免费在线观看一级片| 777欧美精品| 日本在线观看免费| 国产精品mp4| 日韩情爱电影在线观看| 女人另类性混交zo| 久久久久久久综合色一本| 国产午夜在线播放| 精品久久一区二区三区| av午夜在线观看| 欧美一区二区三区图| 日韩美女精品| 久久久久久久久久久视频| 成人av在线网站| 国产视频91在线| 亚洲成色777777在线观看影院| 午夜av免费在线观看| 欧美在线一区二区视频| 美女一区2区| caopor在线视频| 中文字幕一区二区三| 久久艹免费视频| 欧美精品在线视频| 色在线视频网| 国产一区高清视频| 国产欧美一级| 中文字幕第24页| 欧美高清视频www夜色资源网| 好吊日视频在线观看| 99se婷婷在线视频观看| 亚洲欧美卡通另类91av| 最近中文字幕在线mv视频在线| 69精品人人人人| 女同视频在线观看| 国产亚洲欧美一区二区| 奇米色777欧美一区二区| 任我爽在线视频| 亚洲精品久久7777777| 欧美艳星kaydenkross| 懂色av一区二区三区四区五区| 国产激情精品久久久第一区二区| 亚欧洲乱码视频| 欧美色综合久久| 直接在线观看的三级网址| 欧美大陆一区二区| 久久99精品国产91久久来源| 亚洲国产综合久久| 欧美一二三四在线| 日本成人三级电影| 三年中文高清在线观看第6集| 懂色中文一区二区在线播放| 欧美成人精品一区二区免费看片|