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

詳解NodeJS和命令行程序

開發(fā) 開發(fā)工具
本文簡述了命令行的意義和優(yōu)勢,介紹了解釋型命令行的運行機制,同時介紹了幾個NodeJS相關(guān)的命令行工具,推薦了幾款撰寫命令行程序常用的包,最后,概述了發(fā)布包和使用scope的發(fā)布情況。

源起

植根于Unix系統(tǒng)環(huán)境下的程序,很多都把貫徹Unix系統(tǒng)設(shè)計的哲學(xué)作為一種追求。Unix系統(tǒng)管道機制的發(fā)明者Douglas McIlroy把Unix哲學(xué)總結(jié)為三點:

  • 專注做一件事,并做到NO.1
  • 程序協(xié)同工作。
  • 面向通用接口,如文本數(shù)據(jù)流。

隨著Unix/Linux系統(tǒng)在服務(wù)器上影響力越發(fā)強大,以及各種跨平臺解決方案的發(fā)展,這種哲學(xué)也被帶到了各種平臺上。若干年前,筆者第一次接觸NodeJS和其包管理解決方案NPM時候,就感覺到其官方倡導(dǎo)的風(fēng)格,和Unix系統(tǒng)哲學(xué)非常契合。近年來,隨著NodeJS在服務(wù)端以及前端構(gòu)建領(lǐng)域上的不斷開拓,NodeJS的這種思想也正快速的滲透到這些領(lǐng)域。

其實,NodeJS的本身,也是開發(fā)命令行程序的一個重要利器。本文就將介紹幾個常用的NodeJS相關(guān)命令行程序,之后介紹幾個開發(fā)命令行中常用的組件,最后介紹發(fā)布npm包以及帶scope的包的發(fā)布方法。

[[262554]]

命令行是如何工作的

命令行,可以簡單定義為是一種基于文本流的用戶交互接口和交互方式。命令行程序常常通過命令行參數(shù)的傳遞來得到不同的運行方式。而由于一切命令的下達(dá),都是基于文本的,所以也為元編程,提供了便利。

命令行程序可以是編譯執(zhí)行的,也可以是解釋執(zhí)行的。對于編譯后的命令行程序,將直接以機器碼執(zhí)行。而對于大多數(shù)的解釋型的命令行程序,運行往往需要借助命令行解釋程序。

這篇文章中提到的命令行程序特指需要解釋程序的命令行程序。

可以充當(dāng)命令行解釋程序的,其實包含了大家聽說過的常見的解釋器,比如bash、zsh、perl、python、ruby、tcl等等,當(dāng)然還有NodeJS。

打開一個命令行程序,比較標(biāo)準(zhǔn)的寫法是在第一行寫明解釋程序的路徑,如:

  1. #!/usr/local/opt/python/bin/python3.6 

這里 #! 稱為shebang,一般位于文件的最開頭。在Unix系統(tǒng)中,#!所在行后面的部分將被視為解釋器指令。同時會把文件所在路徑作為參數(shù)附在解釋器后面。上例中,如果文件是/usr/local/bin/pip,則直接運行/usr/local/bin/pip的效果,等同于/usr/local/opt/python/bin/python3.6 /usr/local/bin/pip。

這樣做,使得用戶無需關(guān)心解釋程序,無需關(guān)心代碼編寫的語言,直接運行對應(yīng)的命令行程序本身就好了。這也是shebang存在的意義。不過,由于系統(tǒng)設(shè)定的原因,使用windows的同學(xué)可能無法享受這種便利,一般還需手動指定解釋程序的路徑。但是,他們可以雙擊運行:-)。

可以試著用文本編輯工具打開一個NodeJS寫成的腳本如:webpack,會發(fā)現(xiàn)其第一行是#!/usr/bin/env node。這句話并不是直接的NodeJS的解析程序。這里, /usr/bin/env是一個程序,目的是從系統(tǒng)的PATH中尋找對應(yīng)名字的解釋程序的地址。此時,解釋程序可以被安裝在各種路徑,只要在系統(tǒng)PATH中注冊過,就可以找到了。

可能大家遇到過這種問題,在運行某些NodeJS程序會出現(xiàn)報錯:

  1. /usr/bin/env: node: No such file or directory 

此時可以從系統(tǒng)PATH中是否有node這個文件路徑、某些版本的NodeJS是否名為node等方向來排查問題。

NodeJS相關(guān):好用的命令行工具

在NodeJS目前已經(jīng)成為前端工作流的主力語言的情況下, babel和webpack基本已經(jīng)成為前端開發(fā)、測試、發(fā)布上的重要工具。同時圍繞babel和webpack有一系列周邊的工具包和插件協(xié)助開發(fā)者完成日常開發(fā)的方方面面。

同時,目前最為流行的前端框架Angular、react、vue(以首字母為序),各自有自帶的腳手架和開發(fā)輔助工具。如ng-cli、create-react-app和vue-cli等等。更有Poi1這樣的通吃React和Vue的腳手架工具。

上面這部分每一個都可以獨立出來單獨講解。有興趣的讀者可以參考上述工具的官方網(wǎng)站獲取更多信息。

下面來說幾個其他方面的NodeJS相關(guān)的軟件包。

1. 多版本共存 n/nvm

大多數(shù)情況,我們只需面對單一的NodeJS版本。等到時機成熟,再統(tǒng)一把NodeJS版本升級到更高版本。

不過筆者就曾經(jīng)遇到過一個年久失修失修的項目需要重新維護(hù)的情況。此時需要把NodeJS版本切到老版本。同時,我們也不想舍棄大多數(shù)項目運行的新版本NodeJS環(huán)境。

這種情況可以使用n或nvm。下圖展示了,用n下載并切換到一個新版本的過程。

除了下載之外,n還提供了列表的方式切換多個版本,以及刪除某個版本的方法。讀者可以在安裝之后使用n -h查看所有可用參數(shù)。

n采用bash編寫。但提供了一個npm倉庫安裝的入口,可以使用大家傳統(tǒng)意義的npm安裝法進(jìn)行全局安裝,前提是你必須有一個可以運行的NodeJS環(huán)境。

  1. npm install -g n 

或者在沒有NodeJS的環(huán)境下,可以使用n-install腳本。安裝只需運行:curl -L https://git.io/n-install | bash。

如果是windows用戶,在windows10下面可以安裝wsl來獲得Linux腳本運行環(huán)境,官方倉庫的一個issues,對此有一個操作說明2。

對windows10以下的用戶,可以考慮折騰下Cygwin。

除了n之外,還有一個管理工具為nvm,也是采用bash腳本編寫。安裝亦可使用安裝腳本來完成。如:

  1. curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash 或 wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash 

。這里的v0.34.0是版本號,可能會隨著版本迭代而變化。

使用windows的讀者,除了上述wsl和Cygwin之外,可以考慮使用nvm-windows3這個用Golang編寫的版本。

就目前的新版本來說,n和nvm的都會嘗試處理公共的依賴庫,然而處理方式是不一樣的。

n和nvm都會在使用某個版本時將此版本的NodeJS下載至本地,不同的是:n將嘗試用新版本代替系統(tǒng)路徑中,關(guān)鍵路徑如bin、lib、include、share的包。nvm則是保留每一個版本的副本,并將NodeJS的系統(tǒng)路徑指向.nvm維護(hù)的沙箱地址。

從處理上,nvm顯得更輕量和高效,但是需要修改系統(tǒng)的PATH,這一步nvm腳本會自動完成。n則無需入侵系統(tǒng)路徑,但每次修改時候均需操作系統(tǒng)路徑,且此時使用sudo n運行,避免因權(quán)限不足,拒絕向系統(tǒng)路徑復(fù)制。

由于nvm會修改PATH地址,所以如果同時默認(rèn)安裝nvm和n,n會運轉(zhuǎn)不正常。一種方案是避免同時安裝,另外可以手動修改PATH,使默認(rèn)的NodeJS路徑先于nvm的系統(tǒng)路徑,如修改PATH片段為:

  1. /usr/local/bin:/Users/leon/.nvm/versions/node/v10.6.0/bin: 

2. 執(zhí)行輔助 nodemon/npx

nodemon是一個執(zhí)行器,意義在于,如果版本變化或者程序變化,無需重新啟動。這在開發(fā)時候非常有用。

nodemon還可以指定運行的端口,如:

  1. nodemon ./server.js localhost 8080 

除了控制NodeJS包之外,nodemon還可以控制非NodeJS腳本,比如:nodemon --exec "python -v" ./app.py,將監(jiān)控app.py的內(nèi)容,并在最開始以及發(fā)生變化時候,調(diào)用python -v進(jìn)行解析。當(dāng)然,如果你的app.py指定了shebang,也可以不需指定解析函數(shù)。

nodemon有很多靈活的配置,通過這些配置,可以實現(xiàn)環(huán)境變量設(shè)置、延遲啟動、命令執(zhí)行、監(jiān)控定制擴展名、優(yōu)雅重啟、事件監(jiān)聽等功能。做法是在需要這些配置的目錄下,提供相關(guān)的配置nodemon.json,也可以在package.json中通過nodemonConfig字段指明。

在這里4 有官方提供的一份配置文件的樣例,供讀者參考。

再來說說npx。什么是npx呢?簡單說,就是找到并運行一個包,并且“用完即走”。

這里有兩層意思:

  • 找到。從哪里找:先是當(dāng)前的依賴,然后是PATH,還找不到就到網(wǎng)上找來安裝。
  • 用完即走。即使從網(wǎng)上安裝的,運行完就會刪掉,不會留下運行的包。 讀者可以試著運行下:npx github:piuccio/cowsay "awesome npx"體驗下。

這實在是居家旅行、開發(fā)調(diào)試的利器。比如我要在當(dāng)前目錄下開一個http服務(wù),可以直接運行:npx http-server。

之后就可以直接在瀏覽器訪問這個地址進(jìn)行調(diào)試了。

另外,如果你需要臨時用一個老版本的node來運行某個腳本,也可以祭出npx,這個node會被臨時安裝、臨時使用、用完即走。

  1. npx -p node@6 npm init 

3. 切換NodeJS注冊表 nrm/yrm

nrm/yrm維護(hù)了一個列表,包括npm主站和其他鏡像。可以使用nrm/yrm use 快速切換,以達(dá)到最快的下載速度。nrm維護(hù)的是npm的注冊表,yrm維護(hù)的是yarn注冊表。

輔助編寫NodeJS包

除了直接用大神們寫好的命令之外,我們也可以按照自己的需求定制自己需要的NodeJS包。我們知道,命令行其實也是一種人機交互,因此,交互上有很多可以借鑒的效果。編寫者只需將包倒入就可以使用這些交互效果。這里筆者給大家推薦幾個包。

1. 命令行參數(shù)讀取 commander

命令行的一個特點就是根據(jù)參數(shù)的不同調(diào)整運行策略。然而處理命令行輸入以及驗證是一個非常繁瑣的事情。為此,TJ大神曾經(jīng)創(chuàng)立了commander包。最基礎(chǔ)的用法如下:

  1. var program = require('commander'); 
  2.  
  3. program 
  4.   .version('0.1.0') 
  5.   .option('-p, --peppers', 'Add peppers') 
  6.   .option('-P, --pineapple', 'Add pineapple') 
  7.   .option('-b, --bbq-sauce', 'Add bbq sauce') 
  8.   .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble') 
  9.   .parse(process.argv); 
  10.  
  11. console.log('you ordered a pizza with:'); 
  12. if (program.peppers) console.log(' - peppers'); 
  13. if (program.pineapple) console.log(' - pineapple'); 
  14. if (program.bbqSauce) console.log(' - bbq'); 
  15. console.log(' - %s cheese', program.cheese); 

默認(rèn)地,commander會自動創(chuàng)建-h的幫助文件,即利用每一個option的輸入產(chǎn)生幫助文案。

用戶的每一個輸入,都會放置在program對應(yīng)option長名的字段的駝峰形式上,如果沒有提供長名,則放在短名字段上。上例中,如使用: testcommander -p 111 -P 222 -b 333則依次存儲在program的peppers、pineapple和bbqSauce上。

同時,commander提供多種驗證方式,如正則表達(dá)式:

  1. program.option('-s --size <size>', 'Pizza size', /^(large|medium|small)$/i, 'medium') 

則指定只能輸入特定的值。

同時,commander提供一個方案,允許用戶設(shè)置子命令。commander稱之為Git風(fēng)格的子命令。

  1. var program = require('commander'); 
  2.  
  3. program 
  4.   .version('0.1.0') 
  5.   .command('install [name]', 'install one or more packages') 
  6.   .command('search [query]', 'search with optional query') 
  7.   .command('list', 'list packages installed', {isDefault: true}) 
  8.   .parse(process.argv); 

這個例子中,假設(shè)命令行名字為pm,則當(dāng)用戶輸入pm-install、pm-search或pm-list時候,commander會嘗試在入口文件的同一級目錄找到install、search或list,并交給這個文件去執(zhí)行。

2. 進(jìn)度條 progress

在編寫web程序時候,大家經(jīng)常會展示一個進(jìn)度條。用以緩解用戶在等待時候的焦慮。其實在命令行程序中也會有這種交互方式。比如wget就會在下載過程中給出進(jìn)度提示。

在NodeJS中也有這樣的效果可以使用。這就是progress包。下面的代碼,運行結(jié)果是下載CentOS安裝盤。在下載之中,會實時打印進(jìn)度:

  1. const ProgressBar = require("progress") 
  2. const request = require("request") 
  3. const progress = require("request-progress") 
  4. const fs = require("fs") 
  5.  
  6. const download = (url, headers, target, totalSize) => { 
  7.     let percent = 0 
  8.  
  9.     const bar = new ProgressBar('下載中: ├:bar┤ 完成:percent 預(yù)估完成時間:eta秒 用時:elapseds', { 
  10.         total: 100, 
  11.         complete: "█", 
  12.         incomplete: "─", 
  13.         width: 60 
  14.     }) 
  15.  
  16.     let opt = { 
  17.         headers, 
  18.         url: url 
  19.     } 
  20.  
  21.     return new Promise((resolve, reject) => { 
  22.         progress(request.get(opt)) 
  23.             .on('progress', function (state) { 
  24.                 let progressFix = ((state.percent) * 100).toFixed(2) 
  25.                 delta = progressFix - percent 
  26.                 bar.tick(delta) 
  27.                 percent = progressFix 
  28.             }) 
  29.             .on("error", () => { 
  30.                 return reject() 
  31.             }) 
  32.             .on('end', () => { 
  33.                 bar.tick(100 - percent) 
  34.                 console.log('\n') 
  35.                 return resolve(target) 
  36.             }) 
  37.             .pipe(fs.createWriteStream(target)); 
  38.     }) 
  39.  
  40. const foo = { 
  41.     getHeaders: () => { 
  42.         const headers = { 
  43.             'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
  44.             'Accept-Charset': 'UTF-8,*;q=0.5', 
  45.             'Accept-Encoding': 'gzip,deflate,sdch', 
  46.             'Accept-Language': 'en-US,en;q=0.8', 
  47.             'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20100101 Firefox/13.0' 
  48.         } 
  49.  
  50.         return Object.assign({}, headers) 
  51.     }, 
  52.  
  53.     download: function (url, target, totalSize){ 
  54.         let headers = this.getHeaders() 
  55.         headers = Object.assign(headers) 
  56.  
  57.         download(url, headers, target, totalSize) 
  58.     } 
  59.  
  60.  
  61. foo.download("http://mirrors.cmich.edu/centos/7.6.1810/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso", 
  62.     "CentOS-7-x86_64-DVD-1810.iso", 4508876.8 
  63.     ) 

運行的結(jié)果如圖:

這個包的核心就是根據(jù)內(nèi)置和自定義的token在命令行打印出相應(yīng)的字符,用以完成交互。

3. 交互著色 chalk

chalk是一個命令行交互的著色工具。在命令行支持的情況下,可以支持最多16位色域(前提是命令行終端可以支持)。一般可以配合console.log使用,如:

  1. const chalk = require('chalk'); 
  2. const log = console.log; 
  3.  
  4. // Combine styled and normal strings 
  5. log(chalk.blue('Hello') + ' World' + chalk.red('!')); 

筆者曾經(jīng)做過一個在命令行下顯示圖片的程序,就是利用的chalk和console.log進(jìn)行的配合。

4. 交互式問答 inquirer

在需要不斷的同用戶進(jìn)行交互式問答,并根據(jù)用戶的輸入進(jìn)行驗證和路徑選擇,這個時候inquirer是非常趁手的工具。它內(nèi)置了單選、多選、問答等多種交互方式。大家可以感受下:

甚至可以通過插件實現(xiàn)suggest:

vue框架的腳手架vue-cli是一個使用inquire的案例,讀者可以通過閱讀源碼,感受下大神出神入化的使用。

5. 小圖標(biāo) ora

ora打印出一個優(yōu)雅的文本小圖標(biāo),用于在各種情況下給出用戶優(yōu)雅而清晰的提示。用法很簡單:

  1. const ora = require('ora'); 
  2.  
  3. const spinner = ora('Loading unicorns').start(); 
  4.  
  5. setTimeout(() => { 
  6.     spinner.color = 'yellow'
  7.     spinner.text = 'Loading rainbows'
  8. }, 1000); 

6. 命令行玩瀏覽器 puppeteer

puppeteer是谷歌開發(fā)的無頭瀏覽器,使得命令行亦可操作瀏覽器,并能根據(jù)瀏覽器的執(zhí)行結(jié)果進(jìn)行進(jìn)一步操控。因為puppeteer源自官方,所以之前類似項目PhantomJS的開發(fā)者決定不再更新PhantomJS。

目前puppeteer已經(jīng)廣泛用于前端測試,端對端測試,以及爬蟲。

鑒于篇幅無法展開介紹,讀者可以參考其官方文檔5。同時,奇舞周刊中黃小璐老師的的這篇文章6以及李光釗老師的這篇文章7都曾經(jīng)介紹過puppeteer的使用。

發(fā)布NodeJS包

寫好的NodeJS包需要發(fā)布出去,才能給大家使用。npm publish就是為了這個需求而產(chǎn)生的。為了發(fā)布你需要在npm上注冊用戶,并登錄,然后發(fā)布就好了。npm的詳情頁面以及各個鏡像會在一段時間內(nèi)自動更新。

如果你的NodeJS包,是使用尚未廣泛支持的語法寫成的。那么需要在package.json的script字段加入prepublish命令,調(diào)用babel等預(yù)編譯器處理,使得程序可以有更多的兼容性。

對于希望用戶在全局使用的命令,要注意在根目錄寫好入口,一般是在package.json中的bin字段,指定入口文件。在安裝時,如果是全局安裝,npm將會使用符號鏈接把這些文件鏈接到prefix/bin,如果是本地安裝,會鏈接到./node_modules/.bin/。

除了通常的包,還有一種是帶有scope的包,vue-cli的3.0版本就是@vue開頭的。這個scope是組織的名字。每一個帶有scope的包有公有和私有之分,私有的需要付費給npm。

目前npm的讀寫權(quán)限策略如下:

如果是個人,可以考慮增加公有的命名空間。如果是企業(yè)付費用戶,你在發(fā)布相關(guān)包之前,需要申請成為這個scope的member。

對公有scope,首先將包的name改為@scope名字/包名,同時,在發(fā)布時,使用npm publish --access public即可。

小結(jié)

本文簡述了命令行的意義和優(yōu)勢,介紹了解釋型命令行的運行機制,同時介紹了幾個NodeJS相關(guān)的命令行工具,推薦了幾款撰寫命令行程序常用的包,最后,概述了發(fā)布包和使用scope的發(fā)布情況。希望給大家的NodeJS命令行相關(guān)開發(fā)和技術(shù)選型,提供一些有用的幫助。

文內(nèi)鏈接:

  • https://poi.js.org/
  • https://github.com/tj/n/issues/511
  • https://github.com/coreybutler/nvm-windows
  • https://github.com/remy/nodemon/blob/master/doc/sample-nodemon.md
  • https://github.com/GoogleChrome/puppeteer
  • https://mp.weixin.qq.com/s/TZgQPKrpIskIgxX3LCXZYw
  • https://mp.weixin.qq.com/s/Xypg-9qZ8OqsPczEKdn6JA

【本文是51CTO專欄機構(gòu)360技術(shù)的原創(chuàng)文章,微信公眾號“360技術(shù)( id: qihoo_tech)”】

戳這里,看該作者更多好文

 

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2010-07-15 10:58:23

Perl命令行程序

2023-03-31 08:44:55

Go開發(fā)命令

2016-03-28 10:00:09

Swift命令程序

2015-07-15 10:32:44

Node.js命令行程序

2022-09-23 09:50:45

Python

2022-09-27 13:07:41

clickPython命令行

2025-08-26 03:00:00

2009-12-24 14:51:39

Linux命令行

2017-03-08 11:10:39

LinuxShell命令

2009-08-11 09:58:22

Linux命令行Linux命令svn命令

2017-05-25 10:32:40

命令linux系統(tǒng)

2025-07-23 09:06:00

2009-07-14 14:03:56

Swing程序

2021-01-13 05:29:26

命令行

2010-11-24 16:48:39

mysql命令行

2018-01-24 15:42:49

命令功能程序

2011-07-21 13:10:59

2017-06-15 10:32:56

OracleDBV命令行工具

2021-01-05 06:12:38

Tcpdump工具網(wǎng)絡(luò)

2020-02-13 10:57:59

Python數(shù)據(jù)設(shè)計
點贊
收藏

51CTO技術(shù)棧公眾號

国产第一亚洲| 色鬼7777久久| 国产精品99免费看| 日韩成人激情视频| 欧美牲交a欧美牲交aⅴ免费真 | 欧美一区二区三区视频免费 | 欧美xxxx性xxxxx高清| 成人午夜视频在线| 国产精品国产自产拍高清av水多| 69夜色精品国产69乱| 韩国精品福利一区二区三区| 天天操天天综合网| 欧美h视频在线观看| 国产 日韩 欧美 综合| 免费中文字幕日韩欧美| 久久香蕉频线观| 一本色道综合久久欧美日韩精品| 日日夜夜亚洲| 精品日本美女福利在线观看| 亚洲一二区在线| 欧美视频一二区| 美女性感视频久久| 91国在线精品国内播放| 男人在线观看视频| 精品在线手机视频| 日韩亚洲欧美在线| 污网站免费在线| 九色porny自拍视频在线观看| 亚洲欧美综合网| 久久综合久久久| 亚洲成人一级片| 看电视剧不卡顿的网站| 日韩免费观看视频| 精品人妻在线播放| 一区二区三区四区电影| 中文在线资源观看视频网站免费不卡| 污污污www精品国产网站| 日韩美女在线| 欧美三级韩国三级日本三斤| www.com毛片| 26uuu亚洲电影在线观看| 国产喂奶挤奶一区二区三区| 精品免费日产一区一区三区免费| 99久久久国产精品无码免费| 久久99精品国产.久久久久久| 日本精品久久久久久久| 五月天婷婷综合网| 在线观看不卡| 欧美高跟鞋交xxxxhd| 欧美a级片免费看| 成人网18免费网站| 国产一区二区日韩精品欧美精品| 朝桐光av一区二区三区| 91亚洲无吗| 精品久久久久av影院 | 亚洲 日本 欧美 中文幕| 你懂的国产精品| 久久亚洲影音av资源网 | 国产中文字幕日韩| 日韩欧美国产另类| 日韩激情视频在线观看| 日韩美女视频在线观看| 中文字幕精品视频在线观看| 久久免费高清| 国产精品成人国产乱一区| 五月天激情四射| 翔田千里一区二区| 国产成人一区二区三区小说| 国模私拍一区二区| 青青青爽久久午夜综合久久午夜| 国产精品国产三级国产aⅴ9色 | 超黄网站在线观看| 亚洲成人av一区| 免费看国产曰批40分钟| 日韩精品极品| 色狠狠色狠狠综合| 国产精品久久久毛片| 日韩护士脚交太爽了| 欧美一区二区三区影视| 韩国黄色一级片| 麻豆一区一区三区四区| 亚洲精品一区久久久久久| 男女做爰猛烈刺激| 久久亚洲专区| 欧美精品一二区| 国产成人在线播放视频| 视频一区二区中文字幕| 成人激情视频网| 亚洲精品国产片| 久久伊人中文字幕| 一本一道久久久a久久久精品91| 菠萝菠萝蜜在线观看| 亚洲影院久久精品| 久草综合在线观看| 99精品美女视频在线观看热舞| 欧美成人免费网站| 波多野结衣 在线| 午夜影院欧美| 91国产精品视频在线| 欧美日韩一区二区电影| 天堂社区在线视频| 91精品日本| 一区二区三区久久精品| 特级片在线观看| 狂野欧美一区| 亚洲一区二区中文| 激情在线视频| 亚洲精品国产无天堂网2021 | 精品高清视频| h视频网站在线观看| 一区二区三区资源| 日本精品久久久久中文字幕| 日本一区二区三区电影免费观看| 国产视频在线观看一区二区| 波多野结衣爱爱视频| 免费视频一区| www久久99| 成人在线免费观看| 精品国产乱码久久久久久天美| 永久免费的av网站| 性欧美xxxx免费岛国不卡电影| 久久影院资源网| 日韩免费av网站| 99久久久无码国产精品| 在线观看成人免费| 日本在线视频一区二区| 亚洲国产欧美精品| 外国一级黄色片| 蜜桃视频免费观看一区| 精品国产一区二区三区麻豆免费观看完整版 | 中文字幕在线视频久| 日韩精品中文字幕在线不卡尤物| 蜜桃av免费观看| 久久久久久久尹人综合网亚洲| 国产福利久久| 国产1区在线| 欧美午夜片在线看| 亚洲a v网站| 中文欧美日韩| 国产尤物99| 毛片在线导航| 日韩欧美在线网站| 亚洲欧美精品aaaaaa片| 久久机这里只有精品| 日韩欧美精品在线不卡| 中文在线免费视频| 亚洲国产精品va在线看黑人| 免费在线黄色片| 国产麻豆精品一区二区| 国产又大又长又粗又黄| 亚洲人成777| 久久精品成人欧美大片| 一级黄色片在线播放| 国产精品网站在线| 日韩av播放器| 日韩片欧美片| 国产在线精品一区免费香蕉 | 欧美日韩xxx| 精品国产黄色片| 亚洲免费看黄网站| 人妻巨大乳一二三区| 亚洲精品国产首次亮相| 亚洲综合国产精品| 国产精品69xx| 亚洲精品黄网在线观看| 欧美一区二区激情视频| 久久亚洲综合av| 亚洲精品怡红院| 999久久久91| 999在线观看免费大全电视剧| 欧美日韩经典丝袜| 日韩av有码在线| 国产一级免费视频| 国产精品天天摸av网| www.污网站| 欧美日韩网址| 欧美日韩精品免费在线观看视频| 电影亚洲精品噜噜在线观看| 中文字幕最新精品| www.超碰在线.com| 精品女同一区二区三区在线播放| 日韩丰满少妇无码内射| 久久国产福利国产秒拍| 日韩成人手机在线| 亚洲人成亚洲精品| 国产美女搞久久| 免费不卡av| 亚洲欧洲在线观看| aaa国产视频| 欧美色xxxx| 欧美h片在线观看| 成人一区二区视频| www.日本xxxx| 欧美国产免费| 青青草成人网| 欧美成人一级| 国产精品成人播放| 日本高清在线观看视频| 日韩精品免费在线| 91精品人妻一区二区三区果冻| 亚洲国产日日夜夜| 欧美激情 一区| 波多野结衣中文字幕一区| 538在线视频观看| 亚洲乱亚洲高清| 一区二区三区四区视频在线观看| 中文字幕区一区二区三| 国产精品美腿一区在线看| 少女频道在线观看免费播放电视剧| 亚洲精品一区中文| 精品国自产在线观看| 在线精品观看国产| 国产精品suv一区二区69| 中文字幕在线播放不卡一区| 800av在线播放| 国产一区二区日韩精品| 91激情视频在线| 一本不卡影院| 欧妇女乱妇女乱视频| 日韩欧美一区二区三区在线视频| 精品无码久久久久国产| 另类视频一区二区三区| 国产精品高潮粉嫩av| av美女在线观看| 久久999免费视频| 午夜视频在线观看网站| 亚洲人成在线一二| 天堂在线资源8| 日韩精品一区在线| 99热这里是精品| 欧美日韩在线播放一区| 秋霞av一区二区三区| 欧美性感美女h网站在线观看免费| 久草福利资源在线观看| 亚洲欧美另类在线| 三级黄色录像视频| 国产精品嫩草久久久久| 无码一区二区三区在线| 久久亚洲精品国产精品紫薇| 特级西西人体4444xxxx| www.视频一区| 美女伦理水蜜桃4| 国产不卡在线播放| 欧美性猛交乱大交| 国产黄色精品网站| 日韩欧美色视频| 国产一区在线视频| www激情五月| 国产一区美女在线| 欧美性猛交xx| 国产精品原创巨作av| 爱情岛论坛亚洲自拍| 国产福利一区二区三区视频 | 久久久精品在线| 麻豆传媒在线免费| 欧美xxxx做受欧美.88| 成a人片在线观看| 欧美插天视频在线播放| 婷婷丁香在线| 亚洲97在线观看| 天天综合av| 国产成人亚洲综合青青| 免费视频成人| 91日韩在线视频| 亚洲乱码一区| 精品不卡一区二区三区| 国产精品免费99久久久| 婷婷久久伊人| 国产精品99视频| 草草草视频在线观看| 在线观看视频免费一区二区三区| 欧美一区二区三区爽大粗免费| 香蕉成人久久| 中日韩av在线播放| 成熟亚洲日本毛茸茸凸凹| 亚洲精品乱码久久| 国产农村妇女毛片精品久久麻豆| 午夜精品久久久久99蜜桃最新版 | 日本免费黄色小视频| 国产精品99一区二区| 老太脱裤子让老头玩xxxxx| 久久狠狠婷婷| 日韩中文字幕a| 北条麻妃一区二区三区| 91视频免费观看网站| 国产精品久久久久国产精品日日| 欧产日产国产v| 欧美日韩国产在线| 一本色道久久综合无码人妻| 欧美成人高清电影在线| 欧美视频综合| 久久影院资源网| 美脚恋feet久草欧美| 成人在线观看视频网站| 任你躁在线精品免费| 亚洲欧美日韩精品综合在线观看| 国产精品www.| 在线看的黄色网址| av一区二区三区黑人| 国产wwwwxxxx| 黑人巨大精品欧美一区二区免费| 在线观看不卡的av| 亚洲第一精品电影| 欧美日韩在线看片| 欧美亚洲视频在线观看| 久久在线观看| 日本一区二区三区视频在线观看 | 亚洲午夜私人影院| 亚洲 小说区 图片区| 亚洲福利精品在线| 黄视频网站在线看| 国产成人免费av| 国语一区二区三区| 国产成人三级视频| 天堂成人国产精品一区| 国产一精品一aⅴ一免费| 国产精品高清亚洲| www.国产com| 精品国产污网站| 麻豆电影在线播放| 国产日产欧美精品| 成人中文在线| 日本老熟妇毛茸茸| 久久久久久久综合狠狠综合| 日韩精品一区二区av| 欧美电影免费提供在线观看| 日本暖暖在线视频| 国产精品久久久久一区二区| 九一国产精品| 日韩免费毛片视频| 91丨porny丨户外露出| 国产精品成人网站| 精品国产制服丝袜高跟| 在线三级中文| 亚洲综合在线小说| 欧美在线三级| 国产伦精品一区二区三区妓女下载| 国产精品久久久久久久久久久免费看 | 亚洲精品1区2区| 精品国产一二区| 亚洲在线视频免费观看| va婷婷在线免费观看| 免费99精品国产自在在线| 自拍偷拍欧美日韩| 9l视频自拍9l视频自拍| 国产一本一道久久香蕉| 日韩视频中文字幕在线观看| 日韩视频一区在线观看| 亚洲区欧洲区| 国产精品嫩草在线观看| 精品9999| 国产黑丝在线观看| 粉嫩av一区二区三区免费野| 日av在线播放| 国产成人精品免费久久久久 | 激情五月婷婷六月| 国产在线播放一区三区四| 欧美日韩国产精品综合| 欧美一区二区三区日韩| 日本aa在线| 国产chinese精品一区二区| 日韩视频一区二区三区在线播放免费观看| 中文字幕 欧美 日韩| 亚洲超碰精品一区二区| 丰满人妻一区二区| 在线播放日韩精品| 亚洲热av色在线播放| 自拍偷拍99| 丁香婷婷综合激情五月色| 久久久久久久久99| 亚洲精品久久久久中文字幕二区 | 亚洲午夜久久久| 蜜桃91麻豆精品一二三区| 4444欧美成人kkkk| 一本色道久久综合亚洲精品酒店| 中文字幕一区二区三区四区在线视频 | 亚洲精品日产aⅴ| 99久久夜色精品国产亚洲96| 午夜视频在线网站| 伊人一区二区三区| 欧美一区二区三区激情| 欧美亚洲国产日本| 日韩精品一区二区三区免费观看| av免费一区二区| 洋洋av久久久久久久一区| 日韩精品系列| 国产精品久久久久久久9999| 欧美喷水视频| 人妻丰满熟妇aⅴ无码| 91久久精品国产91性色tv| 成人video亚洲精品| 成人在线免费网站| 日本sm残虐另类| 极品颜值美女露脸啪啪| 亚洲精品ady| 视频一区在线免费看| 九九热只有这里有精品| 久久久精品黄色| 国产成人手机在线| 国产成人av网|