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

用Babel和Nodemon搭建一個功能齊全的Node.js開發環境

開發 前端
通過glob的sync方法我們可以遍歷routes目錄并通過require加載路由文件,然后直接注冊到app上,這樣就不用我們手動一個個引入了,是不是非常簡單呢?(雖然這只是個極簡版的服務端封裝,對于實際項目需要做進一步的升級和擴展,但是設計思想希望大家能有所收獲。

前言

筆者最近在工作之余,一直在做數據可視化和nodejs方面的研究,雖然之前的web工作中接觸過nodejs和可視化相關的內容,但是沒有一個系統的總結和回顧,所以為了更深入的研究和復盤我的nodejs和數據可視化之路,筆者將會花兩個月的時間,做一個徹底的復盤.

Node.js是一個事件驅動I/O服務端JavaScript環境,基于Google的V8引擎,V8引擎執行Javascript的速度非常快,性能非常好。

可能很多朋友都或多或少的接觸過nodejs,筆者先來大致總結了一下nodejs的應用領域:

圖片

由上圖可以看出,nodejs的應用前景還是非常廣泛的,前幾年比較火的IOT物聯網技術,nodejs也有一定的領域貢獻.

所以作為一名前端工程師(國際一點的叫法Front-end engineer), 要想讓自己的未來有更多的想象空間,node是必不可少的技能之一.話不多說,接下來筆者將帶大家一步步搭建一個高可用的nodejs開發環境,以便讓大家能更快更好的上手nodejs的開發工作.

你將收獲

  • 如何配置eslint來管理項目代碼規范
  • 如何使用babel7來配置nodejs支持最新的es語法
  • 如何使用nodemon來自動化實現node程序自動重啟
  • 如何劃分node目錄結構實現一個node通用服務類Xoa來實現經典的MVC架構

正文

在介紹正文之前,我想先談談前端項目的管理。就筆者的工作和管理經驗,衡量一個前端項目管理的好壞往往有以下幾個衡量點:

圖片圖片

還原度和功能的完整性這兩個方面可以通過完善的測試體系去把控,對于代碼的擴展性,維護性和可讀性的評定,首先需要由團隊負責人去制定相應的代碼規范和規則,最大限度的保證同一個項目不同模塊的一致性。比如注釋規范,格式規范,目錄結構和文件命名等。其次放眼大局,公司如果有多個項目,或者多個項目會彼此聯系,這時候我們更要從整個前端架構的角度去衡量和設計,所以前端項目不僅僅是泛泛而談,它對企業長遠的產品架構,技術架構上有著非常重要的作用。所以說制定團隊或者項目規范,可以說是項目開始最為關鍵的一步。

1.配置eslint來管理項目代碼規范

圖片圖片

用過eslint的朋友都知道,eslint主要是針對javascript代碼檢測用的插件化工具。它可以約束代碼的書寫格式,語法規范,比如保持代碼一致的縮進,代碼末尾有無分號,使用單引號還是雙引號等,我們通過一系列的配置,將會打造完全一致的代碼寫作風格,這樣對后期的代碼管理和維護有著非常重要的意義。說了這么多,我們看看看怎么使用在我們的nodejs項目中吧。

首先在eslint官網我們可以知道下載和安裝的方式,這里我們采用全局安裝:

npm install eslint --global

然后我們就可以在項目中生成eslint的配置文件了,具體可選擇的配置文件類型有專屬的.eslintrc的靜態json文件, 或者可動態配置的eslintrc.js文件,這里筆者建議采用后者, 在當前項目下生成配置文件的命令如下:

eslint --init

這樣通過命令行的方法我們就可以生成我們想要的eslint配置文件了。首先筆者先上一份簡單的eslint配置文件:

module.exports = {
    "env": {
        "browser": true,
        "node": true,  // 啟用node環境
        "es6": true    // 啟用es6語法
    },
    "extends": "eslint:recommended",
    "globals": {
        "Atomics": "readonly",
        "SharedArrayBuffer": "readonly"
    },
    "parserOptions": {
        "ecmaVersion": 2018,
        "sourceType": "module"
    },
    "rules": {
        "semi": [2, "never"],  // 結尾不能有分號
        "eqeqeq": "warn",  // 要求使用 === 和 !==
        "no-irregular-whitespace": "warn",  // 禁止不規則的空白
        "no-empty-pattern": "warn",  // 禁止使用空解構模式
        "no-redeclare": "warn", // 禁止多次聲明同一變量
        "quotes": ["error", "single"],  // 代碼中使用單引號包裹字符串
        "indent": ["warn", 2],  // 代碼縮進為2個空格
        "no-class-assign": "error",  // 禁止修改類聲明的變量
        "no-const-assign": "error",  // 禁止修改 const 聲明的變量
    }
};

其中rules中鍵的值分別表示:

  • “off” or 0 - 關閉規則
  • “warn” or 1 - 將規則視為一個警告(不會影響退出碼)
  • “error” or 2 - 將規則視為一個錯誤 (退出碼為1)

這里的rule規則大家可以采用市面上已有的規則文件或者可以根據自己的團隊風格自行配置,eslint上有比較全面的規則配置表:

圖片圖片

當我們的配置規則配置完畢后,我們只需要在npm的scripts腳本文件中添加執行代碼,eslint就會自動幫我們校驗代碼:

"scripts": {
    "start": "eslint src && export NODE_ENV=development && nodemon -w src"
  }

上面代碼中eslint src表示對src目錄進行eslint語法規則和格式校驗,如果我們代碼有不符合規范的,那么在控制臺將會顯示相應的錯誤。比如我們代碼中寫了雙引號,則運行項目的時候會出現如下錯誤:

圖片圖片

2.如何使用babel7來配置nodejs支持最新的es語法

我們都知道,nodejs對es的支持還不夠完善,雖然在10.0+已經支持大部分的es語法了,但是最重要的模塊化語法(import,export),類(class)和修飾器(Decorator)還不支持,作為一名有追求的前端工程師,為了讓代碼更優雅更簡潔,我們有理由去用最新的特性去編寫更加強大的代碼,所以完善的es的環境支持是搭建nodejs項目的第二步。

圖片圖片

沒錯,為了實現對es語法更全面的支持,babel是我們的不二選擇。和eslint類似,編寫babel同樣也有幾種編寫配置文件的方式,這里我們還是采用js的方式,這樣的好處是可以根據環境動態配置不同的編譯方式。

我們這里統一采用babel7來給大家介紹如何配置es環境,如果你還在使用babel6或者更低的版本,可以查看對應文檔的版本進行配置。babel7將很多功能都內置到了自己的模塊中,我們首先要配置環境,即preset-env,我們可以使用@babel/preset-env,對于class和Decorator的支持,我們需要安裝@babel/plugin-proposal-class-properties和@babel/plugin-proposal-decorators這兩個模塊。所以我們一共需要安裝如下幾個模塊:

  • @babel/cli
  • @babel/core
  • @babel/node
  • @babel/plugin-proposal-class-properties
  • @babel/plugin-proposal-decorators
  • @babel/preset-env

關于babel的配置機制,官網上也寫的很詳細,大家感興趣的可以看一下,核心就是環境(presets)和插件(plugin)機制。官網對preset-env的解釋如下:

圖片圖片

即@babel/preset-env是一個智能的允許我們使用最新javascript語法的代碼自動轉化工具。同時官網也列出了不同配置屬性對應的不同功能,為了節約篇幅,我們直接上配置的代碼:

module.exports = function (api) {
  api.cache(true)
  const presets = [
    [
      '@babel/preset-env',
      {
        'targets': {
          'node': 'current'
        }
      }
    ]
  ]


  const plugins = [
    ['@babel/plugin-proposal-decorators', { 'legacy': true }],
    ['@babel/plugin-proposal-class-properties', { 'loose' : true }]
  ]


  return {
    presets,
    plugins
  }
}

這也是官方推薦的使用方式,更多靈活的配置大家可以參考官網配置。以上兩個plugin的作用不言而知,一個是用來編譯轉換修飾器屬性的,一個是用來編譯轉換class語法的。最后一步就是在package.json中的腳本文件中使用我們的babel工具:

"scripts": {
    "start": "eslint src && nodemon -w src --exec \"babel-node src\"",
    "build": "babel src --out-dir dist"
  }

babel-node src指定了需要編譯的node目錄為src目錄,其他文件和目錄無需編譯。
通過這樣的配置,我們就能開心的用最新的javascript語法開發nodejs項目了,在代碼編寫完成之后,我們執行npm run build即可將src的代碼打包編譯到dist目錄下。編譯后的代碼如下:

"use strict";


var _glob = _interopRequireDefault(require("glob"));


var _path = require("path");


var _xoa = _interopRequireDefault(require("./lib/xoa.js"));


var _config = _interopRequireDefault(require("./config"));


function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }


const app = new _xoa.default();
app.use((req, res) => {
  console.log(req.url, req.method);
}); // 全局注冊業務接口
// function autoRegister(path, )


_glob.default.sync((0, _path.resolve)(__dirname, './routes/*.js')).forEach(item => {
  app.use(require(item).default);
});
// ...

3.如何使用nodemon來自動化實現node程序自動重啟

nodemon的使用非常簡單,我們只需要按照官網文檔的配置來安裝和使用即可:

npm install --save-dev nodemon

然后在package.json的腳本文件中如下配置:

"scripts": {
    "start": "eslint src && export NODE_ENV=development && nodemon -w src --exec \"babel-node src\"",
    "build": "babel src --out-dir dist",
    "buildR": "node dist",
    "test": "echo \"Error: no test specified\" && exit 1"
  }

nodemon -w src 表示監聽src目錄下的文件變化,一旦文件變化將立刻重新啟動node程序。我們還可以專門寫一個nodemon的配置文件,實現不監聽某一個具體的文件變動,或者其他自定義的配置,如果服務上線,我們還可以用forever和nodemon結合來是實現持久化,當然主流的方式還是pm2.

4.如何劃分node目錄結構實現一個node通用服務類Xoa來實現經典的MVC架構

第四點是本文的核心和關鍵,目錄劃分往往考驗的是程序員對項目和架構的理解程度,對于服務端的目錄結構,筆者的經驗如下:

圖片圖片

具體目錄如下:

圖片圖片

當然不同目錄之間可以進一步細分,這個取決于項目規模。通過對項目有條理的結構化設計,團隊中不同的成員就可以有序的負責不同的模塊了。這種架構模式參考了傳統的mvc的模式,具體還是需要代碼層面進一步控制。

接下來筆者將用原生javascript實現一個簡單的node服務層的封裝,以實現更便捷的node開發,當然在實際項目中我們完全可以采用koa,egg這種成熟的框架來開發node應用,這里筆者只是簡單實現一個例子方便大家對node開發有個更深入的認知。

我們都知道nodejs有http模塊方便我們快速創建一個node服務器,代碼可能長這個樣子:

import { createServer } from 'http'
createServer((req, res) => {
    res.end('hello world!')
}).listen(3000)

這樣就創建了一個簡單的服務器,當我們訪問localhost:3000的話我們就能看到頁面會顯示hello world! 但是我們如果要想實現更復雜的功能,比如根據不同的路由處理不同的邏輯,我們該怎么辦呢?也許你會說直接在createServer的回調中根據req.url來判斷,代碼如下:

import { createServer } from 'http'
createServer((req, res) => {
    if(req.url === 'A') {
        // A的邏輯
    }else if(req.url === 'B') {
        // B的邏輯
    }else if(req.url === 'C') {
        // C的邏輯
    }
    // ...
}).listen(3000)

但是一旦業務邏輯復雜了,路由變多了,我們將寫大量的if else代碼,這對于維護性來說是一種極大的摧毀,我們希望將路由和業務邏輯劃分,分開來管理,這樣對于后期業務邏輯日漸復雜,頁面路由不斷增加才更加容易維護和管理。如何實現這一目標呢?我們可以參考koa的中間件機制,當我們要注冊一個路由時,我們只需要這樣寫:

app.use(routeA)

這樣是不是更優雅一點呢?所以我們基于以上需要來實現一個自己的小型服務框架

圖片圖片

代碼實現如下:

import { createServer } from 'http'


class Xoa {
  constructor() {
    // 初始化中間鍵數組
    this.middleware = []
  }
  // 維持中間鍵數組
  use(func) {
    this.middleware.push(func)
  }
  // 創建服務器實例,并執行相應任務
  createServer() {
    const server = createServer((req, res) => {
      // 應用中間件
      this.middleware.forEach((fn) => fn(req, res))
    })
    return server
  }
  // 服務器監聽
  listen(port = 3000, cb) {
    this.createServer().listen(port, cb)
  }
}


export default Xoa

通過這樣的設計,我們就能優雅的使用中間件語法了:

import Xoa from './lib/xoa.js'


const app = new Xoa()


app.use((req, res) => {
  console.log(req.url, req.method)
  res.end('A')
})


app.use((req, res) => {
  res.end('B')
})


app.listen(3000)

我們再來看另外一種場景,如果我們的路由很多,有負責頁面渲染的路由,也有負責輸出api數據的路由,那么我們要每個都使用use來use一遍,這樣感覺太傻了,作為一個有追求的程序員是不允許這種事情發生的,我們希望這一切都是自動完成的,自動注冊中間件,這該怎么實現呢?
好在node社區提供了一個強大的第三方模塊glob,我們可以通過glob來遍歷目錄實現自動化注冊路由,關于glob的用法這里就不帶大家細說了,用法非常簡單。
比如我們的路由文件有如下幾個:

圖片圖片

我們要保證路由目錄下面的路由文件都有導出,然后在 入口文件中我們可以這么實現:

import glob from 'glob'
import { resolve } from 'path'
import Xoa from './lib/xoa.js'
import config from './config'


const app = new Xoa()


// 全局注冊業務接口
glob.sync(resolve(__dirname, './routes/*.js')).forEach(item => {
  app.use(require(item).default)
})


app.listen(config.serverPort, () => {
  console.log(`服務器地址:${config.protocol}//${config.host}:${config.serverPort}`)
})

通過glob的sync方法我們可以遍歷routes目錄并通過require加載路由文件,然后直接注冊到app上,這樣就不用我們手動一個個引入了,是不是非常簡單呢?(雖然這只是個極簡版的服務端封裝,對于實際項目需要做進一步的升級和擴展,但是設計思想希望大家能有所收獲.

對于負責項目我們可能還會考慮業務邏輯,我們會在service目錄下編寫我們的服務層代碼,在路由文件中使用,也有可能采用到數據庫模塊等,所以說這些都是比較有意思的實現,后面筆者將帶大家繼續做一個全棧項目,來感受node開發的魅力。

注: 本文代碼已傳到github上了,地址:https://github.com/MrXujiang/smart-node-tpl

責任編輯:武曉燕 來源: 趣談前端
相關推薦

2022-06-21 08:52:47

Node.js服務端JavaScript

2022-02-25 08:32:07

nodemon搭Node.jsJavascript

2022-06-05 13:52:32

Node.jsDNS 的原理DNS 服務器

2011-10-25 09:28:30

Node.js

2024-07-12 14:54:48

2014-08-01 10:24:11

2020-08-07 10:40:56

Node.jsexpress前端

2015-03-10 10:59:18

Node.js開發指南基礎介紹

2022-01-07 08:00:00

Node.js開發Web

2025-07-11 08:09:07

Node.jsAPI權限

2021-12-28 20:04:23

Node.js開發JavaScript

2020-10-26 08:34:13

Node.jsCORS前端

2011-10-24 16:16:02

Node.js

2014-07-11 14:16:15

AbsurdJSExpress

2023-11-08 08:23:28

Node版本

2021-01-11 09:00:00

開發Node.js后端

2011-06-17 10:29:04

Nodejavascript

2012-02-02 15:14:29

Node.js

2021-12-13 11:21:46

NodePython開發

2020-10-12 08:06:28

HTTP 服務器證書
點贊
收藏

51CTO技術棧公眾號

色呦哟—国产精品| 台湾佬中文娱乐网欧美电影| 国产中文字幕精品| 久久久久中文字幕| 午夜在线观看一区| 亚洲四虎影院| 亚洲精品视频在线观看免费 | av中文字幕av| 日韩中文字幕综合| 男女性色大片免费观看一区二区 | 亚洲男人天堂2019| 亚洲一区日韩精品| 成人免费观看在线观看| 久久精品视频免费观看| 91久久国产精品91久久性色| 亚洲 欧美 视频| 婷婷精品进入| 亚洲精品国产综合区久久久久久久| 天天干天天综合| www.51av欧美视频| 亚洲欧美韩国综合色| 欧美一区二区三区四区夜夜大片 | 国产亚洲人成a一在线v站| 午夜影院免费版| 久久久人成影片一区二区三区在哪下载 | 久久电影网电视剧免费观看| 98视频在线噜噜噜国产| 精品国产精品国产精品| 欧美日韩一区二区三区视频播放| 亚洲第一网中文字幕| 亚洲一区二区偷拍| 午夜婷婷在线观看| 国产深喉视频一区二区| 午夜一级久久| 久久久久中文字幕2018| 亚洲熟女www一区二区三区| 欧美**字幕| 日韩国产欧美精品在线| 久久久高清视频| 欧美专区一区| 日韩欧美视频一区| 国产aⅴ爽av久久久久| 肉色欧美久久久久久久免费看| 午夜视频一区在线观看| avove在线观看| 日本不卡不卡| 中日韩免费视频中文字幕| 欧美精品一区二区视频| 四虎成人免费在线| 成人h精品动漫一区二区三区| 91在线在线观看| 国产精品嫩草影院精东| 日韩在线一区二区| 国产97人人超碰caoprom| 中文字幕在线欧美| 久久精品女人| 国产精品久久久久久亚洲调教 | 国产v亚洲v天堂无码| aa视频在线免费观看| 久草精品在线观看| 午夜精品一区二区三区电影天堂 | 日本高清视频在线观看| 中文字幕av资源一区| 色一情一乱一伦一区二区三区| 电影在线高清| 国产精品视频一二三| 亚洲高清在线播放| 日本高清中文字幕在线| 亚洲私人黄色宅男| 大西瓜av在线| 亚洲一区资源| 欧美午夜精品久久久久久超碰| 午夜两性免费视频| av在线精品| 精品国产乱码久久久久久图片 | 欧美国产日本视频| 在线综合视频网站| 欧美日韩经典丝袜| 精品人伦一区二区三区蜜桃免费| 麻豆av免费在线| 国产成人精品一区二区三区在线| 在线成人午夜影院| 国产视频精品视频| 国产区精品区| 久色乳综合思思在线视频| 久久精品国产亚洲av麻豆色欲| 在线视频免费在线观看一区二区| 日本不卡免费高清视频| 91pron在线| 欧美成欧美va| 亚洲免费综合| 成人久久一区二区| 天堂在线观看视频| 国产精品区一区二区三区| 青青在线免费视频| 电影一区二区三| 91精品国产综合久久久久久久| 日本黄色大片在线观看| 视频国产一区| 欧美区二区三区| 51国产偷自视频区视频| 久久99精品久久久久久久久久久久| av日韩免费电影| 九色在线免费| 亚洲免费在线电影| 日韩中文字幕组| 日韩精品成人在线观看| 亚洲人成自拍网站| 久久久国产精华液| 蜜桃精品在线观看| 精品麻豆av| 伊人手机在线| 欧美性做爰猛烈叫床潮| 久久久高清视频| 久久精品亚洲人成影院 | 亚洲欧美国产va在线影院| 99久久婷婷国产综合| 久久三级视频| 国产精品播放| 九七久久人人| 婷婷开心激情综合| 黑人巨大猛交丰满少妇| 成人91在线| 26uuu亚洲国产精品| 不卡视频免费在线观看| 国产精品久久久久久久裸模| 各处沟厕大尺度偷拍女厕嘘嘘| 亚洲精品一二三**| 日韩在线播放av| 精品无码一区二区三区的天堂| www.成人网.com| avav在线播放| 91精品一区| 色爱av美腿丝袜综合粉嫩av| 成人免费毛片视频| 北条麻妃一区二区三区| 2021国产视频| 国产免费区一区二区三视频免费 | 麻豆一区二区三| 欧美性色黄大片人与善| 欧美激情网站| 亚洲精品v天堂中文字幕| 免费人成视频在线| 国产高清视频一区| 黄黄视频在线观看| 电影中文字幕一区二区| 久久精品99久久久久久久久| 在线观看日韩一区二区| 中文字幕不卡在线播放| 人人干人人视频| 精品美女久久久| 国产99久久精品一区二区| av女名字大全列表| 日韩欧美精品网址| 91网站免费视频| 三级亚洲高清视频| 日韩中文字幕一区| 成人不卡视频| 日韩视频免费在线| 91麻豆国产视频| 亚洲免费看黄网站| www.四虎精品| 国产日韩精品视频一区二区三区 | www.中文字幕av| 爽好多水快深点欧美视频| 日本一区不卡| 日本中文字幕视频一区| 久久影院模特热| 亚洲欧美高清视频| 懂色av影视一区二区三区| 一级性生活大片| 日韩av不卡一区二区| 一区二区三区四区欧美| 国产免费黄色小视频| 国产精品久久久久av电视剧| 最近2019免费中文字幕视频三 | 精品日韩一区二区三区免费视频| 不卡的免费av| 久久久久久日产精品| 狠狠躁狠狠躁视频专区| 亚洲色图二区| 国内外成人免费视频| 欧美自拍电影| 久久艹在线视频| 亚洲人午夜射精精品日韩| 欧美中文字幕一区二区三区| 99精品久久久久| 成人国产精品免费网站| 久草在在线视频| 欧美激情第二页| 欧美成人综合一区| 麻豆一二三区精品蜜桃| 欧美一级电影在线| 国产视频在线播放| 亚洲精品久久久久中文字幕欢迎你 | 黄色片网站免费| 国产麻豆欧美日韩一区| 1024av视频| 亚洲高清资源在线观看| 久久人人97超碰人人澡爱香蕉| 青娱乐极品盛宴一区二区| 午夜精品一区二区三区在线视| 香蕉视频网站在线观看| 欧美精品一区二区三区在线 | 视频三区二区一区| 97青娱国产盛宴精品视频| 国产精品吹潮在线观看| 激情网站在线| 久久久精品电影| 久蕉依人在线视频| 亚洲成年人影院在线| 97免费观看视频| 色天使色偷偷av一区二区| 国产亚洲第一页| 亚洲欧洲精品成人久久奇米网| 亚洲一区二区三区四区五区六区| 国产在线精品一区二区三区不卡| 国产精品亚洲二区在线观看| 国产精品地址| 中文字幕一区二区三区5566| 要久久电视剧全集免费| 国产欧美一区二区三区不卡高清| 老司机精品视频网| 欧美在线亚洲在线| 国产丝袜在线播放| 久久6免费高清热精品| 日本最黄一级片免费在线| 亚洲人成毛片在线播放| 天堂在线中文| 亚洲国产成人精品女人久久久 | 久久99久久99精品中文字幕| 69久久夜色| 亚洲天堂av电影| 青青久草在线| 日韩成人在线电影网| 人妻精品一区一区三区蜜桃91| 欧美一级爆毛片| 国产精品毛片一区视频播| 欧美日韩mp4| 中文字幕av片| 欧美三级在线播放| 中文字幕第一页在线播放| 日本高清成人免费播放| 国产熟妇一区二区三区四区| 福利微拍一区二区| 日韩精品一区二区亚洲av| 欧美视频在线观看免费| 日本中文字幕第一页| 色猫猫国产区一区二在线视频| 国产又黄又爽又色| 欧美性xxxxxxxxx| 中文字幕亚洲乱码熟女1区2区| 色综合网站在线| 无码人妻丰满熟妇奶水区码| 91黄色在线观看| 中文字幕在线播放av| 欧美日韩精品免费观看视频| 97超碰国产在线| 日韩欧美一区在线观看| 免费国产黄色片| 亚洲美女av在线播放| lutube成人福利在线观看| 中文字幕亚洲一区二区三区| 免费在线观看黄色网| 欧美成年人网站| av资源在线播放| 日本欧美黄网站| а√天堂资源国产精品| 91精品视频在线免费观看| 欧美日韩中出| 久久这里精品国产99丫e6| 精品久久久久久久| 99亚洲精品视频| 伊人精品视频| 成年人在线看片| 亚洲天堂av资源在线观看| 色婷婷国产精品久久包臀| 中文字幕一区在线播放| 欧美三级在线视频| 亚洲av综合色区无码一区爱av | 欧美va亚洲va日韩∨a综合色| www.在线观看av| 亚洲一区二区动漫| 91日韩精品视频| 不卡一卡二卡三乱码免费网站| 中文人妻一区二区三区| 国产精品激情偷乱一区二区∴| 久久伊人成人网| 色哟哟亚洲精品| 99久久国产热无码精品免费| 日韩激情第一页| 香蕉视频国产在线观看| 欧美激情在线狂野欧美精品| 成人视屏在线观看| 97人人模人人爽视频一区二区| 亚洲黄色录像| 国产精品88久久久久久妇女| 香蕉久久夜色精品| 亚洲一区二区中文字幕在线观看| 91美女在线视频| 免费国产羞羞网站美图| 日本丰满少妇一区二区三区| www.com在线观看| 亚洲视频免费一区| 高h视频在线播放| 成人h视频在线| 久久成人高清| 2018日日夜夜| 国产一区欧美二区| 国产综合精品久久久久成人av | 一级特黄免费视频| 精品999在线播放| 久久久久久久久免费视频| 日本久久91av| 日韩美脚连裤袜丝袜在线| 9191国产视频| 久久精品国产亚洲aⅴ| 午夜理伦三级做爰电影| 亚洲小说欧美激情另类| 国产精品久久久久久无人区 | 337p亚洲精品色噜噜| 国产三级电影在线观看| 久久久久久久成人| 日韩精品久久久久久久软件91 | 韩日精品视频| 污污的视频免费观看| 国产欧美一区在线| 精品人妻一区二区三区免费看| 精品国产凹凸成av人导航| 4438x成人网全国最大| 成人xvideos免费视频| 成人三级视频| 午夜激情福利在线| 国产亚洲一二三区| 国产综合精品视频| 日韩av影视综合网| 黄视频网站在线观看| 国产精品伊人日日| 亚洲一级一区| 亚洲欧美综合视频| 亚洲国产精品一区二区www在线| 精品久久久免费视频| 久久中文字幕国产| 精品视频一区二区三区在线观看| 亚洲精品中文综合第一页| 日韩国产精品久久| 欧美aaa级片| 欧美日韩国产小视频| 欧美成人hd| 成人国产精品日本在线| 亚洲激情中文| 美女又黄又免费的视频| 亚洲已满18点击进入久久| 亚洲黄色小说网址| 性欧美暴力猛交69hd| 欧美激情网址| 免费大片在线观看| 亚洲国产精品v| 国产欧美一级片| 欧美国产高跟鞋裸体秀xxxhd| 91蝌蚪精品视频| 国产精品国产亚洲精品看不卡 | 波多野结衣喷潮| 欧美一区二区成人| 超碰在线最新网址| 蜜桃视频日韩| 免费在线看成人av| 欧美偷拍第一页| 亚洲第一黄色网| 另类激情视频| 在线不卡视频一区二区| 国产成人免费在线| 天天操天天操天天操天天| 亚洲无线码在线一区观看| 欧美男男gaygay1069| 免费的一级黄色片| 久久亚洲精品国产精品紫薇| 正在播放木下凛凛xv99| 欧美情侣性视频| 国产欧美日韩精品一区二区免费 | 亚洲天堂免费在线观看视频| 国产成人av免费看| 97成人精品视频在线观看| 精品成人影院| 日本成人在线免费| 91久久人澡人人添人人爽欧美 | 一区二区久久久| 日本中文字幕电影在线观看| 国产噜噜噜噜噜久久久久久久久 | 三级a在线观看| 一区二区三区精品| 精品亚洲综合| av免费精品一区二区三区| 视频一区二区三区中文字幕| 免费中文字幕在线| 亚洲欧洲国产伦综合| 日韩欧美中文字幕一区二区三区| 欧美成人免费高清视频| 亚洲亚洲人成综合网络| 91精彩视频在线播放|