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

新一代包管理工具 Pnpm

開發 開發工具
在 npm2 發展階段,安裝依賴是相對比較直接的,它會直接按照配置文件 package.json 中的依賴項去下載相關依賴包,而依賴包的組織形式則是按照樹形結構去排列的。

背景

如果你從事過前端方面的工作和開發,相信你對 npm 和 yarn 這樣的工具已經再熟悉不過了。作為包管理工具,npm 已經有了長足的歷史[1]。一個項目初始化過程都需要通過 npm install 命令安裝相關的依賴到 node_modules 目錄下,對于較大型的前端項目,node_modules 的大小很多時候是超乎我們想象的。而 npm 在版本更新迭代的過程中,也一直在優化這個問題,下面我們就簡要聊聊 npm 的發展歷程。

npm 發展

npm2

在 npm2 發展階段,安裝依賴是相對比較直接的,它會直接按照配置文件 package.json 中的依賴項去下載相關依賴包,而依賴包的組織形式則是按照樹形結構去排列的。由于不同的包的依賴關系在版本上差異較大,依賴關系相對復雜,所以 npm2 直接按照配置去下載并組織依賴的方式,是簡單明晰的做法,保證了各個依賴的獨立性,在依賴變更時,相互并不影響,其關系可以通過下圖來描述:

從上圖中,我們可以看到

  • A、B、C 包相互獨立
  • A、B、C 包可能會依賴相同的包,比如 D@1.0
  • A、B、C 包可能會存在較深的依賴層級,比如 C package

其中 2 和 3 這兩點的負面影響會隨著項目復雜度而上升,可能會導致的幾個問題:

  • 較大的冗余。多次下載的相同的依賴包 D@1.0,無法實現共享
  • 較深層級的依賴樹。

Too many dependencies break the Windows file system[2]

Maximum Path Length Limitation[3]

Why does the 260 character path length limit exist in Windows?[4]

node_modules 依賴包路徑過長,超出操作系統最長路徑限制( windows:260 字符,macos:1024 字符),參見:

太深的層級導致文件查找復雜度上升,嚴重影響性能,增加耗時

Note: 通過 npm ls --depth=n 查看項目相關依賴層級深度

npm3

為解決 npm2 中存在的冗余和依賴樹問題,npm3 對依賴項進行了依賴扁平化討論和處理[5]

扁平化具體來講就是依賴不在按照樹型進行安裝,而是安裝將依賴安裝在同級目錄下,npm install安裝依賴時,會按照配置文件 package.json 里的依賴順序進行解析,遇到新包就把它放在第一層級的目錄(如 D@1.0、E@1.0、F@1.0),后面如果遇到第一級目錄已有的包,會先進行依賴版本判斷,如果版本一樣則忽略,否則會按照 npm2 的方式依次掛在依賴包目錄下,這樣處理的原理遵循了`Nodejs`的依賴解析規則[6]:當前目錄下沒有找到node_modules,它將遞歸解析父目錄下的node_modules。

使用 npm3 安裝依賴后如下圖:

這種扁平化處理方式一定程度上緩解了冗余和依賴樹問題,同時 npm3 還支持動態安裝更新包,如果依賴有更新,可以通過 npm dedupe 命令對依賴樹進行優化。

但是 npm3 也存在部分問題,比如:

phantom_deps(幻影依賴)[7]。npm3不會以確定的方式安裝依賴項。舉例來說:我們在 NodeJS 中 require() 的函數,不需要考慮配置文件 package.json 中是否有該依賴項。這可能會導致依賴版本不兼容,并且開發者不容易發現;另外,由于`Nodejs`的依賴解析規則[8],這還會導致幻影 node_modules ,即依賴向上查找,可能會越過代碼目錄自身的 node_modules 。如下:

- my-monorepo/
- package.json
- node_modules/
- semver/
- ...
- my-monorepo/my-library/
- package.json
- lib/
- index.js
- node_modules/
- brace-expansion
- minimatch
- ...

my-monorepo/my-library/lib/index.js 可能使用的是my-monorepo/node_modules 中的依賴,而非自身目錄 my-monorepo/my-library/node_modules

npm doppelgangers(npm 分身)[9]。簡單來講,npm 分身是指同一個依賴的不同版本會出現在 node_modules 中,比如項目中同時依賴了 A@1.0.0 和 A@2.0.0,無論是扁平化處理A@1.0.0 或 A@2.0.0,另一個依賴還是會被重復,如果這樣的分身較多,就會導致一些潛在問題,比如擴展包大小變大、相關類型校驗交叉等

npm5

npm5 通過添加 lock 文件來記錄依賴樹信息,進行依賴鎖定,從而唯一確定 node_modules 的結構,這樣處理可以保證團隊成員使用同一份node_modules依賴結構。但是,我們前文提到的平鋪式的算法的復雜性、幻影依賴和分身問題仍然沒有解決。

pnpm 簡介

前文我們大致梳理了 npm 的發展和遺留問題。而 pnpm 比較巧妙地解決了它們,并且極大地提升了依賴包管理的效率。

pnpm 指 performant npm(高性能的 npm),如 pnpm 官網[10]所言,它是快速的,節省磁盤空間的包管理工具,同時,它也較好地支持了 workspace 和 monorepos。

pnpm 效果

與 npm、yarn、yarn pnp 工具鏈效果對比,來自 pnpm benchmarks[11]

action

cache

lockfile

node_modules

npm

pnpm

Yarn

Yarn PnP

install




1m 9.5s

15.3s

16.6s

23.6s

install

?

?

?

2.4s

1.3s

2.3s

n/a

install

?

?


14.8s

4s

6.8s

1.5s

install

?



21.8s

8.9s

11.2s

6.2s

install


?


35.4s

13.4s

12s

17.9s

install

?


?

3.1s

1.9s

7s

n/a

install


?

?

2.4s

1.3s

7.6s

n/a

install



?

3s

6.1s

11.8s

n/a

update

n/a

n/a

n/a

2.3s

11.8s

15.5s

28.3s

從上表數據我們可以看出,pnpm 的各項性能均比其它包管理工具有優勢,那你可能會想,為什么 pnpm 有如此優越的表現,接下來我們聊聊 pnpm 的主要原理

pnpm 的原理

pnpm 主要有兩個不同與其包管理工具的特性:

基于硬鏈接的 node_modules

pnpm 創建從全局存儲到項目中 node_modules 文件夾的硬鏈接[12],而硬鏈接指向磁盤上原始文件所在的同一位置,具體來說就是 node_modules 中每個包的每個文件都是來自內容可尋址存儲[13]的硬鏈接,簡言之,就是特定版本和名稱的包全局只有一份。舉例來看:

node_modules
└── .pnpm
├── bar@1.0.0
│ └── node_modules
│ └── bar -> <store>/bar
│ ├── index.js
│ └── package.json
└── foo@1.0.0
└── node_modules
└── foo -> <store>/foo
├── index.js
└── package.json

node_modules 下面的唯一文件夾叫做 .pnpm, .pnpm 下面是一個 文件夾,而在其下面 的文件夾是一個基于內容可尋址存儲的硬鏈接。同時,我們也可以通過 pnpm root 命令來打印當前項目中存放模塊(modules)的有效目錄。

基于依賴解析的軟鏈接 symlinks

觀察以下依賴包結構:

node_modules
├── foo -> ./.pnpm/foo@1.0.0/node_modules/foo
└── .pnpm
├── bar@1.0.0
│ └── node_modules
│ └── bar -> <store>/bar
└── foo@1.0.0
└── node_modules
├── foo -> <store>/foo
└── bar -> ../../bar@1.0.0/node_modules/bar

我們可以看到在 foo@1.0.0/node_modules/bar 內引用了 bar 的軟鏈接 ../../bar@1.0.0/node_modules/bar,而在項目里引用 foo 的軟鏈接 ./.pnpm/foo@1.0.0/node_modules/foo,如果項目內新增一個依賴包 qar@2.0.0,則其引用結構如下:

node_modules
├── foo -> ./.pnpm/foo@1.0.0/node_modules/foo
└── .pnpm
├── bar@1.0.0
│ └── node_modules
│ ├── bar -> <store>/bar
│ └── qar -> ../../qar@2.0.0/node_modules/qar
├── foo@1.0.0
│ └── node_modules
│ ├── foo -> <store>/foo
│ ├── bar -> ../../bar@1.0.0/node_modules/bar
│ └── qar -> ../../qar@2.0.0/node_modules/qar
└── qar@2.0.0
└── node_modules
└── qar -> <store>/qar

根據前文我們介紹到的`Nodejs`的依賴解析規則[14],foo@1.0.0/node_modules/foo/index.js 中所需的依賴包 bar,實際上使用的是bar@1.0.0/node_modules/bar中的內容,因此,只有真正在依賴項中的包才能被訪問到。而對于不同的 peer dependencies 的依賴解析原理,可以參考這里 How peers are resolved[15]

通過基于硬鏈接的node_modules和基于依賴解析的軟鏈接原理,我們了解到,當我們在相同操作系統下第二次安裝同一個依賴包時,我們需要做的僅僅是創建一個該依賴包對應的硬鏈接,對于同一個依賴包的不同版本,也只有不同的部分會被重新保存起來,而具體有沒有 pnpm 是在哪里判斷的呢?全局的 pnpm 索引文件在 ~/.pnpm-store/v3/files。基于此,使用硬鏈接讓依賴包的安裝速度非常快,同時也去除了冗余,節省較大磁盤空間。

symlinks 符號連接[16]

pnpm 使用

pnpm 的具體使用這里我們不展開介紹了,可以查看官網使用方法[17]和CLI 命令[18]即可。這里只提幾個有意思的點

CI 集成

在 GitHub Actions 上,你可以像這樣使用 pnpm 安裝和緩存依賴項,配置文件目錄: .github/workflows/NAME.yml。

name: pnpm Example Workflow
on:
push:
jobs:
build:
runs-on: ubuntu-20.04
strategy:
matrix:
node-version: [15]
steps:
- uses: actions/checkout@v2
- uses: pnpm/action-setup@v2.0.1
with:
version: 6.20.3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
cache: 'pnpm'
- name: Install dependencies
run: pnpm install

pnpm 除了在開發體驗方面的優越表現,在項目集成方面也毫不遜色,對于較大型項目從 npm 或 yarn到pnpm遷移過程后,也得到了極大的優化,結果如下:


Without cache

With cache

yarn 2 (without dedupe)

6min 31s

1min 11s

yarn 3 (without dedupe)

4min 50s

57s

yarn 3

4min 1s

50s

yarn 3 (optimized)

1min 10

45s

pnpm

58s

24s

通過以上數據,我們可以 pnpm 在 CI 應用中的良好表現。

具體可以參考這篇最佳實踐 A story of how we migrated to pnpm[19]

pnpm 前置

項目中使用 pnpm 時,如果你不希望項目內其他人使用 npm i 或 yarn這類包管理器,可以在 package.json 配置文件中添加預安裝 preinstall 配置項,從而規范使用統一的包管理器。

{
"scripts": {
"preinstall": "npx only-allow pnpm"
}
}

管理 NodeJS 版本

在以前,如果你同時支撐了多個項目,而且需要在其中切換,你可能需要切換不同的 NodeJS 版本,也許你會用到像 nvm 或 Volta[20] 這樣的 NodeJS 版本管理器,而 pnpm 從 v6.12.0 版本后支持了 pnpm env[21] 命令,你可以使用它來安裝并指定使用哪個版本的 NodeJS ,是不是方便了很多。

monorepo 支持

因為pnpm 對 monorepos 的大力支持,像 Vue、Vite 這些開源項目也轉而使用了它。使用pnpm run 結合 --filter 、 --recursive 和 --parallel 選項,可以指定特定包,并高速執行相關命令。這樣做的好處是之前要另外安裝 lerna 這種 monorepo 管理工具的場景,現在 pnpm 可以包攬了。詳細文章可以參考這里 pnpm vs Lerna: filtering in a multi-package repository[22]。

總結

本文從 pnpm 的出現背景開始,簡要介紹了 npm 的發展過程及存在的問題,繼而對 pnpm 及其效果進行了簡介,重點講述了 pnpm 的實現原理,并從應用側選擇了四個點展開。

pnpm 作為新一代包管理器,自身有不少優越的表現,它通過硬鏈接和軟鏈接的方式,解決了 npm幻影依賴和分身問題,并且較好地解決了依賴包復用問題,從而實現了依賴包高效快速的安裝。需要特別注意的是 pnpm 嚴格遵循了 Nodejs 依賴解析規則,規避了之前任意依賴包的訪問修改問題。

當然,pnpm 使用過程中也存在一些問題,包括 Vue 官方在遷移過程中,也處理過部分問題。另外,一些包也存在兼容性問題,由于包自己實現了模塊解析,并沒有遵循相關規范。但 pnpm 也提供了相關解決方法。具體參考 pnpm FAQ[23]。

參考資料:

[1]歷史: https://github.com/npm/cli/blob/latest/changelogs/CHANGELOG-1.md

[2]Too many dependencies break the Windows file system: https://github.com/npm/npm/issues/3697

[3]Maximum Path Length Limitation: https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=cmd

[4]Why does the 260 character path length limit exist in Windows?: https://stackoverflow.com/questions/1880321/why-does-the-260-character-path-length-limit-exist-in-windows

[5]依賴扁平化討論和處理: https://github.com/npm/cli/blob/latest/changelogs/CHANGELOG-3.md

[6]Nodejs的依賴解析規則: https://nodejs.org/api/modules.html#all-together

[7]phantom_deps(幻影依賴): https://rushjs.io/pages/advanced/phantom_deps/

[8]npm doppelgangers(npm 分身): https://rushjs.io/pages/advanced/npm_doppelgangers/

[9]pnpm 官網: https://pnpm.io/

[10]pnpm benchmarks: https://pnpm.io/zh/benchmarks

[11]硬鏈接: https://zh.wikipedia.org/wiki/%E7%A1%AC%E9%93%BE%E6%8E%A5

[12]內容可尋址存儲: https://en.wikipedia.org/wiki/Content-addressable_storage

[13]How peers are resolved: https://pnpm.io/zh/how-peers-are-resolved

[14]symlinks 符號連接: https://zh.wikipedia.org/wiki/%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5

[15]使用方法: https://pnpm.io/zh/pnpm-cli

[16]CLI 命令: https://pnpm.io/zh/cli/add

[17]A story of how we migrated to pnpm: https://divriots.com/blog/switching-to-pnpm

[18]Volta: https://volta.sh/

[19]pnpm env: https://pnpm.io/zh/cli/env

[20]pnpm vs Lerna: filtering in a multi-package repository: https://medium.com/pnpm/pnpm-vs-lerna-filtering-in-a-multi-package-repository-1f68bc644d6a

[23]pnpm FAQ: https://pnpm.io/faq#pnpm-does-not-work-with-your-project-here

責任編輯:武曉燕 來源: 青梅主碼
相關推薦

2022-02-07 23:03:07

Python工具管理庫

2022-08-03 08:02:46

PDM工具Python

2022-07-01 09:17:14

Pythonpoetry工具

2022-06-28 16:30:26

管理工具Python

2022-05-16 09:14:28

前端構建工具

2022-05-23 08:59:02

piniavue插件

2025-04-17 03:00:00

dbt數據轉換工具開源

2025-11-18 09:25:09

2013-10-21 10:01:04

編碼工具擴展

2020-10-09 11:50:10

ReactRecoil前端

2020-11-13 15:40:18

React前端Recoil

2012-07-02 10:36:19

菲亞特

2022-03-10 16:01:29

Playwright開源

2013-01-04 16:15:08

微軟ERPDynamics AX

2010-02-23 17:21:06

Fedora yum

2022-06-15 15:09:48

管理工具

2023-12-30 16:30:29

開發者工具Vite

2016-01-26 11:58:12

2025-02-13 09:37:58

2010-05-05 18:05:00

新一代數據中心
點贊
收藏

51CTO技術棧公眾號

中文字幕一区二区三三 | 国产精品香蕉一区二区三区| 日韩一区二区精品视频| 九色91porny| caoporn视频在线| 久久精品欧美一区二区三区不卡 | 91麻豆精品一二三区在线| 亚洲精品五月天| 久久一区二区三区av| 中文字幕在线视频第一页| 欧美不卡高清| 亚洲最新中文字幕| 亚洲熟女乱综合一区二区| 日本在线播放一二三区| 18涩涩午夜精品.www| 国产精品国产三级欧美二区| 成人a v视频| 欧美欧美天天天天操| 亚洲人成网在线播放| 奇米777在线视频| a欧美人片人妖| 亚洲精品一二三四区| 免费一区二区三区| 亚洲第一天堂网| 男女男精品视频| 8050国产精品久久久久久| 欧美国产日韩在线观看成人| 亚洲va久久久噜噜噜久久| 欧美一区二区久久| 中文字幕永久视频| 国产盗摄——sm在线视频| 成人免费在线播放视频| 日韩尤物视频| 午夜福利理论片在线观看| 国产在线看一区| 国产精品久久久久不卡| aaa人片在线| 激情成人综合| 欧美日韩不卡合集视频| 国产精品18在线| 精品国产91乱码一区二区三区四区| 欧美变态口味重另类| 国产成人美女视频| 国产成人77亚洲精品www| 欧美丝袜一区二区| 国产在线精品91| 蜜臀av国内免费精品久久久夜夜| 亚洲素人一区二区| 亚洲欧美日韩精品久久久 | 高潮毛片又色又爽免费| 亚洲精品女人| 96精品视频在线| 日韩精品一区二区三| 国产综合精品一区| 欧美激情国产精品| 免费在线观看黄色av| 一区二区三区毛片免费| 久久久精品久久久久| 国产亚洲精品久久久久久豆腐| 亚洲精品456| 日韩麻豆第一页| 91精品国产自产| 免费欧美视频| 永久免费精品影视网站| 国产精品一二三区在线观看| 精品久久美女| 色青青草原桃花久久综合| 日本理论中文字幕| 99久久99久久精品国产片果冰| 中文字幕亚洲欧美日韩2019| 午夜国产福利视频| 91精品国产自产拍在线观看蜜| 北条麻妃在线一区二区| 外国一级黄色片| 欧美视频网站| 1769国内精品视频在线播放| 国产成人无码av| 麻豆精品国产传媒mv男同| 91久久精品国产91久久| 国产成a人亚洲精v品无码| 国产成人精品免费| 久久综合中文色婷婷| 二区在线观看| 亚洲免费视频成人| 久久久999免费视频| 日韩a**中文字幕| 欧美精品一级二级| 欧美xxxx×黑人性爽| 国产亚洲一区二区三区不卡| 久久亚洲综合国产精品99麻豆精品福利| 欧美日韩在线观看成人| 中文在线一区| 91久久久久久久一区二区| 色网站免费观看| 国产精品久久久久影视| 91免费黄视频| 亚洲精品三区| 亚洲精品98久久久久久中文字幕| 成人做爰69片免网站| 欧美fxxxxxx另类| 国产精品88a∨| 午夜精品一区二区三| 日本一区二区综合亚洲| 日本黄大片在线观看| 成人福利片在线| 亚洲精品国精品久久99热| 国产精品国产三级国产专业不| 欧美1级日本1级| 国产精品久久久久久亚洲调教| 亚洲精品久久久狠狠狠爱| 国产欧美久久久精品影院| 久久99中文字幕| 亚洲91在线| 日韩精品免费观看| 女同久久另类69精品国产| 亚洲精品乱码| 亚洲精品日韩激情在线电影| 国产高清一级毛片在线不卡| 夜夜精品视频一区二区| 免费av网址在线| 亚洲国产视频二区| 在线日韩日本国产亚洲| 国产大片中文字幕在线观看| 激情五月播播久久久精品| 久久精品女人的天堂av| 大片免费在线观看| 91福利精品视频| 国产一级免费片| 久久久久久久久久久妇女| 欧美激情精品久久久久久久变态| 国产偷人爽久久久久久老妇app | 精品在线视频观看| 久久精品99久久久| 欧美日韩电影一区二区三区| 性国产高清在线观看| 欧美色老头old∨ideo| 黑丝av在线播放| 欧美久久视频| 91精品国产99久久久久久红楼 | 久久婷婷五月综合色丁香| 精品国产区一区| 青青青在线视频| 另类中文字幕网| 欧美日韩一区二| 老色鬼在线视频| 亚洲成人激情在线| 久久久久亚洲av无码专区体验| 国内不卡的二区三区中文字幕| 日本日本精品二区免费| 国产高潮在线| 亚洲国产又黄又爽女人高潮的| 丰满少妇被猛烈进入一区二区| 麻豆精品在线播放| 日韩精品久久久| 8av国产精品爽爽ⅴa在线观看 | 97伦伦午夜电影理伦片| 亚洲无吗在线| 国产女主播一区二区| 欧美1234区| 欧美成人激情免费网| 国产一级大片在线观看| 国产iv一区二区三区| 免费极品av一视觉盛宴| 九九99久久精品在免费线bt| 精品国偷自产在线| 精品乱码一区内射人妻无码 | 日韩欧美国产麻豆| 免费网站看av| 成人国产一区二区三区精品| 九色自拍视频在线观看| 久久97精品| 日本亚洲精品在线观看| 国产日本在线观看| 欧美日韩在线播放三区四区| 日韩av毛片在线观看| 国产黄色成人av| 超碰成人免费在线| 色老板在线视频一区二区| 日本在线精品视频| 99re热久久这里只有精品34| 欧美日韩精品电影| 永久免费看片直接| 福利电影一区二区| 国产女大学生av| 欧美精品尤物在线观看| 成人国产精品色哟哟| av文字幕在线观看| 亚洲第一区第一页| 中文字幕一区2区3区| 亚洲欧美一区二区三区孕妇| 一级黄色免费视频| 久久精品午夜| 一本久久a久久精品vr综合| 国产精品成人**免费视频| 91大神在线播放精品| 性开放的欧美大片| 欧美成人福利视频| 神马久久久久久久| 亚洲天堂成人网| 日韩av无码一区二区三区不卡 | 亚洲欧美日韩国产手机在线 | 国产欧美一区二区三区在线看蜜臀 | 欧美制服第一页| 成年人视频免费在线观看| 欧美一区二区三区在线观看| 综合五月激情网| 国产日韩精品一区二区三区在线| 国产5g成人5g天天爽| 亚洲国产mv| 中文字幕欧美日韩一区二区| 久久精品福利| 国产精品视频免费观看www| 国产传媒在线观看| 精品国产一区av| 五月婷在线视频| 91麻豆精品国产自产在线观看一区 | 男女午夜激情视频| 中文字幕午夜精品一区二区三区| 欧美日韩在线精品| 国产香蕉精品| 成人在线播放av| 国产精品迅雷| 欧美激情a在线| 2021av在线| 亚洲剧情一区二区| 成人午夜免费在线观看| 6080亚洲精品一区二区| 一级片免费在线播放| 亚洲午夜电影在线观看| 蜜桃av免费观看| 久久久噜噜噜久噜久久综合| 亚洲第一色av| 精品亚洲欧美一区| 九九九在线观看视频| 国产一区白浆| 国产精品va在线观看无码| 日韩精品免费一区二区在线观看 | 免费看日批视频| 午夜欧美一区二区三区在线播放| 午夜黄色福利视频| 中文字幕一区二区三区四区不卡 | 日韩国产第一页| 欧美国产日产图区| av中文字幕免费观看| 99久久99久久免费精品蜜臀| 极品白嫩的小少妇| 国产成人在线视频网站| 国产老头和老头xxxx×| 黄页视频在线91| 手机免费av片| 久久激情五月婷婷| 欧美一区二区三区影院| 国产精品中文有码| 一个人看的视频www| 国产精品性做久久久久久| 天天做天天干天天操| 国产成人精品免费看| 91精品国产高清91久久久久久 | 你懂的国产精品| 亚洲国产精品女人| 欧美日韩日本国产亚洲在线| 国产树林野战在线播放| 亚洲色图88| 黄色一级视频播放| 欧美在线亚洲| 免费看日本黄色| 99精品国产在热久久| 波多野结衣乳巨码无在线| 国产日本精品| 亚洲人成色77777| 日韩av在线播放中文字幕| 97超碰成人在线| 国产精品一区二区不卡| 曰本三级日本三级日本三级| 成人深夜在线观看| 亚洲av无码一区二区三区观看| 91在线高清观看| 女人裸体性做爰全过| 亚洲欧洲国产日韩| 免费在线一区二区三区| 精品国产91久久久久久老师| 日产精品久久久| 欧美日韩在线播放三区四区| 99久久精品无免国产免费| 精品国产自在久精品国产| 日本精品久久久久久| 亚洲欧美视频在线| 成人在线观看免费| 久久久天堂国产精品女人| 中文av在线全新| 国产欧美中文字幕| 国产精品网在线观看| 久久国产日韩欧美| 亚洲激情久久| 九色在线视频观看| 理论电影国产精品| 国产av一区二区三区传媒| 99精品欧美一区| 青草影院在线观看| 欧美性xxxxxx| 国产美女自慰在线观看| 日韩不卡在线观看| 在线观看国产原创自拍视频| 久久人人爽人人爽人人片av高请| 成人亚洲欧美| 96国产粉嫩美女| 亚洲欧美日本伦理| 在线观看av的网址| 蜜臀av性久久久久av蜜臀妖精| 东京热av一区| 中文字幕亚洲在| 日产精品久久久| 精品视频一区二区不卡| 污视频网站在线播放| 日韩视频在线观看免费| 丝袜诱惑一区二区| 91麻豆桃色免费看| 精品女人视频| a级片一区二区| 青青青伊人色综合久久| 女同性恋一区二区三区| 最新不卡av在线| 天天操中文字幕| 亚洲第一av在线| 91高清在线观看视频| 国产福利精品在线| 日韩伦理一区二区三区| 国产精品一色哟哟| 国产在线看一区| 成年人免费视频播放| 91电影在线观看| 亚洲欧洲视频在线观看| 国内自拍欧美激情| 日韩精品视频在线看| 亚洲欧美99| 三级不卡在线观看| 大地资源二中文在线影视观看 | 亚洲成人精品视频在线观看| 求av网址在线观看| 国产精品久久77777| 大奶在线精品| 人妻夜夜添夜夜无码av| 国产成人精品在线看| 久久久精品视频免费观看| 欧美精品在线一区二区| 黄色免费在线观看| 国产在线拍揄自揄视频不卡99| 国产成人调教视频在线观看 | 波多野在线观看| 超碰国产精品久久国产精品99| 四虎国产精品免费观看| 久久精品国产露脸对白| 综合久久给合久久狠狠狠97色 | 欧美日韩免费观看一区| 国产色综合网| 欧美成人午夜精品免费| 亚洲曰韩产成在线| 日批视频在线播放| 国内免费久久久久久久久久久| 极品尤物一区| 成人黄色av片| 久久嫩草精品久久久久| 潘金莲一级淫片aaaaaa播放| 亚洲男人天堂2024| 日本精品在线中文字幕| 日本一区二区久久精品| 麻豆精品国产91久久久久久| 国产成人在线网址| 91精品国产综合久久久久| 国产激情小视频在线| 成人免费看片网站| 99精品国产福利在线观看免费| 久久久久久久无码| 色综合久久久久综合体桃花网| 手机看片一区二区三区| 国产精品久久久久免费a∨| 久久国产中文字幕| 色婷婷综合在线观看| 亚洲一区二区av在线| 激情综合闲人网| 国产区精品视频| 午夜电影亚洲| 免费看污黄网站在线观看| 91精品在线麻豆| eeuss鲁一区二区三区| 欧美精品一区二区三区在线看午夜 | 一呦二呦三呦精品国产| 永久免费精品视频网站| 国产一区二区精品久久99| 国产黄色片视频| 一区二区三区视频免费在线观看| a一区二区三区亚洲| 国产精品三级一区二区| 国产精品无圣光一区二区| 国产视频一区二区三区四区五区| 欧美高清在线视频观看不卡| 免费看av成人| 久久久无码人妻精品无码| 91黄视频在线观看| 在线观看午夜av|