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

Package.json 配置完全解讀,充分了解這些配置有助于我們提高開發的效率

開發 前端
在每個前端項目中,都有package.json文件,它是項目的配置文件,常見的配置有配置項目啟動、打包命令,聲明依賴包等。package.json文件是一個JSON對象,該對象的每一個成員就是當前項目的一項設置。package.json作為前端的大管家,到底有哪些配置和我們的日常開發密切相關?下面就來仔細剖析一下這個文件。

今天來看看前端的大管家 package.json 文件相關的配置,充分了解這些配置有助于我們提高開發的效率,規范我們的項目。文章內容較多,建議先收藏在學習!

在每個前端項目中,都有package.json文件,它是項目的配置文件,常見的配置有配置項目啟動、打包命令,聲明依賴包等。package.json文件是一個JSON對象,該對象的每一個成員就是當前項目的一項設置。package.json作為前端的大管家,到底有哪些配置和我們的日常開發密切相關?下面就來仔細剖析一下這個文件。

當我們搭建一個新項目時,往往腳手架就幫我們初始化好了一個package.jaon配置文件,它位于項目的根目錄中。當使用react腳手架(create-react-app)初始化一個項目時,其package.json文件內容如下:

{
  "name": "my-app",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^5.14.1",
    "@testing-library/react": "^11.2.7",
    "@testing-library/user-event": "^12.8.3",
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "react-scripts": "4.0.3",
    "web-vitals": "^1.1.2"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}

當克隆一個新的項目到本地時,需要執行npm install(yarn install)命令來安裝項目所需的依賴文件。當執行該命令時,就會根據 package.json 文件中的配置信息來自動下載所需的模塊,也就是配置項目所需的運行和開發環境。

package.json 常見配置項如下:

一、必須屬性

package.json中最重要的兩個字段就是name和version,它們都是必須的,如果沒有,就無法正常執行npm install命令。npm規定package.json文件是由名稱和版本號作為唯一標識符的。

1、name

name很容易理解,就是項目的名稱,它是一個字符串。在給name字段命名時,需要注意以下幾點:

  • 名稱的長度必須小于或等于214個字符,不能以“.”和“_”開頭,不能包含大寫字母(這是因為當軟件包在npm上發布時,會基于此屬性獲得自己的URL,所以不能包含非URL安全字符(non-url-safe));
  • 名稱可以作為參數被傳入require(""),用來導入模塊,所以應當盡可能的簡短、語義化;
  • 名稱不能和其他模塊的名稱重復,可以使用npm view命令查詢模塊明是否重復,如果不重復就會提示404:

如果npm包上有對應的包,則會顯示包的詳細信息:

實際上,我們平時開發的很多項目并不會發布在npm上,所以這個名稱是否標準可能就不是那么重要,它不會影響項目的正常運行。如果需要發布在npm上,name字段一定要符合要求。

2、version

version字段表示該項目包的版本號,它是一個字符串。在每次項目改動后,即將發布時,都要同步的去更改項目的版本號。版本號的使用規范如下:

  • 版本號的命名遵循語義化版本2.0.0規范,格式為:主版本號.次版本號.修訂號,通常情況下,修改主版本號是做了大的功能性的改動,修改次版本號是新增了新功能,修改修訂號就是修復了一些bug;
  • 如果某個版本的改動較大,并且不穩定,可能如法滿足預期的兼容性需求,就需要發布先行版本,先行版本通過會加在版本號的后面,通過“-”號連接以點分隔的標識符和版本編譯信息:內部版本(alpha)、公測版本(beta)和候選版本(rc,即release candiate)。

可以通過以下命令來查看npm包的版本信息,以react為例:

// 查看最新版本
npm view react version
// 查看所有版本
npm view react versions

當執行第二條命令時,結果如下:

二、描述信息

package.jaon中有五個和項目包描述信息相關的配置字段,下面就分別來看看這些字段的含義。

1、description

description字段用來描述這個項目包,它是一個字符串,可以讓其他開發者在 npm 的搜索中發現我們的項目包。

2、keywords

keywords字段是一個字符串數組,表示這個項目包的關鍵詞。和description一樣,都是用來增加項目包的曝光率的。下面是eslint包的描述和關鍵詞:

3、author

author顧名思義就是作者,表示該項目包的作者。它有兩種形式,一種是字符串格式:

"author": "CUGGZ <xxxxx@xx.com> (https://juejin.cn/user/3544481220801815)"

另一種是對象形式:

"author": {
  "name" : "CUGGZ",
  "email" : "xxxxx@xx.com",
  "url" : "https://juejin.cn/user/3544481220801815"
}

4、contributors

contributors表示該項目包的貢獻者,和author不同的是,該字段是一個數組,包含所有的貢獻者,它同樣有兩種寫法:

"contributors": [
  "CUGGZ0 <xxxxx@xx.com> (https://juejin.cn/user/3544481220801815)",
  "CUGGZ1 <xxxxx@xx.com> (https://juejin.cn/user/3544481220801815)"
 ]
"contributors": [
  {
   "name" : "CUGGZ0",
   "email" : "xxxxx@xx.com",
   "url" : "https://juejin.cn/user/3544481220801815"
 },
  {
   "name" : "CUGGZ1",
   "email" : "xxxxx@xx.com",
   "url" : "https://juejin.cn/user/3544481220801815"
 }
 ]

5、homepage

homepage就是項目的主頁地址了,它是一個字符串。

6、repository

repository表示代碼的存放倉庫地址,通常有兩種書寫形式。第一種是字符串形式:

"repository": "https://github.com/facebook/react.git"

除此之外,還可以顯式地設置版本控制系統,這時就是對象的形式:

"repository": {
  "type": "git",
  "url": "https://github.com/facebook/react.git"
}

7、bugs

bugs表示項目提交問題的地址,該字段是一個對象,可以添加一個提交問題的地址和反饋的郵箱:

"bugs": { 
  "url" : "https://github.com/facebook/react/issues",
  "email" : "xxxxx@xx.com"
}

最常見的bugs就是Github中的issues頁面,如上就是react的issues頁面地址。

三、依賴配置

通常情況下,我們的項目會依賴一個或者多個外部的依賴包,根據依賴包的不同用途,可以將他們配置在下面的五個屬性下:dependencies、devDependencies、peerDependencies、bundledDependencies、optionalDependencies 。下面就來看看每個屬性的含義。

1、dependencies

dependencies字段中聲明的是項目的生產環境中所必須的依賴包。當使用 npm 或 yarn 安裝npm包時,該npm包會被自動插入到此配置項中:

npm install <PACKAGENAME>
yarn add <PACKAGENAME>

當在安裝依賴時使用--save參數,也會將新安裝的npm包寫入dependencies屬性。

npm install --save <PACKAGENAME>

該字段的值是一個對象,該對象的各個成員,分別由模塊名和對應的版本要求組成,表示依賴的模塊及其版本范圍。

"dependencies": {
   "react": "^17.0.2",
   "react-dom": "^17.0.2",
   "react-scripts": "4.0.3",
},

這里每一項配置都是一個鍵值對(key-value), key表示模塊名稱,value表示模塊的版本號。版本號遵循主版本號.次版本號.修訂號的格式規定:

  • 固定版本: 上面的react-scripts的版本4.0.3就是固定版本,安裝時只安裝這個指定的版本。
  • 波浪號: 比如~4.0.3,表示安裝4.0.x的最新版本(不低于4.0.3),也就是說安裝時不會改變主版本號和次版本號。
  • 插入號: 比如上面 react 的版本^17.0.2,表示安裝17.x.x的最新版本(不低于17.0.2),也就是說安裝時不會改變主版本號。如果主版本號為0,那么插入號和波浪號的行為是一致的。
  • latest:安裝最新的版本。

需要注意,不要把測試或者過渡性的依賴放在dependencies,避免生產環境出現意外的問題。

2、devDependencies

devDependencies中聲明的是開發階段需要的依賴包,如Webpack、Eslint、Babel等,用于輔助開發。它們不同于 dependencies,因為它們只需安裝在開發設備上,而無需在生產環境中運行代碼。當打包上線時并不需要這些包,所以可以把這些依賴添加到 devDependencies 中,這些依賴依然會在本地指定 npm install 時被安裝和管理,但是不會被安裝到生產環境中。

當使用 npm 或 yarn 安裝軟件包時,指定以下參數后,新安裝的npm包會被自動插入到此列表中:

npm install --save-dev <PACKAGENAME>
yarn add --dev <PACKAGENAME>
"devDependencies": {
  "autoprefixer": "^7.1.2",
  "babel-core": "^6.22.1"
}

3、peerDependencies

有些情況下,我們的項目和所依賴的模塊,都會同時依賴另一個模塊,但是所依賴的版本不一樣。比如,我們的項目依賴A模塊和B模塊的1.0版,而A模塊本身又依賴B模塊的2.0版。大多數情況下,這不是問題,B模塊的兩個版本可以并存,同時運行。但是,有一種情況,會出現問題,就是這種依賴關系將暴露給用戶。

最典型的場景就是插件,比如A模塊是B模塊的插件。用戶安裝的B模塊是1.0版本,但是A插件只能和2.0版本的B模塊一起使用。這時,用戶要是將1.0版本的B的實例傳給A,就會出現問題。因此,需要一種機制,在模板安裝的時候提醒用戶,如果A和B一起安裝,那么B必須是2.0模塊。

peerDependencies字段就是用來供插件指定其所需要的主工具的版本。

"name": "chai-as-promised",
"peerDependencies": {
   "chai": "1.x"
}

上面代碼指定在安裝chai-as-promised模塊時,主程序chai必須一起安裝,而且chai的版本必須是1.x。如果項目指定的依賴是chai的2.0版本,就會報錯。

需要注意,從npm 3.0版開始,peerDependencies不再會默認安裝了。

4、optionalDependencies

如果需要在找不到包或者安裝包失敗時,npm仍然能夠繼續運行,則可以將該包放在optionalDependencies對象中,optionalDependencies對象中的包會覆蓋dependencies中同名的包,所以只需在一個地方進行設置即可。

需要注意,由于optionalDependencies中的依賴可能并為安裝成功,所以一定要做異常處理,否則當獲取這個依賴時,如果獲取不到就會報錯。

5、bundledDependencies

上面的幾個依賴相關的配置項都是一個對象,而bundledDependencies配置項是一個數組,數組里可以指定一些模塊,這些模塊將在這個包發布時被一起打包。

需要注意,這個字段數組中的值必須是在dependencies, devDependencies兩個里面聲明過的包才行。

6、engines

當我們維護一些舊項目時,可能對npm包的版本或者Node版本有特殊要求,如果不滿足條件就可能無法將項目跑起來。為了讓項目開箱即用,可以在engines字段中說明具體的版本號:

"engines": {
 "node": ">=8.10.3 <12.13.0",
  "npm": ">=6.9.0"
}

需要注意,engines只是起一個說明的作用,即使用戶安裝的版本不符合要求,也不影響依賴包的安裝。

四、腳本配置

1、scripts

scripts 是 package.json中內置的腳本入口,是key-value鍵值對配置,key為可運行的命令,可以通過 npm run 來執行命令。除了運行基本的scripts命令,還可以結合pre和post完成前置和后續操作。先來看一組scripts:

"scripts": {
 "dev": "node index.js",
  "predev": "node beforeIndex.js",
  "postdev": "node afterIndex.js"
}

這三個js文件中都有一句console:

// index.js
console.log("scripts: index.js")
// beforeIndex.js
console.log("scripts: before index.js")
// afterIndex.js
console.log("scripts: after index.js")

當我們執行npm run dev命令時,輸出結果如下:

scripts: before index.js
scripts: index.js
scripts: after index.js

可以看到,三個命令都執行了,執行順序是predev→dev→postdev。如果scripts命令存在一定的先后關系,則可以使用這三個配置項,分別配置執行命令。

通過配置scripts屬性,可以定義一些常見的操作命令:

"scripts": {
  "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
  "start": "npm run dev",
  "unit": "jest --config test/unit/jest.conf.js --coverage",
  "test": "npm run unit",
  "lint": "eslint --ext .js,.vue src test/unit",
  "build": "node build/build.js"
}

這些腳本是命令行應用程序??梢酝ㄟ^調用 npm run XXX 或 yarn XXX 來運行它們,其中 XXX 是命令的名稱。例如:npm run dev。我們可以為命令使用任何的名稱,腳本也可以是任何操作。

使用好該字段可以大大的提升開發效率。

2、config

config字段用來配置scripts運行時的配置參數,如下所示:

"config": {
 "port": 3000
}

如果運行npm run start,則port字段會映射到npm_package_config_port環境變量中:

console.log(process.env.npm_package_config_port) // 3000

用戶可以通過npm config set foo:port 3001 命令來重寫port的值。

五、文件&目錄

下面來看看package.json中和文件以及目錄相關的屬性。

1、main

main 字段用來指定加載的入口文件,在 browser 和 Node 環境中都可以使用。如果我們將項目發布為npm包,那么當使用 require 導入npm包時,返回的就是main字段所列出的文件的module.exports 屬性。如果不指定該字段,默認是項目根目錄下的index.js。如果沒找到,就會報錯。

該字段的值是一個字符串:

"main": "./src/index.js",

2、browser

browser字段可以定義 npm 包在 browser 環境下的入口文件。如果 npm 包只在 web 端使用,并且嚴禁在 server 端使用,使用 browser 來定義入口文件。

"browser": "./src/index.js"

3、module

module字段可以定義 npm 包的 ESM 規范的入口文件,browser 環境和 node 環境均可使用。如果 npm 包導出的是 ESM 規范的包,使用 module 來定義入口文件。

"module": "./src/index.mjs",

需要注意,*.js 文件是使用 commonJS 規范的語法(require('xxx')),*.mjs 是用 ESM 規范的語法(import 'xxx')。

上面三個的入口入口文件相關的配置是有差別的,特別是在不同的使用場景下。在Web環境中,如果使用loader加載ESM(ES module),那么這三個配置的加載順序是browser→module→main,如果使用require加載CommonJS模塊,則加載的順序為main→module→browser。

Webpack在進行項目構建時,有一個target選項,默認為Web,即構建Web應用。如果需要編譯一些同構項目,如node項目,則只需將webpack.config.js的target選項設置為node進行構建即可。如果再Node環境中加載CommonJS模塊,或者ESM,則只有main字段有效。

4、bin

bin字段用來指定各個內部命令對應的可執行文件的位置:

"bin": {
  "someTool": "./bin/someTool.js"
}

這里,someTool 命令對應的可執行文件為 bin 目錄下的 someTool.js,someTool.js會建立符號鏈接node_modules/.bin/someTool。由于node_modules/.bin/目錄會在運行時加入系統的PATH變量,因此在運行npm時,就可以不帶路徑,直接通過命令來調用這些腳本。因此,下面的寫法可以簡寫:

scripts: {  
  start: './node_modules/bin/someTool.js build'
}

// 簡寫
scripts: {  
  start: 'someTool build'
}

所有node_modules/.bin/目錄下的命令,都可以用npm run [命令]的格式運行。

上面的配置在package.json包中提供了一個映射到本地文件名的bin字段,之后npm包將鏈接這個文件到prefix/fix里面,以便全局引入。或者鏈接到本地的node_modules/.bin/文件中,以便在本項目中使用。

5、files

files配置是一個數組,用來描述當把npm包作為依賴包安裝時需要說明的文件列表。當npm包發布時,files指定的文件會被推送到npm服務器中,如果指定的是文件夾,那么該文件夾下面所有的文件都會被提交。

"files": [
    "LICENSE",
    "Readme.md",
    "index.js",
    "lib/"
 ]

如果有不想提交的文件,可以在項目根目錄中新建一個.npmignore文件,并在其中說明不需要提交的文件,防止垃圾文件推送到npm上。這個文件的形式和.gitignore類似。寫在這個文件中的文件即便被寫在files屬性里也會被排除在外。比如可以在該文件中這樣寫:

node_modules
.vscode

build

.DS_Store

6、man

man 命令是 Linux 中的幫助指令,通過該指令可以查看 Linux 中的指令幫助、配置文件幫助和編程幫助等信息。如果 node.js 模塊是一個全局的命令行工具,在 package.json 通過 man 屬性可以指定 man 命令查找的文檔地址:

"man": [
 "./man/npm-access.1",
 "./man/npm-audit.1"
]

man 字段可以指定一個或多個文件, 當執行man {包名}時, 會展現給用戶文檔內容。

需要注意:

  • man文件必須以數字結尾,如果經過壓縮,還可以使用.gz后綴。這個數字表示文件安裝到哪個 man 節中。
  • 如果 man 文件名稱不是以模塊名稱開頭的,安裝的時候會加上模塊名稱前綴。

對于上面的配置,可以使用以下命令來執行查看文檔:

man npm-access
man npm-audit

7、directories

directories字段用來規范項目的目錄。node.js 模塊是基于 CommonJS 模塊化規范實現的,需要嚴格遵循 CommonJS 規范。模塊目錄下除了必須包含包項目描述文件 package.json 以外,還需要包含以下目錄:

  • bin :存放可執行二進制文件的目錄
  • lib :存放js代碼的目錄
  • doc :存放文檔的目錄
  • test :存放單元測試用例代碼的目錄
  • ...

在實際的項目目錄中,我們可能沒有按照這個規范進行命名,那么就可以在directories字段指定每個目錄對應的文件路徑:

"directories": {
    "bin": "./bin",
    "lib": "./lib",
    "doc": "./doc",
    "test" "./test",
    "man": "./man"
},

這個屬性實際上沒有什么實際的作用,當然不排除未來會有什么比較有意義的用處。

六、發布配置

下面來看看和npm項目包發布相關的配置。

1、private

private字段可以防止我們意外地將私有庫發布到npm服務器。只需要將該字段設置為true:

"private": true

2、preferGlobal

preferGlobal字段表示當用戶不把該模塊安裝為全局模塊時,如果設置為true就會顯示警告。它并不會真正的防止用戶進行局部的安裝,只是對用戶進行提示,防止產生誤解:

"preferGlobal": true

3、publishConfig

publishConfig配置會在模塊發布時生效,用于設置發布時一些配置項的集合。如果不想模塊被默認標記為最新,或者不想發布到公共倉庫,可以在這里配置tag或倉庫地址。更詳細的配置可以參考 npm-config。

通常情況下,publishConfig會配合private來使用,如果只想讓模塊發布到特定npm倉庫,就可以這樣來配置:

"private": true,
"publishConfig": {
  "tag": "1.1.0",
  "registry": "https://registry.npmjs.org/",
  "access": "public"
}

4、os

os字段可以讓我們設置該npm包可以在什么操作系統使用,不能再什么操作系統使用。如果我們希望開發的npm包只運行在linux,為了避免出現不必要的異常,建議使用Windows系統的用戶不要安裝它,這時就可以使用os配置:

"os" ["linux"]   // 適用的操作系統
"os" ["!win32"]  // 禁用的操作系統

5、cpu

該配置和OS配置類似,用CPU可以更準確的限制用戶的安裝環境:

"cpu" ["x64", "AMD64"]   // 適用的cpu
"cpu" ["!arm", "!mips"]  // 禁用的cpu

可以看到,黑名單和白名單的區別就是,黑名單在前面加了一個“!”。

6、license

license 字段用于指定軟件的開源協議,開源協議表述了其他人獲得代碼后擁有的權利,可以對代碼進行何種操作,何種操作又是被禁止的。常見的協議如下:

  • MIT :只要用戶在項目副本中包含了版權聲明和許可聲明,他們就可以拿你的代碼做任何想做的事情,你也無需承擔任何責任。
  • Apache :類似于 MIT ,同時還包含了貢獻者向用戶提供專利授權相關的條款。
  • GPL :修改項目代碼的用戶再次分發源碼或二進制代碼時,必須公布他的相關修改。

可以這樣來聲明該字段:

"license": "MIT"

七、第三方配置

package.json 文件還可以承載命令特有的配置,例如 Babel、ESLint 等。它們每個都有特有的屬性,例如 eslintConfig、babel 等。它們是命令特有的,可以在相應的命令/項目文檔中找到如何使用它們。下面來看幾個常用的第三方配置項。

1、typings

typings字段用來指定TypeScript的入口文件:

"typings": "types/index.d.ts",

該字段的作用和main配置相同。

2、eslintConfig

eslint的配置可以寫在單獨的配置文件.eslintrc.json 中,也可以寫在package.json文件的eslintConfig配置項中。

"eslintConfig": {
      "root": true,
      "env": {
        "node": true
      },
      "extends": [
        "plugin:vue/essential",
        "eslint:recommended"
      ],
      "rules": {},
      "parserOptions": {
        "parser": "babel-eslint"
     },
}

3、babel

babel用來指定Babel的編譯配置,代碼如下:

"babel": {
 "presets": ["@babel/preset-env"],
 "plugins": [...]
}

4、unpkg

使用該字段可以讓 npm 上所有的文件都開啟 cdn 服務,該CND服務由unpkg提供:

"unpkg": "dist/vue.js"

5、lint-staged

lint-staged是一個在Git暫存文件上運行linters的工具,配置后每次修改一個文件即可給所有文件執行一次lint檢查,通常配合gitHooks一起使用。

"lint-staged": {
 "*.js": [
   "eslint --fix",
    "git add"
  ]
}

使用lint-staged時,每次提交代碼只會檢查當前改動的文件。

6、gitHooks

gitHooks用來定義一個鉤子,在提交(commit)之前執行ESlint檢查。在執行lint命令后,會自動修復暫存區的文件。修復之后的文件并不會存儲在暫存區,所以需要用git add命令將修復后的文件重新加入暫存區。在執行pre-commit命令之后,如果沒有錯誤,就會執行git commit命令:

"gitHooks": {
 "pre-commit": "lint-staged"
}

這里就是配合上面的lint-staged來進行代碼的檢查操作。

7、browserslist

browserslist字段用來告知支持哪些瀏覽器及版本。Babel、Autoprefixer 和其他工具會用到它,以將所需的 polyfill 和 fallback 添加到目標瀏覽器。比如最上面的例子中的該字段值:

"browserslist": {
  "production": [
    ">0.2%",
    "not dead",
    "not op_mini all"
  ],
  "development": [
    "last 1 chrome version",
    "last 1 firefox version",
    "last 1 safari version"
  ]
}

這里指定了一個對象,里面定義了生產環境和開發環境的瀏覽器要求。上面的development就是指定開發環境中支持最后一個版本的chrome、Firefox、safari瀏覽器。這個屬性是不同的前端工具之間共用目標瀏覽器和 node 版本的配置工具,被很多前端工具使用,比如Babel、Autoprefixer等。

責任編輯:姜華 來源: 前端充電寶
相關推薦

2022-09-30 15:35:47

json 文件前端開源

2018-08-03 09:23:22

2020-09-21 12:12:23

ICT

2011-12-09 09:31:58

桌面虛擬化

2020-03-23 09:31:51

JavaScript函數技術

2021-06-10 09:34:24

前端開發工具開發

2013-07-17 09:19:23

2024-02-02 08:50:20

Node.js元數據自動化

2010-03-12 16:15:06

Python調試

2022-10-08 08:38:32

物聯網

2018-03-22 09:06:56

數據中心冷卻系統

2019-11-19 12:40:36

AI人工智能開源工具

2021-11-26 05:14:44

開源數據庫安全漏洞

2021-03-05 10:59:01

人工智能AI深度學習

2025-10-14 08:00:00

2021-08-13 10:33:55

IT經理首席信息官CIO

2019-11-18 11:07:13

人工智能技術Apache

2020-02-05 13:03:55

數據中心混合云技術

2023-06-09 19:03:35

開源組織

2017-04-14 10:40:43

SDS系統選擇
點贊
收藏

51CTO技術棧公眾號

黑人与亚洲人色ⅹvideos| 亚欧精品视频一区二区三区| 色的视频在线免费看| 久久99这里只有精品| 久久激情五月丁香伊人| 不卡的一区二区| 东京一区二区| 中文字幕综合网| 精品视频一区二区| 亚洲天堂网在线观看视频| 欧美激情五月| 日韩精品在线观| 日韩精品aaa| 伊人久久国产| 一区二区三区在线观看视频| 欧美一级二级三级九九九| 国产永久免费视频| 久久三级视频| 欧美国产第二页| 最新黄色av网址| 香蕉久久精品| 日韩精品中文字幕一区| 色综合天天色综合| 久久青草伊人| 亚洲在线成人精品| 一区二区三区四区国产| 亚洲色大成网站www| 精品亚洲成a人| 国产精品久久久久77777| 欧美做爰爽爽爽爽爽爽| 日韩精品一区二区三区免费观看| 亚洲国产精品久久久久秋霞不卡| 欧美午夜精品理论片| 欧美aaa视频| 欧美日韩国产精品一区| 国产一二三四区在线观看| 成a人片在线观看www视频| 99视频有精品| 波多野结衣精品久久| 中文字幕日韩国产| 久久久青草婷婷精品综合日韩 | 欧美人xxx| 久久色中文字幕| 精品国产中文字幕| 熟妇人妻系列aⅴ无码专区友真希| 国产精品白丝jk白祙喷水网站| 国产精品一区二区三| 波多野结衣av无码| 日韩中文字幕亚洲一区二区va在线| 国模精品视频一区二区三区| 国产真人真事毛片| 在线国产精品一区| 久久久久久亚洲精品不卡| 久久精品视频免费在线观看| 综合精品一区| 欧美黄网免费在线观看| 91杏吧porn蝌蚪| 一区二区三区中文| 久久99热精品| 国产污片在线观看| 一本色道精品久久一区二区三区 | 成人黄色一级视频| 国产精品二区二区三区| 日本久久一级片| 97精品电影院| 欧美一级爱爱| 老司机免费在线视频| 日韩理论片网站| 国产高清不卡无码视频| 黄页网站在线| 精品国产91乱高清在线观看 | 欧美香蕉视频| 欧美性欧美巨大黑白大战| 污版视频在线观看| 欧美成人精品一级| 亚洲成人精品av| 91精品人妻一区二区| 日韩欧美视频专区| 欧美精品在线视频观看| 人人干人人干人人干| 日韩国产精品久久久| 成人福利视频网| 免费观看黄色av| 国产无遮挡一区二区三区毛片日本| 一区不卡视频| 国产粉嫩在线观看| 欧美视频在线播放| 91成人在线观看喷潮蘑菇| 香蕉一区二区| 精品国偷自产在线视频| 国产无精乱码一区二区三区| 手机精品视频在线观看| 在线观看中文| 日本美女一区二区三区| 成人精品一区二区三区电影黑人| 午夜精品一二三区| 久久综合久久99| 国产人妻互换一区二区| 日本在线影院| 777亚洲妇女| 熟妇高潮精品一区二区三区| 久久综合成人| 欧美激情亚洲激情| 在线免费观看一区二区| 成人亚洲精品久久久久软件| 日韩欧美手机在线| 欧美xxxx性xxxxx高清| 在线一区二区三区做爰视频网站| ass极品水嫩小美女ass| 欧美男gay| 久久免费少妇高潮久久精品99| 不卡av电影在线| 国产精品影视在线| 日本一区二区久久精品| 日本中文字幕中出在线| 欧美三级资源在线| 西西大胆午夜视频| 欧美国产免费| 国产日韩欧美中文| 黄色在线播放| 亚洲h精品动漫在线观看| 一区二区久久精品| 精品久久久亚洲| 91国语精品自产拍在线观看性色| 国产成人免费看一级大黄| 国产精品热久久久久夜色精品三区 | 97视频在线观看成人| 国产视频在线观看免费| 国产精品天美传媒沈樵| 日本黄网站免费| 9l亚洲国产成人精品一区二三 | 毛片一区二区三区| 欧美国产综合视频| 忘忧草在线日韩www影院| 日韩精品中文字幕在线不卡尤物| 国产极品美女在线| 久久激情五月激情| 亚洲电影免费| 99久久伊人| 亚洲日本成人网| 国产精品18p| 北条麻妃国产九九精品视频| 真人做人试看60分钟免费| 91精品国产色综合久久不卡粉嫩| 日韩在线观看免费网站| 在线观看免费黄色小视频| 国产欧美日韩卡一| 国产又黄又猛又粗| 99re66热这里只有精品8| 国产乱肥老妇国产一区二| jizz视频在线观看| 欧美日韩一卡二卡三卡 | 国产精品丝袜一区二区三区| 国产黄在线看| 精品视频123区在线观看| 亚洲黄色网址大全| 久久精品99国产精品| 中文字幕一区二区三区乱码 | 欧美精品一区二区久久婷婷| 国产一级在线视频| 91在线视频免费91| 欧美丰满熟妇xxxxx| 久久国产亚洲| 91精品国产综合久久久久久丝袜| 91三级在线| 亚洲第一av网站| 亚洲黄色激情视频| 亚洲国产激情av| 91小视频在线播放| 国产精品vip| 久久久久久九九| 成人国产精品| 欧美成人小视频| 天天干天天爱天天操| 色哟哟在线观看一区二区三区| 女人黄色一级片| 国产乱人伦偷精品视频不卡 | 亚洲永久av| 日韩中文字幕在线| 好吊视频一区二区三区| 色视频成人在线观看免| 91香蕉一区二区三区在线观看| 国产成人精品1024| 国产裸体舞一区二区三区| 久久精品国产www456c0m| yy111111少妇影院日韩夜片| 黄色成人免费网| 美女视频久久黄| 蜜桃视频在线播放| 这里只有精品免费| 日本在线播放视频| 亚洲日本护士毛茸茸| 艳妇乳肉亭妇荡乳av| 蜜桃视频免费观看一区| 九色自拍视频在线观看| 欧美精选视频在线观看| 国产精品yjizz| 男人亚洲天堂| 欧美伊久线香蕉线新在线| 欧美一区二区三区| 亚洲精品一区久久久久久| 一级二级三级视频| 欧美午夜激情在线| 日韩在线观看视频一区二区| 久久综合九色综合97_久久久| 青青草久久伊人| 久久九九免费| 国产96在线 | 亚洲| 小处雏高清一区二区三区| 久久偷看各类wc女厕嘘嘘偷窃 | 日韩一级二级三级| 黄色网址中文字幕| 精品久久香蕉国产线看观看gif| 我要看一级黄色录像| 久久久久国产精品厨房| 国产a级片视频| 老司机精品视频一区二区三区| 黄色免费福利视频| 激情久久婷婷| 97精品国产97久久久久久粉红| 精品国产乱码久久久久久果冻传媒 | 国产91精品久久久| 成人影音在线| 欧美久久久精品| 黄网页在线观看| 最近2019年中文视频免费在线观看 | 国产精品69页| 免费看av成人| 好吊色欧美一区二区三区四区 | 免费影院在线观看一区| 成人搞黄视频| 一区二区三区欧美在线观看| 91麻豆精品91久久久久久清纯| 中文字幕久久久av一区| 日韩av色在线| 水蜜桃一区二区| 精品国产乱码久久久久夜深人妻| 依依成人综合网| 成人性生交大片免费看在线播放| 天天射成人网| 国产日韩av一区二区| 日韩电影免费观看中文字幕| 精品国产欧美一区二区三区成人 | 成人高清电影网站| 91欧美激情另类亚洲| 国内自拍亚洲| 国产欧美一区二区三区久久人妖| 欧美暴力调教| 国产精品私拍pans大尺度在线| 国产精品诱惑| 成人av.网址在线网站| 91精品网站在线观看| 91久久久国产精品| 欧美第一在线视频| 国产精品区一区二区三在线播放| 国产区精品视频在线观看豆花| 国产欧美日韩视频一区二区三区| 国产厕拍一区| 麻豆久久久av免费| 精品国产精品久久一区免费式| 亚洲免费久久| 午夜久久久久| 阿v天堂2018| 亚洲一区观看| 亚洲欧美另类动漫| 国产美女av一区二区三区| 国产裸体视频网站| 99精品视频在线免费观看| 色欲av无码一区二区三区| 中文字幕精品综合| 午夜精品一区二区三区视频| 亚洲高清在线精品| 久久久精品毛片| 在线视频欧美区| 国产偷人妻精品一区二区在线| 日韩精品中文字幕在线不卡尤物| 亚洲人妻一区二区三区| 中文字幕日韩精品在线观看| av片在线观看网站| 97在线日本国产| 久久女人天堂| 国产精品xxxx| 人人狠狠综合久久亚洲婷婷| 成人国产一区二区三区| 免费在线欧美黄色| 天天综合成人网| 91丝袜呻吟高潮美腿白嫩在线观看| 欧美熟妇激情一区二区三区| 亚洲精品成a人| 亚洲影院在线播放| 日韩一区二区三区av| 日韩在线免费播放| 美女扒开尿口让男人操亚洲视频网站| 美女露胸视频在线观看| 国产精品永久免费观看| 国产无遮挡裸体免费久久| 先锋影音一区二区三区| 亚洲国产精品一区| 日韩欧美国产片| 97国产精品videossex| 蜜桃视频最新网址| 黑人精品xxx一区| 国产黄色一区二区| 国产亚洲精品美女| www555久久| 国产精品免费在线免费| 极品国产人妖chinesets亚洲人妖 激情亚洲另类图片区小说区 | 亚洲va国产va欧美va观看| 日本学生初尝黑人巨免费视频| 欧美日韩情趣电影| 日本私人网站在线观看| 欧美成人精品一区二区三区| 国产一区二区三区朝在线观看| 成人av免费看| 91精品精品| 第四色婷婷基地| 久久精品一区二区三区不卡牛牛| 久久免费精彩视频| 91精品国产欧美一区二区 | 久久99久久亚洲国产| 先锋影音一区二区| 五月天国产一区| 老司机亚洲精品| 中文人妻一区二区三区| 亚洲福利电影网| 高清乱码毛片入口| 久久精品欧美视频| 日日夜夜一区| 五月天国产一区| 日韩精品亚洲一区| 老牛影视av老牛影视av| 岛国av一区二区三区| 天天操天天射天天| 欧美精品电影免费在线观看| 日本一区影院| 日本黄xxxxxxxxx100| 国产一区高清在线| 神马午夜精品91| 6080亚洲精品一区二区| 人人干在线视频| 91精品视频在线免费观看| 欧美成人激情| 天天影视色综合| 亚洲人成在线观看一区二区| 91av久久久| 久久久av一区| 欧美影院在线| 日本一区午夜艳熟免费| 成人免费三级在线| 日韩字幕在线观看| 日韩精品免费在线视频观看| 国产一二在线播放| 精品国产乱码久久久久久108| 亚洲国产精品第一区二区| 亚洲最大免费视频| 91精品办公室少妇高潮对白| 精品三级久久久久久久电影聊斋| 国产精品黄色影片导航在线观看| 欧美一站二站| 中文字幕线观看| 一区二区三区.www| 天堂网www中文在线| 国产精品wwww| 天天做天天爱综合| 男人添女人荫蒂国产| 天天操天天综合网| 搞黄视频免费在线观看| 91免费福利视频| 亚洲激情女人| 人人人妻人人澡人人爽欧美一区| 欧美日韩黄色一区二区| 四虎亚洲精品| 欧美日韩电影一区二区| 麻豆91精品91久久久的内涵| 久久久久久久久毛片| 日韩电影视频免费| 日韩成人精品一区二区三区| 国产激情在线看| 95精品视频在线| ,亚洲人成毛片在线播放| 韩国精品美女www爽爽爽视频| 九九亚洲精品| 国产在线视频三区| 色综合亚洲欧洲| 国产激情在线| 麻豆成人av| 国产精品自在欧美一区| 800av免费在线观看| 日韩在线视频国产| 久久综合社区| 中文字幕视频三区| 激情av一区二区| 国产精品扒开做爽爽爽的视频| 久久国产欧美精品| 国产一区二区三区四区五区入口 | 欧美精品久久99久久在免费线| 电影k8一区二区三区久久| 五月婷婷一区| 97精品电影院| 性生活黄色大片|