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

關于現代包管理器的深度思考-為什么現在我更推薦 pnpm 而不是 npm/yarn?

開發 前端
這篇文章給大家分享一個業內一款出色的包管理器——pnpm。目前 GitHub 已經有 star 9.8k,現在已經相對成熟且穩定了。它由 npm/yarn 衍生而來,但卻解決了 npm/yarn 內部潛在的 bug,并且極大了地優化了性能,擴展了使用場景。

 很長時間沒有更新原創文章了,但是還一直在思考和沉淀當中,后面公眾號會更頻繁地輸出一些前端工程相關的干貨,希望對大家有一些啟發,也希望在實際的工作當中幫助大家提升效率。

這篇文章給大家分享一個業內一款出色的包管理器——pnpm。目前 GitHub 已經有 star 9.8k,現在已經相對成熟且穩定了。它由 npm/yarn 衍生而來,但卻解決了 npm/yarn 內部潛在的 bug,并且極大了地優化了性能,擴展了使用場景。下面是本文的思維導圖:


一、什么是 pnpm ?

pnpm 的官方文檔(https://pnpm.js.org/en/)是這樣說的:

  1. Fast, disk space efficient package manager 

因此,pnpm 本質上就是一個包管理器,這一點跟 npm/yarn 沒有區別,但它作為殺手锏的兩個優勢在于:

  • 包安裝速度極快;
  • 磁盤空間利用非常高效。

它的安裝也非常簡單。可以有多簡單?

  1. npm i -g pnpm 

二、特性概覽

1. 速度快

pnpm 安裝包的速度究竟有多快?先以 React 包為例來對比一下:


可以看到,作為黃色部分的 pnpm,在絕多大數場景下,包安裝的速度都是明顯優于 npm/yarn,速度會比 npm/yarn 快 2-3 倍。

對 yarn 比較熟悉的同學可能會說,yarn 不是有 PnP 安裝模式(https://classic.yarnpkg.com/en/docs/pnp/)嗎?直接去掉 node_modules,將依賴包內容寫在磁盤,節省了 node 文件 I/O 的開銷,這樣也能提升安裝速度。(具體原理見這篇文章(https://loveky.github.io/2019/02/11/yarn-pnp/))

接下來,我們以這樣一個倉庫(https://github.com/pnpm/benchmarks-of-javascript-package-managers)為例,我們來看一看 benchmark 數據,主要對比一下 pnpm 和 yarn PnP:


從中可以看到,總體而言,pnpm 的包安裝速度還是明顯優于 yarn PnP的。

2. 高效利用磁盤空間

pnpm 內部使用基于內容尋址的文件系統來存儲磁盤上所有的文件,這個文件系統出色的地方在于:

  • 不會重復安裝同一個包。用 npm/yarn 的時候,如果 100 個項目都依賴 lodash,那么 lodash 很可能就被安裝了 100 次,磁盤中就有 100 個地方寫入了這部分代碼。但在使用 pnpm 只會安裝一次,磁盤中只有一個地方寫入,后面再次使用都會直接使用 hardlink(硬鏈接,不清楚的同學詳見這篇文章(https://www.cnblogs.com/itech/archive/2009/04/10/1433052.html))。
  • 即使一個包的不同版本,pnpm 也會極大程度地復用之前版本的代碼。舉個例子,比如 lodash 有 100 個文件,更新版本之后多了一個文件,那么磁盤當中并不會重新寫入 101 個文件,而是保留原來的 100 個文件的 hardlink,僅僅寫入那一個新增的文件。

3. 支持 monorepo

隨著前端工程的日益復雜,越來越多的項目開始使用 monorepo。之前對于多個項目的管理,我們一般都是使用多個 git 倉庫,但 monorepo 的宗旨就是用一個 git 倉庫來管理多個子項目,所有的子項目都存放在根目錄的packages目錄下,那么一個子項目就代表一個package。如果你之前沒接觸過 monorepo 的概念,建議仔細看看這篇文章(https://www.perforce.com/blog/vcs/what-monorepo)以及開源的 monorepo 管理工具lerna(https://github.com/lerna/lerna#readme),項目目錄結構可以參考一下 babel 倉庫(https://github.com/babel/babel)。

pnpm 與 npm/yarn 另外一個很大的不同就是支持了 monorepo,體現在各個子命令的功能上,比如在根目錄下 pnpm add A -r, 那么所有的 package 中都會被添加 A 這個依賴,當然也支持 --filter字段來對 package 進行過濾。

4. 安全性高

之前在使用 npm/yarn 的時候,由于 node_module 的扁平結構,如果 A 依賴 B, B 依賴 C,那么 A 當中是可以直接使用 C 的,但問題是 A 當中并沒有聲明 C 這個依賴。因此會出現這種非法訪問的情況。但 pnpm 腦洞特別大,自創了一套依賴管理方式,很好地解決了這個問題,保證了安全性,具體怎么體現安全、規避非法訪問依賴的風險的,后面再來詳細說說。

三、依賴管理

npm/yarn install 原理

主要分為兩個部分, 首先,執行 npm/yarn install之后,包如何到達項目 node_modules 當中。其次,node_modules 內部如何管理依賴。

執行命令后,首先會構建依賴樹,然后針對每個節點下的包,會經歷下面四個步驟:

- 1. 將依賴包的版本區間解析為某個具體的版本號

- 2. 下載對應版本依賴的 tar 包到本地離線鏡像

- 3. 將依賴從離線鏡像解壓到本地緩存

- 4. 將依賴從緩存拷貝到當前目錄的 node_modules 目錄

然后,對應的包就會到達項目的node_modules當中。

那么,這些依賴在node_modules內部是什么樣的目錄結構呢,換句話說,項目的依賴樹是什么樣的呢?

在 npm1、npm2 中呈現出的是嵌套結構,比如下面這樣:

  1. node_modules 
  2. └─ foo 
  3.    ├─ index.js 
  4.    ├─ package.json 
  5.    └─ node_modules 
  6.       └─ bar 
  7.          ├─ index.js 
  8.          └─ package.json 

如果 bar 當中又有依賴,那么又會繼續嵌套下去。試想一下這樣的設計存在什么問題:

  1. 依賴層級太深,會導致文件路徑過長的問題,尤其在 window 系統下。
  2. 大量重復的包被安裝,文件體積超級大。比如跟 foo 同級目錄下有一個baz,兩者都依賴于同一個版本的lodash,那么 lodash 會分別在兩者的 node_modules 中被安裝,也就是重復安裝。
  3. 模塊實例不能共享。比如 React 有一些內部變量,在兩個不同包引入的 React 不是同一個模塊實例,因此無法共享內部變量,導致一些不可預知的 bug。

接著,從 npm3 開始,包括 yarn,都著手來通過扁平化依賴的方式來解決這個問題。相信大家都有這樣的體驗,我明明就裝個 express,為什么 node_modules里面多了這么多東西?


沒錯,這就是扁平化依賴管理的結果。相比之前的嵌套結構,現在的目錄結構類似下面這樣:

  1. node_modules 
  2. ├─ foo 
  3. |  ├─ index.js 
  4. |  └─ package.json 
  5. └─ bar 
  6.    ├─ index.js 
  7.    └─ package.json 

所有的依賴都被拍平到node_modules目錄下,不再有很深層次的嵌套關系。這樣在安裝新的包時,根據 node require 機制,會不停往上級的node_modules當中去找,如果找到相同版本的包就不會重新安裝,解決了大量包重復安裝的問題,而且依賴層級也不會太深。

之前的問題是解決了,但仔細想想這種扁平化的處理方式,它真的就是無懈可擊嗎?并不是。它照樣存在諸多問題,梳理一下:

  1. 依賴結構的不確定性。
  2. 扁平化算法本身的復雜性很高,耗時較長。
  3. 項目中仍然可以非法訪問沒有聲明過依賴的包

后面兩個都好理解,那第一點中的不確定性是什么意思?這里來詳細解釋一下。

假如現在項目依賴兩個包 foo 和 bar,這兩個包的依賴又是這樣的:


那么 npm/yarn install 的時候,通過扁平化處理之后,究竟是這樣


還是這樣?


答案是: 都有可能。取決于 foo 和 bar 在 package.json中的位置,如果 foo 聲明在前面,那么就是前面的結構,否則是后面的結構。

這就是為什么會產生依賴結構的不確定問題,也是 lock 文件誕生的原因,無論是package-lock.json(npm 5.x才出現)還是yarn.lock,都是為了保證 install 之后都產生確定的node_modules結構。

盡管如此,npm/yarn 本身還是存在扁平化算法復雜和package 非法訪問的問題,影響性能和安全。

pnpm 依賴管理

pnpm 的作者Zoltan Kochan發現 yarn 并沒有打算去解決上述的這些問題,于是另起爐灶,寫了全新的包管理器,開創了一套新的依賴管理機制,現在就讓我們去一探究竟。

還是以安裝 express 為例,我們新建一個目錄,執行:

  1. pnpm init -y 

然后執行:

  1. pnpm install express 

我們再去看看node_modules:

  1. .pnpm 
  2. .modules.yaml 
  3. express 

我們直接就看到了express,但值得注意的是,這里僅僅只是一個軟鏈接,不信你打開看看,里面并沒有 node_modules 目錄,如果是真正的文件位置,那么根據 node 的包加載機制,它是找不到依賴的。那么它真正的位置在哪呢?

我們繼續在 .pnpm 當中尋找:

  1. ▾ node_modules 
  2.   ▾ .pnpm 
  3.     ▸ accepts@1.3.7 
  4.     ▸ array-flatten@1.1.1 
  5.     ... 
  6.     ▾ express@4.17.1 
  7.       ▾ node_modules 
  8.         ▸ accepts 
  9.         ▸ array-flatten 
  10.         ▸ body-parser 
  11.         ▸ content-disposition 
  12.         ... 
  13.         ▸ etag 
  14.         ▾ express 
  15.           ▸ lib 
  16.             History.md 
  17.             index.js 
  18.             LICENSE 
  19.             package.json 
  20.             Readme.md 

好家伙!竟然在 .pnpm/express@4.17.1/node_modules/express下面找到了!

隨便打開一個別的包:


好像也都是一樣的規律,都是 @version/node_modules/ 這種目錄結構。并且 express 的依賴都在.pnpm/express@4.17.1/node_modules下面,這些依賴也全都是軟鏈接。

再看看.pnpm,.pnpm目錄下雖然呈現的是扁平的目錄結構,但仔細想想,順著軟鏈接慢慢展開,其實就是嵌套的結構!

  1. ▾ node_modules 
  2.   ▾ .pnpm 
  3.     ▸ accepts@1.3.7 
  4.     ▸ array-flatten@1.1.1 
  5.     ... 
  6.     ▾ express@4.17.1 
  7.       ▾ node_modules 
  8.         ▸ accepts  -> ../accepts@1.3.7/node_modules/accepts 
  9.         ▸ array-flatten -> ../array-flatten@1.1.1/node_modules/array-flatten 
  10.         ... 
  11.         ▾ express 
  12.           ▸ lib 
  13.             History.md 
  14.             index.js 
  15.             LICENSE 
  16.             package.json 
  17.             Readme.md 

將包本身和依賴放在同一個node_module下面,與原生 Node 完全兼容,又能將 package 與相關的依賴很好地組織到一起,設計十分精妙。

現在我們回過頭來看,根目錄下的 node_modules 下面不再是眼花繚亂的依賴,而是跟 package.json 聲明的依賴基本保持一致。即使 pnpm 內部會有一些包會設置依賴提升,會被提升到根目錄 node_modules 當中,但整體上,根目錄的node_modules比以前還是清晰和規范了許多。

四、再談安全

不知道你發現沒有,pnpm 這種依賴管理的方式也很巧妙地規避了非法訪問依賴的問題,也就是只要一個包未在 package.json 中聲明依賴,那么在項目中是無法訪問的。

但在 npm/yarn 當中是做不到的,那你可能會問了,如果 A 依賴 B, B 依賴 C,那么 A 就算沒有聲明 C 的依賴,由于有依賴提升的存在,C 被裝到了 A 的node_modules里面,那我在 A 里面用 C,跑起來沒有問題呀,我上線了之后,也能正常運行啊。不是挺安全的嗎?

還真不是。

第一,你要知道 B 的版本是可能隨時變化的,假如之前依賴的是C@1.0.1,現在發了新版,新版本的 B 依賴 C@2.0.1,那么在項目 A 當中 npm/yarn install 之后,裝上的是 2.0.1 版本的 C,而 A 當中用的還是 C 當中舊版的 API,可能就直接報錯了。

第二,如果 B 更新之后,可能不需要 C 了,那么安裝依賴的時候,C 都不會裝到node_modules里面,A 當中引用 C 的代碼直接報錯。

還有一種情況,在 monorepo 項目中,如果 A 依賴 X,B 依賴 X,還有一個 C,它不依賴 X,但它代碼里面用到了 X。由于依賴提升的存在,npm/yarn 會把 X 放到根目錄的 node_modules 中,這樣 C 在本地是能夠跑起來的,因為根據 node 的包加載機制,它能夠加載到 monorepo 項目根目錄下的 node_modules 中的 X。但試想一下,一旦 C 單獨發包出去,用戶單獨安裝 C,那么就找不到 X 了,執行到引用 X 的代碼時就直接報錯了。

這些,都是依賴提升潛在的 bug。如果是自己的業務代碼還好,試想一下如果是給很多開發者用的工具包,那危害就非常嚴重了。

npm 也有想過去解決這個問題,指定--global-style參數即可禁止變量提升,但這樣做相當于回到了當年嵌套依賴的時代,一夜回到解放前,前面提到的嵌套依賴的缺點仍然暴露無遺。

npm/yarn 本身去解決依賴提升的問題貌似很難完成,不過社區針對這個問題也已經有特定的解決方案: dependency-check,地址: https://github.com/dependency-check-team/dependency-check

但不可否認的是,pnpm 做的更加徹底,獨創的一套依賴管理方式不僅解決了依賴提升的安全問題,還大大優化了時間和空間上的性能。

五、日常使用

說了這么多,估計你會覺得 pnpm 挺復雜的,是不是用起來成本很高呢?

恰好相反,pnpm 使用起來十分簡單,如果你之前有 npm/yarn 的使用經驗,甚至可以無縫遷移到 pnpm 上來。不信我們來舉幾個日常使用的例子。

pnpm install

跟 npm install 類似,安裝項目下所有的依賴。但對于 monorepo 項目,會安裝 workspace 下面所有 packages 的所有依賴。不過可以通過 --filter 參數來指定 package,只對滿足條件的 package 進行依賴安裝。

當然,也可以這樣使用,來進行單個包的安裝:

  1. // 安裝 axios 
  2. pnpm install axios 
  3. // 安裝 axios 并將 axios 添加至 devDependencies 
  4. pnpm install axios -D 
  5. // 安裝 axios 并將 axios 添加至 dependencies 
  6. pnpm install axios -S 

當然,也可以通過 --filter 來指定 package。

pnpm update

根據指定的范圍將包更新到最新版本,monorepo 項目中可以通過 --filter 來指定 package。

pnpm uninstall

在 node_modules 和 package.json 中移除指定的依賴。monorepo 項目同上。舉例如下:

  1. // 移除 axios 
  2. pnpm uninstall axios --filter package-a 

pnpm link

將本地項目連接到另一個項目。注意,使用的是硬鏈接,而不是軟鏈接。如:

  1. pnpm link ../../axios 

另外,對于我們經常用到npm run/start/test/publish,這些直接換成 pnpm 也是一樣的,不再贅述。更多的使用姿勢可參考官方文檔: https://pnpm.js.org/en/

可以看到,雖然 pnpm 內部做了非常多復雜的設計,但實際上對于用戶來說是無感知的,使用起來非常友好。并且,現在作者現在還一直在維護,目前 npm 上周下載量已經有 10w +,經歷了大規模用戶的考驗,穩定性也能有所保障。

因此,綜合來看,pnpm 是一個相比 npm/yarn 更優的方案,期待未來 pnpm 能有更多的落地。

 

責任編輯:姜華 來源: 前端三元同學
相關推薦

2022-02-28 10:22:08

前端管理工具

2023-04-12 00:00:40

Node.jsMonoreponpm

2022-02-21 09:58:31

包管理器npmyarn

2024-06-20 08:06:04

2017-09-11 19:58:06

PostgreSQLMySQL數據庫

2022-05-26 08:01:44

Pnpm包管理器磁盤

2019-04-19 11:56:48

框架AI開發

2021-11-29 12:11:09

npm包管理器工具

2022-09-16 22:23:35

pnpmCLI軟件

2021-11-11 11:13:20

js Npm基礎

2012-10-10 16:52:21

CentOSDebianUbuntu

2022-02-25 14:19:56

依賴管理前端命令

2024-05-10 08:41:05

NPMYarn

2021-02-26 05:30:25

元素For-Each代碼

2023-01-11 12:14:50

NeoVimVim開發

2021-04-18 12:37:46

bspwmLinux窗口管理器

2022-08-03 00:04:29

pnpmyarnnpm

2021-03-26 11:50:28

Linuxexals

2020-12-03 12:06:54

HarmonyOS

2020-03-09 11:43:35

RustCargo編程語言
點贊
收藏

51CTO技術棧公眾號

国产综合精品视频| 麻豆精品国产传媒| 91成人高清| 美女视频网站黄色亚洲| www.日韩.com| 亚洲无人区码一码二码三码| 毛片无码国产| 亚洲欧洲色图综合| 精品乱子伦一区二区三区| www.国产毛片| 欧美日本三区| 亚洲毛片一区二区| √天堂资源在线| 韩漫成人漫画| 一区二区三区在线视频观看 | 91日韩一区二区三区| 国产精品久久久久久久久免费看| 国产成人av免费在线观看| 日本在线中文字幕一区| 欧美日韩精品一区二区三区四区| 成人av网站在线观看| 日韩一区二区三区免费观看| 91好吊色国产欧美日韩在线| 最新真实国产在线视频| 不卡的av在线播放| 亚洲最大av网站| 蜜臀尤物一区二区三区直播| 欧美三级黄美女| 中文字幕日韩高清| 丰满圆润老女人hd| 国产精品jk白丝蜜臀av小说| 欧美理论片在线| 欧在线一二三四区| 日产福利视频在线观看| 亚洲色图一区二区三区| 亚洲精品一区二区三区蜜桃久| 天堂网av在线播放| 国产91丝袜在线观看| 91色p视频在线| 在线亚洲欧美日韩| 免费xxxx性欧美18vr| 国产ts人妖一区二区三区| 久久9999久久免费精品国产| 自产国语精品视频| 久久精品一区中文字幕| 国产黄色大片免费看| 久久最新网址| 亚洲免费影视第一页| 7788色淫网站小说| 成人影院中文字幕| 亚洲国产精品字幕| 99久久免费看精品国产一区| 国产精品主播在线观看| 亚洲成人a级网| 在线黄色免费网站| 另类尿喷潮videofree| 亚洲成人aaa| 黄色a一级视频| 国产成人黄色| 神马久久桃色视频| 午夜精品一区二区三区视频| 久久久久久久久久久久久久久久久久| 日韩中文字幕在线视频| 男人的午夜天堂| 亚洲男女av一区二区| 久久综合88中文色鬼| 欧美日韩在线视频免费播放| 亚洲视频久久| 欧美亚洲另类激情另类| 波多野结衣在线观看视频| 美女高潮久久久| 亚洲伊人一本大道中文字幕| 亚洲美女福利视频| 91一区二区在线观看| 日韩av电影免费观看| 免费观看在线黄色网| 亚洲综合偷拍欧美一区色| 欧美亚洲日本一区二区三区| 中文在线а√在线8| 欧美三区在线观看| 人妻换人妻仑乱| 97品白浆高清久久久久久| 亚洲精品电影在线| 你懂得视频在线观看| 一区二区三区国产精华| 国内伊人久久久久久网站视频 | 欧美大胆人体bbbb| 女同毛片一区二区三区| 精品国产一区二区三区小蝌蚪 | heyzo高清在线| 欧美性猛交xxxx乱大交极品| 久久婷婷综合色| 视频一区中文字幕精品| 亚洲欧美国产一本综合首页| 熟女少妇a性色生活片毛片| 极品中文字幕一区| 国产精品自产拍高潮在线观看| 国产黄a三级三级看三级| 久久亚洲影视婷婷| 丰满人妻一区二区三区53号| 最新欧美色图| 日韩欧美视频在线| 免费在线观看a视频| 精品动漫一区| 洋洋av久久久久久久一区| 欧美成人午夜视频| 国产一区二区视频免费| 国产成人综合在线观看| 蜜桃日韩视频| 日本色护士高潮视频在线观看| 日本乱码高清不卡字幕| 国产xxx在线观看| 久久婷婷蜜乳一本欲蜜臀| 97在线观看视频国产| 国产女人18毛片水真多| 久久久久国产精品麻豆ai换脸 | 91久久免费视频| 欧美a级在线| 国产欧美久久一区二区| 日韩精品视频无播放器在线看| 亚洲视频一二区| 精品999在线| 亚洲电影男人天堂| 国产+成+人+亚洲欧洲| 国产女人18毛片18精品| 欧美高清在线视频| 久久久久人妻精品一区三寸| 电影一区二区在线观看| 久久在线免费视频| 亚洲一区精品在线观看| 久久久久成人黄色影片| 91猫先生在线| 美腿丝袜亚洲图片| 国产在线播精品第三| 欧美高清在线观看| 国产乱码久久久久| 国产精品久久一卡二卡| 欧美日韩大尺度| 亚洲动漫精品| 欧美做受高潮1| 亚洲三区在线播放| 激情亚洲一区二区三区四区| 9.1在线观看免费| 国产精品99一区二区| 亚洲伊人久久大香线蕉av| 欧美日本一道| 91麻豆精品国产91久久久更新时间| 日韩一级片在线免费观看| 日本网站在线观看一区二区三区| 欧美午夜精品理论片a级大开眼界| av第一福利在线导航| 精品久久国产字幕高潮| 青青草激情视频| 国产精品99久久久久久久女警 | 95在线视频| 欧美性受xxxx黑人xyx| 久久久免费看片| 久久99九九99精品| 精品国产一区二区三区在线| 清纯唯美激情亚洲| 欧美精品videofree1080p| 免费看国产片在线观看| 天天综合网天天综合色| 蜜臀av一区二区三区有限公司| 久久国产精品99国产| 欧美在线视频二区| 亚洲高清国产拍精品26u| 久久精品国产一区二区电影| а√中文在线资源库| 亚洲成人黄色影院| 新91视频在线观看| 久久se精品一区精品二区| 久久国产精品免费观看| 国产成人一二| 国产成人精品久久| 老司机福利在线视频| 欧美草草影院在线视频| 国产www在线| 国产精品久久午夜夜伦鲁鲁| 国产精品19p| 久久三级视频| 亚洲第一综合网站| 日本在线中文字幕一区| 国产伊人精品在线| 成人三级小说| 中文字幕久精品免费视频| www.久久综合| 日本丶国产丶欧美色综合| 午夜剧场免费在线观看| 97精品久久久午夜一区二区三区| 欧美三级理论片| 激情综合自拍| 一区二区精品国产| 久久精品福利| 91情侣偷在线精品国产| 欧美成人精品一区二区男人小说| www.欧美三级电影.com| 亚洲欧美日韩综合在线| 69av一区二区三区| 亚洲精品男人的天堂| 亚洲欧美日韩国产成人精品影院| 欧美吞精做爰啪啪高潮| 男男一级淫片免费播放| 美女网站色91| 久久精品国产精品亚洲色婷婷| 国产精品久久久久一区二区三区厕所 | 精品91久久久| 亚洲色图.com| 亚洲专区区免费| 国产成人自拍在线| 57pao国产成永久免费视频| 国产欧美日韩一级| 福利在线小视频| 欧美色蜜桃97| 鲁丝片一区二区三区| 8x国产一区二区三区精品推荐| 国产精品久久久久免费a∨| av岛国在线| 欧美激情久久久久| av网站大全在线| 最近2019免费中文字幕视频三| 亚洲欧美色视频| 亚洲第一精品夜夜躁人人爽| 99在线小视频| 欧美一区二区在线观看| 中文字幕av久久爽| 日本高清成人免费播放| 中文字幕视频网站| 天天影视涩香欲综合网| 久久免费视频播放| 亚洲卡通动漫在线| 日本中文字幕免费在线观看| 国产精品色呦呦| 亚洲精品国产91| 久久久亚洲高清| 精品少妇人妻一区二区黑料社区| jiyouzz国产精品久久| 国产清纯白嫩初高中在线观看性色| 久88久久88久久久| 男人的天堂最新网址| 美美哒免费高清在线观看视频一区二区| 日韩av资源在线| 日韩黄色在线观看| 男人的天堂日韩| 奇米影视一区二区三区小说| 那种视频在线观看| 日韩综合一区二区| 91精品无人成人www| 久久精品国产第一区二区三区 | 国产盗摄精品一区二区三区在线| 亚洲精品视频三区| 国产精品自拍三区| 白丝校花扒腿让我c| 丁香亚洲综合激情啪啪综合| 亚洲av无码一区东京热久久| www.日韩大片| 精品黑人一区二区三区观看时间| 99久久国产综合精品女不卡| 亚洲一区二区三区蜜桃| 久久夜色精品国产噜噜av| av中文字幕免费观看| 中文字幕欧美日本乱码一线二线| 亚洲精品自拍视频在线观看| 亚洲欧美在线另类| 久久网中文字幕| 欧美日韩午夜激情| 久久久999久久久| 91精品国产91久久久久久一区二区| 精品黑人一区二区三区国语馆| 精品少妇一区二区三区| 天堂av网在线| 中日韩美女免费视频网站在线观看 | 国产亚洲va综合人人澡精品| 娇妻被老王脔到高潮失禁视频| 国产精品九色蝌蚪自拍| 青青草原国产视频| 日韩欧美中文第一页| 影音先锋黄色网址| 精品少妇一区二区三区| 美州a亚洲一视本频v色道| 日韩一区av在线| segui88久久综合| 国产精品久久久久免费a∨| 日本综合精品一区| 欧美理论一区二区| 一本一道久久a久久精品蜜桃 | 亚洲精品少妇网址| 毛片在线播放a| 国产91精品久久久久久| 羞羞视频在线观看一区二区| 国产免费一区| 91免费精品| 国产黄页在线观看| 极品尤物av久久免费看| av网站有哪些| 亚洲精品欧美激情| 天天爽夜夜爽人人爽| 欧美大片一区二区| 98在线视频| 91成人国产在线观看| 国产欧美视频在线| 日本一区二区在线| 一本色道久久综合亚洲精品高清| 九九精品久久久| 久久蜜桃香蕉精品一区二区三区| 久久久久亚洲AV成人| 欧美色手机在线观看| 天天av综合网| 欧美激情在线狂野欧美精品| 看片一区二区| 欧美污视频久久久| 亚洲看片一区| 国产又黄又嫩又滑又白| 中文字幕一区二区三中文字幕| 日韩人妻精品中文字幕| 精品欧美黑人一区二区三区| 欧美激情二区| 日韩av男人的天堂| 欧美黑白配在线| 99er在线视频| 国产麻豆视频精品| 日韩亚洲欧美中文字幕| 欧美专区日韩专区| 欧美成人综合在线| 欧美亚洲国产视频| 亚洲福利天堂| 97国产在线播放| 99久免费精品视频在线观看| 国产亚洲欧美久久久久| 日韩限制级电影在线观看| 日韩黄色影院| 国产日本欧美在线观看| 成人三级视频| 在线观看免费成人av| 日本一区二区三区国色天香| 久久精品国产成人av| 日韩成人激情在线| 欧美三级网站| 欧美黑人xxxxx| 久久一区亚洲| 亚洲专区区免费| 色999日韩国产欧美一区二区| 在线观看xxx| 日韩免费中文字幕| 久久av超碰| 男操女免费网站| 国产精品理伦片| 国产精品视频在线观看免费| 久色乳综合思思在线视频| 久久av偷拍| 欧美中文字幕在线观看视频 | 欧美手机在线视频| 2019中文字幕在线视频| 国产在线精品播放| 亚洲欧美综合久久久| 中文字幕18页| 欧美丝袜一区二区三区| 美国一级片在线免费观看视频| 国产成人97精品免费看片| 色777狠狠狠综合伊人| 三区视频在线观看| 亚洲精品欧美激情| 天天操天天操天天干| 欧美中文字幕视频在线观看| 国产最新精品| 992tv人人草| 香蕉加勒比综合久久| 久久久久久青草| 成人网欧美在线视频| 激情婷婷欧美| 中文字幕成人动漫| 日韩欧美一二区| 筱崎爱全乳无删减在线观看| 色综合久久88色综合天天提莫| 激情综合色综合久久| 日本熟妇毛耸耸xxxxxx| 亚洲天堂开心观看| 国产美女视频一区二区 | 裸体一区二区三区| 免费视频一二三区| 亚洲免费福利视频| www.久久草.com| 欧美二区在线视频| 中文字幕一区三区| 日本波多野结衣在线| 国产精品久久二区| 欧美日韩伊人| 貂蝉被到爽流白浆在线观看| 精品国产一区二区亚洲人成毛片| 欧美特黄aaaaaaaa大片| 国产卡一卡二在线| 久久精品人人做人人综合| 精品久久久久成人码免费动漫| 欧美亚洲视频在线看网址| 欧美激情理论| 97超碰在线免费观看| 日韩欧美国产综合在线一区二区三区| 欧美激情喷水| 成人在线播放网址| 中文字幕一区三区|