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

Rollup打包入門到實踐,你學會幾分?

開發 前端
了解rollup[2]的基礎使用,對于工具庫?來說,rollup?打包比起webpack?配置要簡單得多,但是遠遠沒有webpack?的生態強大,兩者比較使用起來rollup比webpack?要簡單得多,我們也可以參考學習vue2[3]源碼,vue2?源碼是如何通過rollup打包的。

rollup在業務中基本很少會有接觸到,通常在我們的業務中大部分接觸的腳手架,或者自己搭建項目中,我們都是用webpack,無論是vue-cli,還是react-create-app他們都是基于webpack二次封裝的腳手架,所以我們對rollup更陌生一點,本文是一篇關于rollup的學習筆記,希望看完在項目中有所思考和幫助。

在開始本文前,主要會從以下幾點去認識了解rollup。

1、基礎了解rollup打包不同模式,以及如何打包成不同模式的js。

2、以一個實際的例子,將工具庫用rollup與gulp實現任務流打包,驗證打包后的js是否ok,加深對rollup的使用。

npm 初始化一個基礎的package.json。

npm init -y

局部安裝rollup。

npm i rollup

然后在當前目錄下創建一個index.js。

在index.js中寫入一點測試代碼。

import b from './js/b.js'
// const a = require('./js/a.js');
const getName = () => {
// console.log('hello', a.name);
console.log('hello', b.name);
};
getName();

npx運行局部命令

當你在當前項目安裝rollup后,就可以用命令行npx執行rollup打包輸出對應模式的bundle.js

// 將index.js打包輸出成bundle.iife文件,iife模式
npx rollup index.js --file bundle-iife.js --format iife


// 將index.js打包輸出成cjs模式
npx rollup index.js --file bundle-cjs.js --format cjs


// 將index.js打包輸出成umd模式
npx rollup index.js --file bundle-umd.js --format umd
// es
npx rollup index.js --file bundle-es.js --format es

es打包后的代碼是這樣的,不過此時es6還未為編譯成es5。

const name = 'Maic';
const age = 18;
var b = {
name,
age
};


// const a = require('./js/a.js');
const getName = () => {
// console.log('hello', a.name);
console.log('hello', b.name);
};
getName();

打包前的代碼。

// const a = require('./js/a.js');
import b from './js/b.js'
const getName = () => {
// console.log('hello', a.name);
console.log('hello', b.name);
}
getName();

命令行可以輸出對應文件,我們也可以用配置文件方式,因此你可以像webpack一樣新建一個rollup.config.js這樣的配置,內容也非常簡單。

export default {
input: 'index.js', // 入口文件
output: {
format: 'cjs', // cjs
file: 'bundle.js' // 打包輸出后文件名
},
}

當我們指定配置文件時,package.json的 type要指定成module,當node版本大于13時,默認是以ES Module方式,所以要給了提示,要么在package.json文件中加入type: module,要么把配置文件的后綴名改成rollup.config.mjs。

"type": "module",
"scripts": {
"build": "rollup -c rollup.config.js"
},
Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
[!] RollupError: Node tried to load your configuration file as CommonJS even though it is likely an ES module. To resolve this, change the extension of your configuration to ".mjs", set "type": "module" in your package.json file or pass the "--bundleConfigAsCjs" flag.

es6轉換成es5

在上面的例子中我們代碼里有使用es6,但是打包后仍未轉譯,es6轉es5主要依賴以下幾個關鍵插件rollup-plugin-babel,@babel/preset-env,@babel/core插件。

在根目錄下新建一個.babelrc.json,并依次安裝npm i rollup-plugin-babel @babel/preset-env @babel/core --save-dev。

{
"presets": [
["@babel/env", {"modules": false}]
]
}

在rollup.config.js中。

import commonjs from '@rollup/plugin-commonjs';
import babel from 'rollup-plugin-babel';
export default [
{
input: 'index.js',
output: {
format: 'cjs',
file: 'bundle_cjs.js'
},
plugins: [commonjs(), babel({
exclude: ['node_modules/**']
})]
},
]

這樣配置后,es6就可以成功編譯成es5了。

我們發現還有@rollup/plugin-commonjs插件,這個插件主要是編譯cjs。

如果你的代碼使用的是cjs,未編譯前。

// import b from './js/b.js'
const a = require('./js/a.js');
const getName = () => {
console.log('hello', a.name);
// console.log('hello', b.name);
};
getName();

編譯打包后;

'use strict';
var _01 = {};
var name = 'Web技術學苑';
var age = 18;
var a$1 = {
name: name,
age: age
};
var a = a$1;
var getName = function getName() {
console.log('hello', a.name);
};
getName();
module.exports = _01;

rollup默認就是esModule方式,所以你會看到你配置的輸出文件都是export default方式輸出的。

當我們簡單的了解一些rollup的知識后,我們嘗試打包一個我們自己寫的工具庫試一試。

rollup打包一個工具庫

在很早之前寫過一篇關于webpack打包工具庫,可以參考這篇文章webpack5構建一個通用的組件庫,今天用rollup實現一個webpack5打包一樣的功能,對應文章源碼參考nice_utils。

準備基礎庫

首先我們把nice_utils[1]倉庫下拷貝出src目錄。

目錄大概就是下面這樣。

圖片

因為項目是支持ts的所以也需要安裝typescript。

執行以下命令,然后初始化tsconfig.json。

npm i typescript --save-dev


npx tsc --init

npx tsc --init主要是默認生成ts配置文件。

{
"compilerOptions": {
"baseUrl": ".",
"outDir": "dist",
"sourceMap": true,
"target": "es5",
"module": "ESNext",
"moduleResolution": "node",
"newLine": "LF",
"strict": true,
"allowJs": true,
"noImplicitAny": false,
"noImplicitThis": false,
"noUnusedLocals": true,
"experimentalDecorators": true,
"resolveJsonModule": true,
"esModuleInterop": true,
"removeComments": false,
"jsx": "preserve",
"lib": ["esnext", "dom", "dom.iterable"],
},
}

這里注意一點lib配置需要加上dom.iterable,不加這個會打包編譯報錯,因為我們的工具函數里有用到entries迭代器,所以lib上需要加上這個,默認生成的配置會比較多,關鍵的幾個,特別注意lib,target,jsx即可。

rollup.config.js

在根目錄下新建rollup.config.js。

import path, { dirname } from 'path';
import { fileURLToPath } from 'url'
import commonjs from '@rollup/plugin-commonjs';
import babel from 'rollup-plugin-babel';
import alias from '@rollup/plugin-alias';
import ts from 'rollup-plugin-typescript2';


const resolve = (p) => {
return path.resolve(dirname(fileURLToPath(import.meta.url)), p)
};
const builds = {
'runtime-cjs-prod': {
entry: resolve('src/index.ts'),
dest: name => `dist/${name}.js`,
format: 'cjs',
env: 'production',
external: []
},
'runtime-esm-prd': {
entry: resolve('src/index.ts'),
dest: name => `dist/${name}.js`,
format: 'esm',
env: 'production',
external: []
},
'runtime-umd-prd': {
entry: resolve('src/index.ts'),
dest: name => `dist/${name}.js`,
format: 'umd',
env: 'production',
external: []
}
}
const getConfig = (name) => {
const opts = builds[name];
const config = {
input: opts.entry,
external: opts.external,
plugins: [
commonjs(),
babel(),
// 設置全局路徑別名
alias({
entries: {
'src': resolve('src'),
}
}),
ts({
tsconfig: resolve('./tsconfig.json')
})
].concat(opts.plugins, []),
output: {
file: opts.dest(name),
format: opts.format,
name: opts.name || 'Nice_utils',
}
}
return config;
}


export default Object.keys(builds).map(getConfig)

以上一段代碼看似好長,但實際上輸出的就是一個數組配置,本質上就是輸出。

export default [
{
input: '',
dest: '',
format: 'cjs',
env: 'production',
external: []
}
...
]

我們注意到resolve這個方法有些特殊,主要是獲取路徑,我們以前可能不會這么做,我們會path.resove(__dirname, p),因為此時rollup是默認ESModule所以,__dirname就會報錯,__dirname只有在cjs中才可以正確使用,所以這里只是換了一種方式,但實際上的作用并沒有發生變化。

import path, { dirname } from 'path';
import { fileURLToPath } from 'url'
const resolve = (p) => {
return path.resolve(dirname(fileURLToPath(import.meta.url)), p)
};
const builds = {
'runtime-cjs-prod': {
entry: resolve('src/index.ts'),
dest: name => `dist/${name}.js`,
format: 'cjs',
env: 'production',
external: []
},
...
}

最后我們在package.json中配置打包命令。

{
"name": "02",
"version": "1.0.0",
"description": "",
"main": "index.js",
"type": "module",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "rollup -c rollup.config.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@babel/core": "^7.19.6",
"@babel/preset-env": "^7.19.4",
"@rollup/plugin-alias": "^4.0.2",
"@rollup/plugin-commonjs": "^23.0.2",
"@types/node": "^18.11.6",
"rollup": "^3.2.3",
"rollup-plugin-babel": "^4.4.0",
"rollup-plugin-typescript2": "^0.34.1",
"typescript": "^4.8.4"
}
}

順帶我們看下,我們使用到的一些插件,注意@types/node必須要安裝,不安裝就會提示需要安裝此插件。

圖片

并且我們看到了es6轉es5所需要的@babel/core,@babel/preset-env以及rollup-plugin-babel,還有@rollup/plugin-commonjs,這個插件會將內部模塊中如果有用到cjs會給我們轉譯成es6,因為在瀏覽器是不識別require這樣的關鍵字的。

當我們運行npm run build時。

圖片

測試打包后的js

我們新建了一個example文件,在該目錄下新建一個index.html。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>example</title>
</head>
<body>
<div id="app"></div>
<script src="../dist/runtime-umd-prd.js"></script>
</body>
</html>

我們需要借助一個類似webpack-dev-server的第三方插件才行,這里我們結合gulp與browser-sync兩個插件。

我們新建一個gulpfile.js文件。

// gulpfile.js
import browserSync from 'browser-sync';
import gulp from 'gulp';
import { rollup } from 'rollup';
import { builds, getConfig } from './config.js';


const buildTask = (keyName) => {
gulp.task('build', () => {
const { input, output, plugins } = getConfig(keyName);
return rollup({
input,
plugins
})
.then(bundle => {
return bundle.write({
...output,
sourcemap: true
});
});
});
}
const devServer = () => {
const server = browserSync.create();
const defaultOption = {
port: '8081', //設置端口
open: true, // 自動打開瀏覽器
files: `src/*`, // 當dist文件下有改動時,會自動刷新頁面
server: {
baseDir: '.' // 基于當前根目錄
},
serveStatic: ['.', './example'],
}
gulp.task('server', () => {
server.init(defaultOption)
})
}
const start = async () => {
const keyName = Object.keys(builds)[2]; // 輸出umd模式
await buildTask(keyName);
await devServer();
}
start();

我們所用到的就是gulp,并結合rollup打包我們的倉庫代碼。

在引入的config.js主要是把之前的相關配置提了出去。

// config.js
import path, { dirname } from 'path';
import { fileURLToPath } from 'url'
import commonjs from '@rollup/plugin-commonjs';
import babel from 'rollup-plugin-babel';
import alias from '@rollup/plugin-alias';
import ts from 'rollup-plugin-typescript2';
export const resolve = (p) => {
return path.resolve(dirname(fileURLToPath(import.meta.url)), p)
};
export const builds = {
'runtime-cjs-prod': {
entry: resolve('src/index.ts'),
dest: name => `dist/${name}.js`,
format: 'cjs',
env: 'production',
external: [],
plugins: []
},
'runtime-esm-prd': {
entry: resolve('src/index.ts'),
dest: name => `dist/${name}.js`,
format: 'esm',
env: 'production',
external: [],
plugins: []
},
'runtime-umd-prd': {
entry: resolve('src/index.ts'),
dest: name => `dist/${name}.js`,
format: 'umd',
env: 'production',
external: [],
plugins: []
}
}
export const getConfig = (name) => {
const opts = builds[name];
const config = {
input: opts.entry,
external: opts.external,
plugins: [
commonjs(),
babel(),
// 設置全局路徑別名
alias({
entries: {
'src': resolve('src'),
}
}),
ts({
tsconfig: resolve('./tsconfig.json')
})
].concat(opts.plugins, []),
output: {
file: opts.dest(name),
format: opts.format,
name: opts.name || 'Nice_utils',
}
}
return config;
}

最后我們在package.json添加運行命令。

"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "rollup -c rollup.config.js",
"server": "gulp build && gulp server"
},

注意我們server實際上有兩個任務,所以必須要依次執行兩個任務才行。

當我們運行npm run server時,就會打包,并同時打開瀏覽器。

圖片

OK了,證明我們打包后的js就生效了。

總結

了解rollup[2]的基礎使用,對于工具庫來說,rollup打包比起webpack配置要簡單得多,但是遠遠沒有webpack的生態強大,兩者比較使用起來rollup比webpack要簡單得多,我們也可以參考學習vue2[3]源碼,vue2源碼是如何通過rollup打包的。

以一個簡單的例子結合gulp配和rollup打包對應不同模式的js,從而加深對rollup的理解。

本文示例code example[4]。

參考資料

[1]nice_utils: https://github.com/maicFir/nice_utils

[2]rollup: https://rollupjs.org/guide/en/

[3]vue2: https://github.com/vuejs/vue

[4]code example: https://github.com/maicFir/lessonNote/tree/master/rollup/02

責任編輯:武曉燕 來源: Web技術學苑
相關推薦

2024-10-07 09:12:33

2023-03-30 08:26:31

DNSTCPUDP

2023-03-31 08:16:39

CDN網絡數據

2022-11-02 07:37:07

WebAssembl瀏覽器服務器

2022-10-24 09:55:32

ESLintJavaScript

2022-02-20 19:02:16

RollupVue 2JavaScrip

2023-03-10 22:08:20

2022-11-03 08:16:33

MySQL·窗口函數

2024-01-08 07:29:57

多集群模型Istio網絡拓撲

2023-04-14 09:04:07

測試TDBF單元測試

2021-12-25 22:29:04

WebpackRollup 前端

2009-11-26 09:28:56

VS2003打包

2023-04-10 09:31:00

路由技術廠商

2021-06-15 18:42:53

Rollup配置 JavaScript

2024-01-05 09:08:48

代碼服務管理

2024-04-09 13:16:21

Rust命名規范

2024-05-23 08:32:48

2023-03-09 11:34:00

項目CMakeST

2016-09-30 15:13:01

Python代碼

2021-10-28 07:10:21

rollupPlugin插件編寫
點贊
收藏

51CTO技術棧公眾號

av影院午夜一区| 欧美电影免费播放| 91精品福利视频| 亚洲精品成人a8198a| 国产视频一二三四区| 国产免费成人| 久久久av一区| 国产传媒第一页| 综合久草视频| 欧美视频中文在线看| 国产又黄又爽免费视频| 头脑特工队2在线播放| 久久er99热精品一区二区| 97人人模人人爽人人喊中文字| 日本成人午夜影院| 国产图片一区| 欧美一区二区三区思思人| 国模无码视频一区二区三区| 免费黄色在线网站| 国产午夜一区二区三区| 亚洲字幕一区二区| 欧美另类高清videos的特点| 日韩亚洲精品在线| 久久成人18免费网站| www亚洲色图| 欧美五码在线| 日韩一区二区免费视频| 亚洲xxxx2d动漫1| 乱馆动漫1~6集在线观看| 亚洲人亚洲人成电影网站色| 青青草成人激情在线| 亚洲成人一二三区| 狠狠色综合日日| 国产精品久久久久久搜索| 天天综合网久久综合网| 在线国产精品一区| 欧美成人合集magnet| 欧美激情 一区| 九九精品在线| 亚洲欧美精品在线| 亚洲调教欧美在线| 红杏成人性视频免费看| 91精品国产一区二区人妖| 五月天亚洲视频| 成人欧美一区二区三区的电影| 亚洲成人动漫精品| 日韩黄色片在线| 日韩三级免费| 一级特黄大欧美久久久| 久久久久久久久网| av文字幕在线观看| 亚洲色图都市小说| 8x8ⅹ国产精品一区二区二区| 快射视频在线观看| 亚洲视频一区二区免费在线观看| 一区二区视频在线播放| 69久久久久| 国产精品免费视频观看| 亚洲精品视频一二三| 啊v视频在线| 国产精品乱人伦| 亚洲一区二区高清视频| 激情视频在线观看| 亚洲精品欧美在线| 亚洲理论电影在线观看| 欧美亚洲日本精品| 色婷婷综合久久久久中文一区二区| 每日在线更新av| 成人开心激情| 欧美精品在线观看播放| 永久看看免费大片| 国产精品香蕉| 亚洲性xxxx| 亚洲一二三在线观看| 欧美福利电影在线观看| 久久久久日韩精品久久久男男| 日韩欧美性视频| 玖玖玖国产精品| 国产专区精品视频| 性中国xxx极品hd| 92精品国产成人观看免费| 日本一区视频在线观看免费| 91电影在线播放| 一区二区三区欧美| 久久久噜噜噜www成人网| 91成人在线| 日韩欧美一二三区| 好吊日免费视频| 小说区亚洲自拍另类图片专区| 欧美精品在线免费| 欧美另类一区二区| 韩国欧美国产1区| 精品国产乱码久久久久久丨区2区 精品国产乱码久久久久久蜜柚 | 免费av一区| 久久精品国产久精国产思思| 成人免费看片98| 日日欢夜夜爽一区| 亚洲最大的网站| 欧美女优在线观看| 悠悠色在线精品| 久久婷婷国产91天堂综合精品| 国产精品久久免费视频| 亚洲精品一区在线观看香蕉| 国产精品国产三级国产传播| 日韩午夜黄色| 亚洲一区二区少妇| 国产综合在线观看| 亚洲国产欧美另类丝袜| 亚洲精品20p| 任你弄精品视频免费观看| www.久久久久久.com| 久久久久久久久久影院| 国产一区二区在线观看视频| 欧美在线播放一区| 日本在线啊啊| 精品国产精品一区二区夜夜嗨| 91麻豆精品久久毛片一级| 亚洲欧美久久| 国产亚洲欧美一区二区三区| 国产剧情在线| 欧美中文一区二区三区| 色噜噜在线观看| 激情另类综合| 亚洲伊人第一页| 午夜在线视频| 欧美日韩中文字幕一区| 成人免费看aa片| 亚洲精品九九| 国产精品一区二区三区四区五区| 国产在线看片| 欧美日韩精品免费| 91成人在线免费视频| 国产欧美一级| 国产一区二区三区奇米久涩| 男女免费观看在线爽爽爽视频| 欧美日韩一级片在线观看| 亚洲永久精品ww.7491进入| 一区二区三区导航| 国产女人水真多18毛片18精品| 超碰个人在线| 日韩欧美卡一卡二| 久久久精品视频免费观看| 精品制服美女久久| 亚洲一区在线免费| 四虎国产精品永久在线国在线| 中文字幕日韩欧美在线| 欧美激情一区二区三区免费观看 | 精品国产制服丝袜高跟| 欧产日产国产v| 国产成人综合网站| 黄色片免费在线观看视频| 精品国产不卡一区二区| 久久综合伊人77777蜜臀| 国产女人高潮毛片| 洋洋av久久久久久久一区| 中文字幕一二三| 狠色狠色综合久久| 久久精品人人做人人爽电影| 日本午夜大片a在线观看| 国产丝袜一区二区三区| 欧美男人天堂网| 亚洲欧美在线视频| 国产成人精品一区二区三区在线观看| 欧美福利在线| 精品国产乱码久久久久久丨区2区 精品国产乱码久久久久久蜜柚 | 99久久久精品| 黑鬼大战白妞高潮喷白浆| 日韩超碰人人爽人人做人人添| 欧美在线一级视频| 草碰在线视频| 日韩精品中午字幕| 青青操免费在线视频| 国产香蕉久久精品综合网| 午夜精品中文字幕| 午夜激情一区| 久久久久久久久久久久久久一区 | 五月婷婷六月香| 激情综合色综合久久| 日产精品久久久久久久蜜臀| 欧美自拍视频| 国产精品自产拍在线观看中文| 成人看片免费| 亚洲国产精品999| 中文字幕黄色av| 一区二区三区四区在线播放| 一级特黄a大片免费| 免费的成人av| 国精产品一区一区三区视频| 狠狠综合久久av一区二区蜜桃| 91青草视频久久| 永久免费毛片在线播放| xxx成人少妇69| 十八禁一区二区三区| 欧美日韩一区中文字幕| 国产无遮挡裸体免费视频| 国产色婷婷亚洲99精品小说| 国产精品嫩草影视| 国产精品视区| a级片一区二区| 精品久久不卡| 国产精品久久久久久久久久久久冷| 韩国主播福利视频一区二区三区| 久久久精品2019中文字幕神马| 国产又爽又黄网站亚洲视频123| 欧美日韩国产首页| 久久久久久久久久久影院| 亚洲欧美日韩久久| av电影网站在线观看| 国产+成+人+亚洲欧洲自线| 日韩一级片播放| 亚洲久久成人| 日韩中文字幕亚洲精品欧美| 欧美午夜精彩| 玛丽玛丽电影原版免费观看1977| 精品国产亚洲日本| 国产精品久久久久秋霞鲁丝| 激情国产在线| 日韩亚洲第一页| 国产毛片在线| 日韩精品视频免费在线观看| 亚洲精品久久久久久久久久| 欧美美女bb生活片| 五月婷婷丁香在线| 欧美日韩国产精品一区二区三区四区 | 久久久在线观看| 超碰在线caoporen| 最近中文字幕mv在线一区二区三区四区| 污污的视频网站在线观看| 日韩欧美123| av网站在线免费看| 884aa四虎影成人精品一区| 午夜精品免费观看| 日韩欧美中文在线| 美日韩一二三区| 午夜精品123| 精品视频一区二区在线观看| 亚洲精品第1页| 久久久久久久久久网站| 亚洲人成精品久久久久| 男人的午夜天堂| 国产精品国产三级国产aⅴ原创| 日韩一区二区a片免费观看| 97精品超碰一区二区三区| 污污内射在线观看一区二区少妇| 国产成人免费在线观看不卡| 精产国品一区二区三区| 国产超碰在线一区| 欧美一级片在线免费观看| 粉嫩绯色av一区二区在线观看| 少妇丰满尤物大尺度写真| 国产精品18久久久| 久草免费资源站| 成人福利在线看| 自拍视频一区二区| 91啪九色porn原创视频在线观看| 国产精品三级在线观看无码| 26uuu亚洲| 韩国女同性做爰三级| 欧美国产欧美综合| 天天鲁一鲁摸一摸爽一爽| 亚洲乱码精品一二三四区日韩在线| 青青青在线免费观看| 亚洲国产成人av| 精品国产乱码一区二区| 色婷婷综合久久久久中文 | 麻豆成人久久精品二区三区红 | 免费观看亚洲天堂| 国产富婆一区二区三区| 四虎5151久久欧美毛片| 午夜免费电影一区在线观看| 91精品一区二区三区综合在线爱 | 日韩精品久久一区二区三区| 日韩精品免费一区二区在线观看| 一个色的综合| 国产主播精品| 久久久久国产精品熟女影院| 美女久久久精品| 国产老头和老头xxxx×| 2023国产精品自拍| 免费精品在线视频| 亚洲国产精品一区二区www| 6080午夜伦理| 在线不卡中文字幕播放| 欧美一级性视频| 上原亚衣av一区二区三区| 羞羞的视频在线观看| 日本久久中文字幕| 试看120秒一区二区三区| 老牛影视免费一区二区| 久久视频精品| 国内自拍在线观看| 极品少妇一区二区三区精品视频 | 能看的毛片网站| 国产+成+人+亚洲欧洲自线| 一级片视频免费看| 亚洲午夜私人影院| 国产精品无码一区| 亚洲精品在线免费播放| av网站在线播放| 久久久久久国产精品美女| 韩国成人在线| 国产精品免费一区二区三区四区| 日韩电影一区| 草草久久久无码国产专区| 国内成人免费视频| 国产色视频一区二区三区qq号| 亚洲精品国产精华液| 中文字幕永久在线| 亚洲国产美女精品久久久久∴| 免费黄色电影在线观看| 欧美亚洲国产视频小说| 亚洲啊v在线免费视频| 亚洲春色在线| 香蕉久久夜色精品国产| 国产sm在线观看| 国产精品超碰97尤物18| 日韩一级在线视频 | 1024免费在线视频| 欧洲美女7788成人免费视频| 亚洲国产欧美国产第一区| 日本在线观看一区| 伊人久久综合| 男男受被啪到高潮自述| 国产精品国产自产拍高清av| 人人爽人人爽人人片av| 亚洲国产第一页| 蜜臀av在线| 亚洲自拍在线观看| 91成人超碰| 欧美又黄又嫩大片a级| 国产精品人妖ts系列视频| 好吊色在线视频| 国产视频精品自拍| 咪咪网在线视频| 精品日韩电影| 午夜亚洲视频| 性欧美成人播放77777| 婷婷国产在线综合| 免费看国产片在线观看| 欧美日韩福利视频| 玖玖玖电影综合影院| 男同互操gay射视频在线看| 麻豆视频观看网址久久| 任你操精品视频| 在线成人免费视频| 亚洲羞羞网站| 成人资源av| 999在线观看精品免费不卡网站| 折磨小男生性器羞耻的故事| 亚洲综合色婷婷| 男人的天堂a在线| 91精品国产乱码久久久久久蜜臀| 国内视频在线精品| 好吊妞无缓冲视频观看| 久久综合色一综合色88| 久操视频在线免费观看| 中文字幕亚洲自拍| 看亚洲a级一级毛片| 香港三级日本三级a视频| 成人免费视频网站在线观看| 日韩经典在线观看| 亚洲毛茸茸少妇高潮呻吟| 日韩电影免费观看高清完整版| 日韩精品欧美一区二区三区| 麻豆精品视频在线| 九九在线观看视频| 日韩精品一二三四区| 国产精品字幕| 精品日韩在线播放| 99久久国产免费看| 亚洲综合成人av| 欧美精品一区二区三区国产精品| 精品嫩草影院| 九色porny91| 亚洲视频 欧洲视频| 熟妇人妻中文av无码| 国产91九色视频| 亚洲综合五月| 在线观看国产网站| 欧美日韩中文字幕一区| 麻豆蜜桃在线| 色播亚洲婷婷| 国产成a人无v码亚洲福利| 国产污视频网站| 欧美成人h版在线观看| 亚洲精品动态| 亚洲成人手机在线观看| 午夜精品久久一牛影视| 九九在线视频| 亚洲最大成人在线| 久久午夜影视| 久久影院一区二区| 中文字幕亚洲国产| 精品欠久久久中文字幕加勒比| 欧美大尺度做爰床戏| 亚洲综合在线第一页| 国产精品一区二区婷婷| 国产 高清 精品 在线 a| 人妖欧美一区二区| 国产欧美一区二区三区在线看蜜臂|