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

一文帶你快速上手Rollup

開發 前端
本文大致向大家介紹了什么是rollup以及如何快速上手rollup。

 前言

項目中一直用的都是webpack,前一段需要開發幾個類庫供其他平臺使用,本來打算繼續用webpack的,但感覺webpack用來開發js庫,不僅繁瑣而且打包后的文件體積也比較大。正好之前看vue源碼,知道vue也是通過rollup打包的。這次又是開發類庫的,于是就快速上手了rollup。

本篇文章是我有了一定的項目實踐后,回過來給大家分享一下如何從零快速上手rollup。

什么是rollup?

系統的了解rollup之前,我們先來簡單了解下What is rollup?

關于rollup的介紹,官方文檔已經寫的很清楚了:

Rollup 是一個 JavaScript 模塊打包器,可以將小塊代碼編譯成大塊復雜的代碼,例如 library 或應用程序。

與Webpack偏向于應用打包的定位不同,rollup.js更專注于Javascript類庫打包。

我們熟知的Vue、React等諸多知名框架或類庫都是通過rollup.js進行打包的。

為什么是rollup?

webpack我相信做前端的同學大家都用過,那么為什么有些場景還要使用rollup呢?這里我簡單對webpack和rollup做一個比較:

總體來說webpack和rollup在不同場景下,都能發揮自身優勢作用。webpack對于代碼分割和靜態資源導入有著“先天優勢”,并且支持熱模塊替換(HMR),而rollup并不支持。

所以當開發應用時可以優先選擇webpack,但是rollup對于代碼的Tree-shaking和ES6模塊有著算法優勢上的支持,若你項目只需要打包出一個簡單的bundle包,并是基于ES6模塊開發的,可以考慮使用rollup。

其實webpack從2.0開始就已經支持Tree-shaking,并在使用babel-loader的情況下還可以支持es6 module的打包。實際上,rollup已經在漸漸地失去了當初的優勢了。但是它并沒有被拋棄,反而因其簡單的API、使用方式被許多庫開發者青睞,如React、Vue等,都是使用rollup作為構建工具的。

快速上手

我們先花大概十分鐘左右的時間來了解下rollup的基本使用以及完成一個hello world。

安裝

首先全局安裝rollup:

  1. npm i rollup -g 

目錄準備(hello world)

接著,我們初始化一個如下所示的項目目錄 

  1. ├── dist # 編譯結果  
  2. ├── example # HTML引用例子  
  3. │   └── index.html  
  4. ├── package.json  
  5. └── src # 源碼  
  6.     └── index.js 

首先我們在src/index.js中寫入如下代碼:

  1. console.log("柯森"); 

然后在命令行執行以下命令: 

  1. rollup src/index.js -f umd -o dist/bundle.js 

執行命令,我們即可在dist目錄下生成bundle.js文件: 

  1. (function (factory) {  
  2.  typeof define === 'function' && define.amd ? define(factory) :  
  3.  factory();  
  4. }((function () { 'use strict';  
  5.  console.log("柯森");  
  6. }))); 

這時,我們再在example/index.html中引入上面打包生成的bundle.js文件,打開瀏覽器:如我們所預料的,控制臺輸出了柯森。

到這里,我們就用rollup打包了一個最最簡單的demo。

可能很多同學看到這里對于上面命令行中的參數不是很明白,我依次說明下:

  •  -f。-f參數是--format的縮寫,它表示生成代碼的格式,amd表示采用AMD標準,cjs為CommonJS標準,esm(或 es)為ES模塊標準。-f的值可以為amd、cjs、system、esm('es’也可以)、iife或umd中的任何一個。
  •  -o。-o指定了輸出的路徑,這里我們將打包后的文件輸出到dist目錄下的bundle.js

其實除了這兩個,還有很多其他常用的命令(這里我暫且列舉剩下兩個也比較常用的,完整的rollup 命令行參數):

  •  -c。指定rollup的配置文件。
  •  -w。監聽源文件是否有改動,如果有改動,重新打包。

使用配置文件(rollup.config.js)

使用命令行的方式,如果選項少沒什么問題,但是如果添加更多的選項,這種命令行的方式就顯得麻煩了。

為此,我們可以創建配置文件來囊括所需的選項

在項目中創建一個名為rollup.config.js的文件,增加如下代碼: 

  1. export default {  
  2.   input: ["./src/index.js"],  
  3.   output: {  
  4.     file: "./dist/bundle.js",  
  5.     format: "umd",  
  6.     name: "experience",  
  7.   },  
  8. }; 

然后命令行執行: 

  1. rollup -c 

打開dist/bundle.js文件,我們會發現和上面采用命令行的方式打包出來的結果是一樣的。

這里,我對配置文件的選項做下簡單的說明:

  •  input表示入口文件的路徑(老版本為 entry,已經廢棄)
  •  output表示輸出文件的內容,它允許傳入一個對象或一個數組,當為數組時,依次輸出多個文件,它包含以下內容:
    •  output.file:輸出文件的路徑(老版本為 dest,已經廢棄)
    •  output.format:輸出文件的格式
    •  output.banner:文件頭部添加的內容
    •  output.footer:文件末尾添加的內容

到這里,相信你已經差不多上手rollup了。

進階

但是,這對于真實的業務場景是遠遠不夠的。

下面,我將介紹rollup中的幾種常用的插件以及external屬性、tree-shaking機制。

resolve插件

為什么要使用resolve插件

在上面的入門案例中,我們打包的對象是本地的js代碼和庫,但實際開發中,不太可能所有的庫都位于本地,我們大多會通過npm下載遠程的庫。

與webpack和browserify這樣的其他捆綁包不同,rollup不知道如何打破常規去處理這些依賴。因此我們需要添加一些配置。

resolve插件使用

首先在我們的項目中添加一個依賴the-answer,然后修改src/index.js文件: 

  1. import answer from "the-answer";  
  2. export default function () {  
  3.   console.log("the answer is " + answer);  

執行npm run build。

這里為了方便,我將原本的rollup -c -w添加到了package.json的scripts中:"build": "rollup -c -w"

會得到以下報錯:

打包后的bundle.js仍然會在Node.js中工作,但是the-answer不包含在包中。為了解決這個問題,將我們編寫的源碼與依賴的第三方庫進行合并,rollup.js為我們提供了resolve插件。

首先,安裝resolve插件: 

  1. npm i -D @rollup/plugin-node-resolve 

修改配置文件rollup.config.js: 

  1. import resolve from "@rollup/plugin-node-resolve";  
  2. export default {  
  3.   input: ["./src/index.js"],  
  4.   output: {  
  5.     file: "./dist/bundle.js",  
  6.     format: "umd",  
  7.     name: "experience",  
  8.   },  
  9.   plugins: [resolve()], 
  10.  }; 

這時再次執行npm run build,可以發現報錯已經沒有了:

打開dist/bundle.js文件: 

  1. (function (global, factory) {  
  2.   typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :  
  3.   typeof define === 'function' && define.amd ? define(factory) :  
  4.   (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.experience = factory());  
  5. }(this, (function () { 'use strict';  
  6.   var index = 42 
  7.   function index$1 () {  
  8.     console.log("the answer is " + index);  
  9.   }  
  10.   return index$1;  
  11. }))); 

打包文件bundle.js中已經包含了引用的模塊。

有些場景下,雖然我們使用了resolve插件,但可能我們仍然想要某些庫保持外部引用狀態,這時我們就需要使用external屬性,來告訴rollup.js哪些是外部的類庫。

external 屬性

修改rollup.js的配置文件: 

  1. import resolve from "@rollup/plugin-node-resolve";  
  2. export default {  
  3.   input: ["./src/index.js"],  
  4.   output: {  
  5.     file: "./dist/bundle.js",  
  6.     format: "umd",  
  7.     name: "experience",  
  8.   },  
  9.   plugins: [resolve()],  
  10.   external: ["the-answer"],  
  11. }; 

重新打包,打開dist/bundle.js文件: 

  1. (function (global, factory) {  
  2.   typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('the-answer')) :  
  3.   typeof define === 'function' && define.amd ? define(['the-answer'], factory) :  
  4.   (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.experience = factory(global.answer));  
  5. }(this, (function (answer) { 'use strict';  
  6.   function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }  
  7.   var answer__default = /*#__PURE__*/_interopDefaultLegacy(answer);  
  8.   function index () {  
  9.     console.log("the answer is " + answer__default['default']);  
  10.   }  
  11.   return index;  
  12. }))); 

這時我們看到the-answer已經是做為外部庫被引入了。

commonjs插件

為什么需要commonjs插件

rollup.js編譯源碼中的模塊引用默認只支持 ES6+的模塊方式import/export。然而大量的npm模塊是基于CommonJS模塊方式,這就導致了大量 npm模塊不能直接編譯使用。

因此使得rollup.js編譯支持npm模塊和CommonJS模塊方式的插件就應運而生:@rollup/plugin-commonjs。

commonjs插件使用

首先,安裝該模塊: 

  1. npm i -D @rollup/plugin-commonjs 

然后修改rollup.config.js文件: 

  1. import resolve from "@rollup/plugin-node-resolve";  
  2. import commonjs from "@rollup/plugin-commonjs";  
  3. export default {  
  4.   input: ["./src/index.js"],  
  5.   output: {  
  6.     file: "./dist/bundle.js",  
  7.     format: "umd",  
  8.     name: "experience",  
  9.   },  
  10.   plugins: [resolve(), commonjs()],  
  11.   external: ["the-answer"],  
  12. }; 

babel插件

為什么需要babel插件?

我們在src目錄下添加es6.js文件(⚠️ 這里我們使用了 es6 中的箭頭函數): 

  1. const a = 1 
  2. const b = 2 
  3. console.log(a, b);  
  4. export default () => {  
  5.   return a + b;  
  6. }; 

然后修改rollup.config.js配置文件: 

  1. import resolve from "@rollup/plugin-node-resolve";  
  2. import commonjs from "@rollup/plugin-commonjs";  
  3. export default {  
  4.   input: ["./src/es6.js"],  
  5.   output: {  
  6.     file: "./dist/esBundle.js",  
  7.     format: "umd",  
  8.     name: "experience",  
  9.   },  
  10.   plugins: [resolve(), commonjs()],  
  11.   external: ["the-answer"],  
  12. }; 

執行打包,可以看到dist/esBundle.js文件內容如下: 

  1. (function (global, factory) {  
  2.   typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :  
  3.   typeof define === 'function' && define.amd ? define(factory) :  
  4.   (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.experience = factory());  
  5. }(this, (function () { 'use strict';  
  6.   const a = 1 
  7.   const b = 2 
  8.   console.log(a, b);  
  9.   var es6 = () => {  
  10.     return a + b;  
  11.   };  
  12.   return es6;  
  13. }))); 

可以看到箭頭函數被保留下來,這樣的代碼在不支持ES6的環境下將無法運行。我們期望在rollup.js打包的過程中就能使用babel完成代碼轉換,因此我們需要babel插件。

babel插件的使用

首先,安裝: 

  1. npm i -D @rollup/plugin-babel 

同樣修改配置文件rollup.config.js: 

  1. import resolve from "@rollup/plugin-node-resolve";  
  2. import commonjs from "@rollup/plugin-commonjs";  
  3. import babel from "@rollup/plugin-babel";  
  4. export default {  
  5.   input: ["./src/es6.js"],  
  6.   output: {  
  7.     file: "./dist/esBundle.js",  
  8.     format: "umd",  
  9.     name: "experience",  
  10.   },  
  11.   plugins: [resolve(), commonjs(), babel()],  
  12.   external: ["the-answer"], 
  13. }; 

然后打包,發現會出現報錯:

提示我們缺少@babel/core,因為@babel/core是babel的核心。我們來進行安裝: 

  1. npm i @babel/core 

再次執行打包,發現這次沒有報錯了,但是我們嘗試打開dist/esBundle.js: 

  1. (function (global, factory) {  
  2.   typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :  
  3.   typeof define === 'function' && define.amd ? define(factory) :  
  4.   (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.experience = factory());  
  5. }(this, (function () { 'use strict';  
  6.   const a = 1 
  7.   const b = 2 
  8.   console.log(a, b);  
  9.   var es6 = (() => {  
  10.     return a + b;  
  11.   });  
  12.   return es6;  
  13. }))); 

可以發現箭頭函數仍然存在,顯然這是不正確的,說明我們的babel插件沒有起到作用。這是為什么呢?

原因是由于我們缺少.babelrc文件,添加該文件: 

  1.  
  2.   "presets": [  
  3.     [  
  4.       "@babel/preset-env",  
  5.       {  
  6.         "modules": false,  
  7.         // "useBuiltIns": "usage"  
  8.       }  
  9.     ]  
  10.   ]  

我們看.babelrc配置了preset env,所以先安裝這個插件: 

  1. npm i @babel/preset-env 

這次再次執行打包,我們打開dist/esBundle.js文件: 

  1. (function (global, factory) {  
  2.   typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :  
  3.   typeof define === 'function' && define.amd ? define(factory) :  
  4.   (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.experience = factory());  
  5. }(this, (function () { 'use strict';  
  6.   var a = 1 
  7.   var b = 2 
  8.   console.log(a, b);  
  9.   var es6 = (function () {  
  10.     return a + b;  
  11.   });  
  12.   return es6;  
  13. }))); 

可以看到箭頭函數被轉換為了function,說明babel插件正常工作。

json插件

為什么要使用json插件?

在src目錄下創建json.js文件: 

  1. import json from "../package.json";  
  2. console.log(json.author); 

內容很簡單,就是引入package.json,然后去打印author字段。

修改rollup.config.js配置文件: 

  1. import resolve from "@rollup/plugin-node-resolve";  
  2. import commonjs from "@rollup/plugin-commonjs";  
  3. import babel from "@rollup/plugin-babel";  
  4. export default {  
  5.   input: ["./src/json.js"],  
  6.   output: {  
  7.     file: "./dist/jsonBundle.js",  
  8.     format: "umd",  
  9.     name: "experience",  
  10.   },  
  11.   plugins: [resolve(), commonjs(), babel()],  
  12.   external: ["the-answer"],  
  13. }; 

執行打包,發現會發生如下報錯:

提示我們缺少@rollup/plugin-json插件來支持json文件。

json插件的使用

來安裝該插件: 

  1. npm i -D @rollup/plugin-json 

同樣修改下配置文件,將插件加入plugins數組即可。

然后再次打包,發現打包成功了,我們打開生成的dist/jsonBundle目錄: 

  1. (function (factory) {  
  2.   typeof define === 'function' && define.amd ? define(factory) :  
  3.   factory();  
  4. }((function () { 'use strict';  
  5.   var name = "rollup-experience" 
  6.   var version = "1.0.0" 
  7.   var description = "" 
  8.   var main = "index.js" 
  9.   var directories = {  
  10.    example: "example"  
  11.   };  
  12.   var scripts = {  
  13.    build: "rollup -c -w",  
  14.    test: "echo \"Error: no test specified\" && exit 1"  
  15.   };  
  16.   var author = "Cosen" 
  17.   var license = "ISC" 
  18.   var dependencies = {  
  19.    "@babel/core": "^7.11.6",  
  20.    "@babel/preset-env": "^7.11.5",  
  21.    "the-answer": "^1.0.0"  
  22.   };  
  23.   var devDependencies = {  
  24.    "@rollup/plugin-babel": "^5.2.0",  
  25.    "@rollup/plugin-commonjs": "^15.0.0",  
  26.    "@rollup/plugin-json": "^4.1.0",  
  27.    "@rollup/plugin-node-resolve": "^9.0.0"  
  28.   };  
  29.   var json = {  
  30.    name: name,  
  31.    version: version, 
  32.    description: description,  
  33.    main: main,  
  34.    directories: directories,  
  35.    scripts: scripts,  
  36.    author: author,  
  37.    license: license,  
  38.    dependencies: dependencies,  
  39.    devDependencies: devDependencies  
  40.   };   
  41.   console.log(json.author);  
  42. }))); 

完美!!

tree-shaking機制

這里我們以最開始的src/index.js為例進行說明: 

  1. import answer from "the-answer";  
  2. export default function () {  
  3.   console.log("the answer is " + answer);  

修改上述文件: 

  1. const a = 1 
  2. const b = 2 
  3. export default function () {  
  4.   console.log(a + b);  

執行打包。打開dist/bundle.js文件: 

  1. (function (global, factory) {  
  2.   typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :  
  3.   typeof define === 'function' && define.amd ? define(factory) :  
  4.   (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.experience = factory());  
  5. }(this, (function () { 'use strict';  
  6.   var a = 1 
  7.   var b = 2 
  8.   function index () {  
  9.     console.log(a + b);  
  10.   }  
  11.   return index;  
  12. }))); 

再次修改src/index.js文件: 

  1. const a = 1 
  2. const b = 2 
  3. export default function () {  
  4.   console.log(a);  

再次執行打包,打開打包文件: 

  1. (function (global, factory) {  
  2.   typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :  
  3.   typeof define === 'function' && define.amd ? define(factory) :  
  4.   (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.experience = factory());  
  5. }(this, (function () { 'use strict';  
  6.   var a = 1 
  7.   function index () {  
  8.     console.log(a);  
  9.   }  
  10.   return index;  
  11. }))); 

發現了什么?

我們發現關于變量b的定義沒有了,因為源碼中并沒有用到這個變量。這就是ES模塊著名的tree-shaking機制,它動態地清除沒有被使用過的代碼,使得代碼更加精簡,從而可以使得我們的類庫獲得更快的加載速度。

總結

本文大致向大家介紹了什么是rollup以及如何快速上手rollup。文中提到的這些其實只是冰山一角,rollup能玩的東西還有很多,關于更多可以去rollup 官網查詢 

 

責任編輯:龐桂玉 來源: 前端大全
相關推薦

2024-11-08 08:37:25

2022-08-30 22:12:19

Nacos組件服務注冊

2023-11-20 08:18:49

Netty服務器

2022-12-20 07:39:46

2023-12-21 17:11:21

Containerd管理工具命令行

2023-07-31 08:18:50

Docker參數容器

2021-05-29 10:11:00

Kafa數據業務

2023-11-06 08:16:19

APM系統運維

2022-11-11 19:09:13

架構

2021-02-02 09:10:12

Go語言二進制

2022-02-24 07:56:42

開發Viteesbuild

2025-01-17 07:00:00

2023-10-27 08:15:45

2023-11-08 08:15:48

服務監控Zipkin

2022-02-24 07:34:10

SSL協議加密

2022-04-08 09:01:14

CSS自定義屬性前端

2023-03-06 21:29:41

mmap技術操作系統

2022-05-16 10:49:28

網絡協議數據

2024-05-22 09:45:49

2019-06-13 21:31:19

AI
點贊
收藏

51CTO技術棧公眾號

日韩影片中文字幕| 同心难改在线观看| 婷婷精品进入| 精品国产乱码久久久久久老虎| 欧美a级免费视频| 亚洲精品无amm毛片| 欧美日韩国产欧| 亚洲九九九在线观看| 日本一极黄色片| 国产婷婷视频在线| 91视频.com| 成人网在线视频| 日韩av女优在线观看| 欧美日韩中文一区二区| 日韩欧美国产一区二区在线播放| 久久美女福利视频| 尤物在线网址| 国产日韩欧美在线一区| 成人看片在线| 性色av一区二区三区四区| 欧美亚韩一区| 亚洲无限av看| 四虎精品一区二区| 成人天堂yy6080亚洲高清| 一区二区三区久久| 日本在线观看一区二区| 亚洲精品久久久蜜桃动漫 | 中文字幕亚洲综合久久| 成熟妇人a片免费看网站| 亚洲欧美综合久久久久久v动漫| 精品美女国产在线| 午夜久久久久久久久久久| 成人在线免费电影| 26uuu亚洲综合色| 国产福利久久| 国产av一区二区三区精品| 日本强好片久久久久久aaa| 97久久精品视频| 欧美性猛交xxxx乱大交少妇| 最近国产精品视频| 亚洲第一视频网| 中文字幕制服丝袜| 美女精品久久| 91精品欧美综合在线观看最新| 精品www久久久久奶水| 国产盗摄——sm在线视频| 国产精品麻豆一区二区| 色大师av一区二区三区| 黄色片在线看| 国产亚洲精品aa午夜观看| 麻豆av福利av久久av| 日韩在线观看视频一区二区三区| 国产91精品露脸国语对白| 国产在线观看精品一区二区三区| 中文字幕91爱爱| 人禽交欧美网站| 国产精品久久久久免费a∨| 国产福利拍拍拍| 精品福利电影| 午夜精品一区二区三区av| 久久老司机精品视频| 好看的av在线不卡观看| 久久久久久午夜| 国产无码精品久久久| 亚洲视频久久| 97视频免费观看| 三级视频在线观看| 日韩激情av在线| 国产精品女主播视频| 在线免费看91| 国产乱码精品1区2区3区| 97中文在线| 天堂中文在线观看视频| www国产成人免费观看视频 深夜成人网| 久久久亚洲综合网站| 欧美精品少妇| 国产精品久久久久久久久免费丝袜| 中文字幕综合在线观看| 一色桃子av在线| 亚洲国产欧美日韩另类综合| 久激情内射婷内射蜜桃| 综合在线影院| 欧美喷水一区二区| 国产精品一级无码| 亚洲电影男人天堂| 色妞久久福利网| www.色小姐com| 在线亚洲欧美| 国产精品成人aaaaa网站| 国产一区二区三区黄片| 成人免费视频视频在线观看免费| 免费av一区二区三区| 91社区在线| 一区二区三区毛片| 欧美日韩在线免费播放| 欧美黄色一级| 亚洲美女又黄又爽在线观看| 神马久久精品综合| 国产一区二区三区久久久久久久久| 国产精品成人av在线| 亚洲欧美另类一区| 国产亚洲欧美日韩在线一区| 69精品丰满人妻无码视频a片| 色戒汤唯在线| 欧美精品乱人伦久久久久久| 欧美大喷水吹潮合集在线观看| 成人影院在线| 97国产精品免费视频| 亚洲精品国产欧美在线观看| 国产成人av电影在线观看| 欧美日韩国产精品一卡| 9191在线播放| 91精品1区2区| 日本精品一二三区| 国产精品不卡| 日韩免费黄色av| 亚洲精品97久久中文字幕无码| 欧美国产日产图区| 水蜜桃色314在线观看| 自拍偷拍亚洲| 国产一区二区三区在线免费观看| 国产精选第一页| 精品午夜一区二区三区在线观看| 欧美精品国产精品久久久 | 97高清免费视频| 国产精品自偷自拍| 国产夜色精品一区二区av| 丝袜人妻一区二区三区| 精品国产三区在线| 日韩中文字幕网站| 国产在线观看第一页| av午夜一区麻豆| 黄色a级片免费看| 国产精品一区三区在线观看| 中文字幕在线视频日韩| 亚洲婷婷综合网| 不卡一区中文字幕| 国产情侣第一页| 中文字幕日韩在线| 久久的精品视频| 中文字幕在线视频第一页| 久久久综合精品| 男人添女人下面高潮视频| 一区二区三区四区高清视频| 久久的精品视频| 国产精品特级毛片一区二区三区| 国产精品三级电影| 亚洲娇小娇小娇小| 欧美顶级大胆免费视频| 国产精品亚洲网站| eeuss影院在线播放| 欧美日韩国产在线播放| 亚洲蜜桃精久久久久久久久久久久 | 日韩片之四级片| 一级片一级片一级片| 精品系列免费在线观看| 国产日本欧美在线| www久久久| 美女av一区二区三区| 99久久久久久久| 一区二区三区四区蜜桃| 动漫av在线免费观看| 亚洲精品国产日韩| 久久99精品久久久久久三级| 国偷自产一区二区免费视频| 亚洲欧美在线一区二区| 波多野结衣视频在线观看| 欧美国产亚洲另类动漫| 国产精品嫩草影院8vv8| 亚洲最新av| 狠狠综合久久av| 毛片无码国产| 久久精品国产亚洲7777| 亚洲精品免费在线观看视频| 亚洲v日本v欧美v久久精品| 久久人人爽人人人人片| 日韩av不卡在线观看| 伊人久久大香线蕉午夜av| 免费欧美网站| 97精品免费视频| 91精品专区| 日韩欧美国产系列| 国产日产精品一区二区三区| 国产清纯白嫩初高生在线观看91 | 国产午夜视频在线播放| 久久久久久久久久看片| 依人在线免费视频| 极品av少妇一区二区| 日韩精品一区二区三区丰满| 伊人久久大香| 91av在线不卡| 久草免费在线观看| 亚洲精品不卡在线| 中文字幕在线播放不卡| 亚洲国产欧美日韩另类综合| 国产毛片欧美毛片久久久| 国产乱人伦偷精品视频不卡| 日本三级免费观看| 久久久久久影院| 国产精品视频在线免费观看| 日韩在线影院| 欧美精品videos| av男人的天堂在线| 日韩精品极品视频免费观看| 91资源在线视频| 黄色成人在线免费| 来吧亚洲综合网| 91免费观看国产| 能看毛片的网站| 日韩1区2区日韩1区2区| 日韩欧美一区三区| 久久久国产精品| 日本一区网站| 欧美aaaaaaaa牛牛影院| 亚洲综合精品伊人久久| 中文字幕av一区二区三区佐山爱| 欧美精品久久久久久久久久| 亚洲搞黄视频| 日韩高清av在线| 国产日韩精品suv| 在线视频你懂得一区二区三区| 精品在线视频观看| 中文字幕一区二区三区视频| 中文字幕丰满乱子伦无码专区| 国产精品一区在线观看你懂的| 男人天堂成人在线| 亚洲欧美清纯在线制服| 国产aaa免费视频| 91精品久久久久久久蜜月 | 天天干天天色天天| 日韩精品专区在线| 国产强被迫伦姧在线观看无码| 91电影在线观看| 天堂中文字幕在线观看| 亚洲成人免费在线观看| 欧美成人三级在线观看| 中文字幕一区二区三区不卡| 国产又粗又硬视频| 国产欧美精品国产国产专区| av网在线播放| 久久网站热最新地址| 女同毛片一区二区三区| 成人激情小说网站| ass极品水嫩小美女ass| 国产又黄又大久久| 激情成人在线观看| 激情深爱一区二区| 日韩av.com| 蜜臀av性久久久久蜜臀aⅴ四虎| 爆乳熟妇一区二区三区霸乳| 久久免费高清| 精品久久久噜噜噜噜久久图片| 日韩成人一级大片| 欧美婷婷精品激情| 麻豆成人久久精品二区三区小说| 一区二区三区 欧美| 美女视频黄久久| 亚洲第一天堂久久| 国产精品亚洲成人| 国产亚洲精品成人a| 福利电影一区二区三区| 少妇被狂c下部羞羞漫画| 成人免费高清在线| 黄色录像a级片| 久久免费午夜影院| 中国1级黄色片| 椎名由奈av一区二区三区| 国产精品久久久精品四季影院| 亚洲精品视频在线观看网站| 久久中文字幕在线观看| 精品国产91久久久| 日本熟妇一区二区三区| 欧美人牲a欧美精品| 亚洲成人久久精品| 日韩精品免费综合视频在线播放| 蜜芽tv福利在线视频| 综合欧美国产视频二区| 中国av在线播放| 久久久亚洲影院你懂的| 成人天堂yy6080亚洲高清| 成人在线中文字幕| 国产精品色在线网站| 日韩少妇中文字幕| 亚洲综合中文| 动漫av网站免费观看| 久久成人麻豆午夜电影| 在线观看免费视频国产| 国产三级精品视频| 欧美成人三级在线观看| 色婷婷久久久亚洲一区二区三区 | 麻豆精品在线观看| 伊人影院在线观看视频| 久久精品亚洲精品国产欧美| 在线看的片片片免费| 亚洲国产一区视频| 超碰在线观看91| 欧美成人a在线| 韩国免费在线视频| 久久久久久伊人| 激情久久一区二区| 激情视频在线观看一区二区三区| 成人看的视频| 国产综合av在线| 国产在线播精品第三| 中文字幕成人动漫| 亚洲h精品动漫在线观看| 在线免费a视频| 日韩精品极品毛片系列视频| 日本在线视频www鲁啊鲁| 国产精品电影在线观看| 久久男人av| 成人在线观看毛片| 麻豆国产精品一区二区三区| 国产吞精囗交久久久| 亚洲综合成人网| 91久久精品无码一区二区| 亚洲欧美激情在线视频| 日皮视频在线观看| 国产精品一区二区久久久| 青草久久视频| 成人一级生活片| 国产在线观看一区二区| 国产日韩精品中文字无码| 欧美日韩一区二区三区| 蜜桃91麻豆精品一二三区| 久久深夜福利免费观看| 日韩不卡在线| 久久久久久久久久久久久久一区| 狠狠综合久久| 午夜影院免费版| 亚洲人精品一区| 国产精品免费无遮挡| 亚洲午夜精品久久久久久性色| 九色porny自拍视频在线观看 | 超碰福利在线观看| 日韩在线观看av| 成人免费黄色| 日韩免费一区二区三区| 天堂va蜜桃一区二区三区| 亚洲天堂网一区二区| 大桥未久av一区二区三区| 人妻少妇精品无码专区| 久久久久久久亚洲精品| 最新国产精品精品视频| 久久男人资源站| 高清不卡一二三区| 国产精品第九页| 亚洲国模精品一区| 正在播放日韩精品| 欧美精品国产精品久久久| 久久最新视频| 国产又黄又粗的视频| 欧美三电影在线| 天堂аⅴ在线地址8| 成人国产精品一区二区| 亚洲视频电影在线| 国产成人精品综合久久久久99| 亚洲一区二区三区四区五区黄 | 中文字幕av日韩精品| 久久99国产精品久久99| 丰满少妇被猛烈进入一区二区| 日韩视频永久免费| ririsao久久精品一区| 久久久久一区二区三区| 蜜臀久久久久久久| 内射一区二区三区| 精品1区2区在线观看| 一区二区乱码| 亚洲精品国产一区| 国产专区欧美精品| 日本五十熟hd丰满| 亚洲欧美日韩天堂| 日韩三级成人| www.好吊操| 国产日韩欧美高清| 91亚洲欧美激情| 97在线免费观看| 成人久久综合| 无码人妻丰满熟妇啪啪网站| 欧美日韩美女视频| 伊人免费在线| 国产精品三区www17con| 天堂久久一区二区三区| 成人高潮免费视频| 日韩电影中文字幕| 91国产一区| 乱妇乱女熟妇熟女网站| 国产精品每日更新| 色婷婷av一区二区三区之e本道| 日韩av成人在线观看| 正在播放日韩欧美一页| 91av在线免费| 91麻豆精品国产91久久久更新时间 | 青青青免费在线| 中文一区在线播放| 亚洲欧美黄色片| 国产欧美日韩中文字幕| 亚洲最黄网站| 精品无码一区二区三区蜜臀| 亚洲片国产一区一级在线观看|