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

深入對比 Eslint 插件 和 Babel 插件的異同點

開發(fā) 前端
babel 是通過 path 的 api 對 AST 進行增刪改,而 eslint 是通過 sourceCode 的 api 進行代碼格式的檢查,通過 fixer 的 api 進行修復。

[[421210]]

babel 和 eslint 都是基于 AST 的,一個是做代碼的轉(zhuǎn)換,一個是做錯誤檢查和修復。babel 插件和 eslint 插件都能夠分析和轉(zhuǎn)換代碼,那這倆到底有啥不同呢?

本文我們來探究下 babel 插件和 eslint 插件差別在哪里。

babel 插件

babel 的編譯流程分為 parse、transform、generate 3 步,可以指定插件,在遍歷 AST 的時候會合并調(diào)用 visitor。

比如我們寫一個在 console.xx 的參數(shù)插入文件名 + 行列號的插件:

對函數(shù)調(diào)用節(jié)點(CallExpression)的 callee 屬性進行檢查,如果是 console.xx 的 api,則在 arguments 中插入一個 StringLiteral 的字符串字面量節(jié)點,值為文件名 + 行列號。

  1. const targetCalleeName = ['log''info''error''debug'].map(item => `console.${item}`); 
  2.  
  3. const parametersInsertPlugin = ({ types }, options) => { 
  4.     return { 
  5.         visitor: { 
  6.             CallExpression(path, state) { 
  7.                 const calleeName = path.get('callee').toString() 
  8.                 if (targetCalleeName.includes(calleeName)) { 
  9.                    const { line, column } = path.node.loc.start; 
  10.                    path.node.arguments.unshift(types.stringLiteral(`${options.file.filename}: (${line}, ${column})`)) 
  11.                } 
  12.             } 
  13.         } 
  14.     } 
  15. module.exports = parametersInsertPlugin; 

然后使用 babel core 的 api 進行代碼編譯,并調(diào)用插件:

  1. const { transformFileSync } = require('@babel/core'); 
  2. const insertParametersPlugin = require('./plugin/parameters-insert-plugin'); 
  3. const path = require('path'); 
  4.  
  5. const inputFilePath = path.join(__dirname, './sourceCode.js'); 
  6.  
  7. const { code } = transformFileSync(inputFilePath, { 
  8.     plugins: [insertParametersPlugin], 
  9.     parserOpts: { 
  10.         sourceType: 'unambiguous'
  11.         plugins: ['jsx'
  12.     } 
  13. }); 
  14.  
  15. console.log(code); 

當源碼為下面的代碼時:

  1. console.log(1); 
  2.  
  3. function func() { 
  4.     console.info(2); 
  5.  
  6. export default class Clazz { 
  7.     say() { 
  8.         console.debug(3); 
  9.     } 
  10.     render() { 
  11.         return <div>{console.error(4)}</div> 
  12.     } 

 目標代碼為:

可以看到,在 console.xx 的 api 調(diào)用處插入了文件名和行列號的參數(shù)。

這就是一個 babel 插件做代碼轉(zhuǎn)換的例子。

我們從中能總結(jié)出 babel 插件的特點:

  • 插件的形式是函數(shù)返回一個對象,對象的 visitor 屬性聲明對什么節(jié)點做什么處理
  • visitor 函數(shù)可以通過 path 的 api 來對 ast 增刪改
  • 修改后的 ast 會打印成目標代碼

eslint 插件

eslint 插件也會對代碼進行 parse,查找要檢查的 AST,之后進行檢查和報錯,但不一定會修復代碼,只有指定了 fix 才會進行修復。

我們寫一個檢查對象格式的 eslint 插件。

需求時把下面的代碼格式進行檢查和修復:

  1. const  obj = { 
  2.     a: 1,b: 2, 
  3.  
  4.     c: 3 

變成這種:

  1. const  obj = { 
  2.     a: 1, 
  3.     b: 2, 
  4.     c: 3 

eslint 是可以查找某個 AST 關(guān)聯(lián)的 token 的,也就是我們可以拿到對象的每一個屬性開始和結(jié)束的 token 還有行列號,

我們要校驗上一個屬性結(jié)束的 token 的行號要等于下一個屬性開始的 token 的行號。

所以就是這樣寫:

指定對 ObjectExpression 也就是 {} 表達式的每一個屬性的開始和結(jié)束 token 的行號做檢查,如果不是下一個屬性是上一個屬性的 +1 行,那就報錯。

并且,還可以指定如何修復,我們這里的錯誤的修復方式就是把兩個 token 之間的部分替換為換行符(os.EOL) + tab。

  1. const os = require('os'); 
  2.  
  3. module.exports = { 
  4.      meta: { 
  5.          fixable: true 
  6.      }, 
  7.      create(context) { 
  8.          const sourceCode = context.getSourceCode(); 
  9.          return { 
  10.             ObjectExpression(node) { 
  11.                 for (let i = 1; i < node.properties.length; i ++) { 
  12.                      const firstToken = sourceCode.getTokenAfter(node.properties[i - 1]); 
  13.                      const secondToken = sourceCode.getFirstToken(node.properties[i]); 
  14.                      if(firstToken.loc.start.line !== secondToken.loc.start.line - 1) { 
  15.                         context.report({ 
  16.                             node, 
  17.                             message: '對象屬性之間不能有空行'
  18.                             loc: firstToken.loc, 
  19.                             *fix(fixer) { 
  20.                                 yield fixer.replaceTextRange([firstToken.range[1],secondToken.range[0]], os.EOL + '\t'); 
  21.                             } 
  22.                         }); 
  23.                      } 
  24.                       
  25.                 } 
  26.              } 
  27.          }; 
  28.      } 
  29.  }; 

這樣就完成了對象格式的檢查和自動修復。

這個插件文件名命名為 object-property-format,然后我們使用 api 的方式調(diào)用下:

首先,引入 eslint 模塊,創(chuàng)建 ESLint 對象:

  1. const { ESLint } = require("eslint"); 
  2.  
  3. const engine = new ESLint({ 
  4.     fix: false
  5.     overrideConfig: { 
  6.         parser: '@babel/eslint-parser'
  7.         parserOptions: { 
  8.             sourceType: "unambiguous"
  9.             requireConfigFile: false
  10.         }, 
  11.         rules: { 
  12.             "object-property-format""error" 
  13.         } 
  14.     }, 
  15.     rulePaths: ['./'], 
  16.     useEslintrc: false 
  17. }); 

這里把配置文件關(guān)掉(useEslintrc: false),只用這里的的配置(overrideConfig)。

我們指定用 babel 的 parser(@babel/eslint-parser),并且不需要 babel 配置文件。之后引入剛才我們寫的那個 rule,也就是 object-property-format,報錯級別設置為 error。

還需要指定 rulePaths,也就是告訴 eslint 去哪里查找 rule。

之后,我們調(diào)用 lintText 的 api 進行 lint:

  1. (async function main() { 
  2.   const results = await engine.lintText(` 
  3.   const  obj = { 
  4.         a: 1,b: 2, 
  5.  
  6.         c: 3 
  7.     } 
  8.   `); 
  9.  
  10.   console.log(results[0].output); 
  11.  
  12.   const formatter = await engine.loadFormatter("stylish"); 
  13.   const resultText = formatter.format(results); 
  14.   console.log(resultText); 
  15. })() 

對于結(jié)果,我們使用內(nèi)置的 formater 格式化了一下。

用 node 執(zhí)行,結(jié)果如下:

可以看到,eslint 檢查出了對象格式的兩處錯誤。

為什么沒有修復呢?因為沒開啟 fix 啊,eslint 需要開啟 fix 才會修復代碼。

把 Eslint 的 fix option 修改為 true,再試一下:

可以看到,沒有報錯了,而且代碼也進行了修復。

這就是一個 eslint 插件做代碼格式檢查和修復的例子。

我們從中總結(jié)出 eslint 插件的 rule 的特點:

  • rule 的形式是對象,create 屬性是一個函數(shù),返回一個對象,指定對什么 AST 做什么檢查和修復
  • AST 處理函數(shù)可以通過 context 的 api 來拿到源碼不同位置的 token 來進行格式的檢查
  • fix 函數(shù)可以拿到 fixer 的 api,來對某個位置的代碼進行字符的增刪改
  • 默認不會修復代碼,需要指定 fix 才會進行修復

eslint 插件和 babel 插件的異同

我們把總結(jié)的 babel 插件和 eslint 插件的特點拿到一起對比下。(這里的 eslint 插件嚴格來說是指的 eslint 的 rule,eslint 插件可以包含多個 rule。)

babel 插件:

  • 插件的形式是函數(shù)返回一個對象,對象的 visitor 屬性聲明對什么節(jié)點做什么處理
  • visitor 函數(shù)可以通過 path 的 api 來對 ast 增刪改
  • 修改后的 ast 會打印成目標代碼

eslint 插件:

  • rule 的形式是對象,create 屬性是一個函數(shù),返回一個對象,指定對什么 AST 做什么檢查和修復
  • AST 處理函數(shù)可以通過 context 的 api 來拿到源碼不同位置的 token 來進行格式的檢查
  • fix 函數(shù)可以拿到 fixer 的 api,來對某個位置的代碼進行字符的增刪改
  • 默認不會修復代碼,需要指定 fix 才會進行修復

我們來對比下兩者的異同:

  • 從形式上來說,eslint 的 rule 是對象-函數(shù)-對象的形式,而 babel 插件是函數(shù)-對象的形式,多的部分是 eslint rule 的元信息,也就是 meta 屬性。這是兩者設計上的不同。
  • babel 插件和 eslint rule 都可以遍歷節(jié)點,指定對什么節(jié)點做處理,但是 babel 插件可以通過 path 的 api 來增刪改 AST,而 eslint 則是通過 context.getSourceCode() 拿到 sourceCode,然后通過 sourceCode 的 api 進行格式的檢查,最后修復還要通過 fixer 的 api。
  • babel 插件的改動默認就是生效的,最多傳入 options 進行控制,而 eslint 的 fix 功能只有開啟才生效。

eslint 的 AST 中記錄了在源碼中 range 信息,可以根據(jù) range 信息查找 token,但其實 babel 也可以,babel parser 也可以指定 ranges、tokens。

也就是說理論上基于 babel 完全可以實現(xiàn) eslint 的功能,只不過兩者 api 設計上的不同,導致了兩者適合的場景不同。

  • babel 是通過 path api 進行 AST 增刪改,適合做代碼分析和轉(zhuǎn)換。
  • eslint 是通過 sourceCode 和 fixer api 進行代碼格式的檢查和 fix,適合做錯誤檢查和修復。

但是,從本質(zhì)上來說,兩者編譯流程上差別并不大。

總結(jié)

我們寫了一個在 console.xx api 插入?yún)?shù)的 babel 插件,又寫了一個檢查和修復對象格式的 eslint 插件,分析了兩者的特點,然后做了下對比。

兩者插件形式上不同,api 也不同:

babel 是通過 path 的 api 對 AST 進行增刪改,而 eslint 是通過 sourceCode 的 api 進行代碼格式的檢查,通過 fixer 的 api 進行修復。這就導致了 babel 插件更適合做代碼轉(zhuǎn)換,eslint 插件更適合做代碼格式的校驗和修復。但實際上 babel 也能做到 eslint 一樣的事情,兩者本質(zhì)上的編譯流程是差不多的。

這篇文章把 babel 插件和 eslint 插件放到一起進行了對比,講述了兩者本質(zhì)的相同和 api 的不同,希望能夠幫大家更好的掌握 babel 和 eslint 插件。

 

責任編輯:姜華 來源: 神光的編程秘籍
相關(guān)推薦

2021-09-02 16:15:29

開發(fā)技能代碼

2021-11-19 23:54:19

插件Eslint

2009-11-06 10:11:34

WCF和Web Ser

2009-12-18 15:23:03

Vista和XP路由設

2015-05-22 09:49:25

2021-10-13 22:19:16

插件Babel import

2012-12-07 10:56:32

2010-06-13 09:18:28

UML依賴

2021-09-11 19:46:14

配置

2009-12-29 15:56:57

2022-01-18 18:46:55

Eslint抽象語法樹Babel

2022-07-18 14:18:26

Babel代碼面試

2022-09-30 15:46:26

Babel編譯器插件

2012-11-22 13:02:24

jQuery插件Web

2009-11-10 11:25:35

VB.NET與Basi

2021-06-22 06:52:46

Vite 插件機制Rollup

2009-12-11 10:29:03

PHP插件機制

2010-08-11 16:37:47

DB2數(shù)據(jù)庫

2021-09-05 11:37:31

Eslint插件Vue

2009-11-11 13:59:15

ADO.NET與ADO
點贊
收藏

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

久久久99久久| 日本中文字幕一区| 亚洲激情自拍图| 国产成人精品无码播放| 日本在线免费| 成人免费视频网站在线观看| 日本在线精品视频| 好吊日在线视频| 日韩中文av| 在线成人免费观看| 伊人成色综合网| 麻豆网站在线| 久久在线观看免费| 91亚洲国产精品| 区一区二在线观看| 欧美天堂亚洲电影院在线观看| 亚洲视频999| 国产大尺度视频| 福利一区二区| 欧美日韩在线第一页| 日韩精品一区二区三区电影| 蜜桃视频在线免费| 成人自拍视频在线观看| 国产日韩中文在线| 国产精品熟女视频| 日韩视频不卡| 欧美多人乱p欧美4p久久| 成人在线手机视频| 日韩美脚连裤袜丝袜在线| 日韩视频一区在线观看| 男女无套免费视频网站动漫| 97蜜桃久久| 亚洲精品国产第一综合99久久| 欧美日韩精品免费观看| 色窝窝无码一区二区三区| 精品一区二区在线观看| 国产精品男女猛烈高潮激情| 波多野结衣国产| 在线精品亚洲| 欧美激情女人20p| 九九视频在线观看| 久久久久蜜桃| 久热99视频在线观看| 在线免费看视频| 精品国产精品国产偷麻豆| 亚洲欧美日韩网| 久久精品国产亚洲av麻豆| 超碰成人免费| 亚洲国产中文字幕久久网| 无码人妻丰满熟妇区毛片蜜桃精品| 24小时成人在线视频| 欧美日韩aaa| 99日在线视频| 国产日本亚洲| 日韩一级片网址| 国产老头和老头xxxx×| 日韩国产在线不卡视频| 欧美精品一二三四| 国产黄色一区二区三区| 精品国产一区二区三区2021| 欧美一区二区精美| 久久无码专区国产精品s| 99精品国产一区二区三区2021| 欧美大片在线观看| 国产精品无码专区| 国产99久久| 在线观看视频99| 日韩精品123区| 欧美伊人久久| 91精品国产91久久久| 91在线视频在线观看| 久久激情一区| 国产日韩欧美日韩大片| 国产人妻精品一区二区三区| 成人性色生活片免费看爆迷你毛片| 成人高清在线观看| 视频三区在线观看| 日本一区二区免费在线观看视频 | 中文天堂在线视频| 久久成人免费日本黄色| 999精品视频一区二区三区| 欧美视频一二区| 91丨porny丨首页| 亚洲欧美综合一区| 性欧美ⅴideo另类hd| 偷偷要91色婷婷| 福利在线一区二区三区| 国产一区二区三区亚洲综合| 亚洲成人av片| 日本裸体美女视频| 亚洲毛片在线| 国产日韩欧美在线观看| 亚洲男人天堂久久| 中文字幕av一区二区三区高 | 久久综合九色99| 在线观看麻豆蜜桃| 亚洲成人高清在线| 色国产在线视频| 精品自拍偷拍| 最近的2019中文字幕免费一页| 久久久久亚洲AV成人| 久久激情综合| 岛国一区二区三区高清视频| 国产女主播在线写真| 一区二区三区精品久久久| 成人免费观看毛片| 九九99久久精品在免费线bt| 亚洲精品久久久久久久久久久久久| 亚洲图片第一页| 亚洲经典自拍| 91麻豆桃色免费看| 男同在线观看| 亚洲国产美女搞黄色| 小泽玛利亚视频在线观看| 欧美激情99| 欧美激情a∨在线视频播放| 中文字幕激情视频| 久久综合久久综合久久| 久久久99精品视频| 亚洲精品成a人ⅴ香蕉片| 亚洲码在线观看| 久久丫精品久久丫| 国精产品一区一区三区mba视频 | 国产66精品久久久久999小说| 国产毛片在线看| 欧美日韩免费看| 国产免费无码一区二区| 天天超碰亚洲| 国产精品亚洲аv天堂网| 青青草在线免费观看| 亚洲成人一区在线| 亚洲最大视频网| 伊人色**天天综合婷婷| 国产日韩欧美另类| 视频三区在线| 欧美日韩精品一区二区在线播放| 精品国产av无码| 免费欧美在线| 欧美1o一11sex性hdhd| 日本蜜桃在线观看视频| 亚洲电影在线观看| 国产在线一二区| 成人h精品动漫一区二区三区| 91精品国产毛片武则天| 精品麻豆剧传媒av国产九九九| 色老头一区二区三区在线观看| 久久久久久亚洲av无码专区| 久久久九九九九| 一本久道综合色婷婷五月| 日韩中文av| 国产精品久久9| 超碰国产在线| 欧美高清你懂得| 免费成人深夜夜行网站| 国产精品88888| 精品久久久久久无码中文野结衣| caoporn成人| 91爱视频在线| 国产精品视频一区二区久久| 欧美在线观看视频一区二区 | 国产精品一区二区性色av| 91精彩在线视频| 91精品免费观看| 岛国毛片在线观看| 波多野结衣中文一区| 能在线观看的av| 欧美精品久久久久久| 成人免费自拍视频| 色婷婷在线播放| 国产视频精品自拍| 在线免费看91| 一区二区在线电影| 黄色性生活一级片| 日韩电影在线一区二区三区| 丰满女人性猛交| 成午夜精品一区二区三区软件| 国语自产偷拍精品视频偷| 视频三区在线观看| 欧美精品精品一区| 日韩av免费网址| 国产欧美日本一区二区三区| 三级性生活视频| 亚洲夜间福利| 天堂社区 天堂综合网 天堂资源最新版 | 99热这里只有精品5| 午夜精品久久久久久久99水蜜桃| 公侵犯人妻一区二区三区| 美女爽到高潮91| 免费人成自慰网站| 精品国产精品国产偷麻豆| 51精品国产人成在线观看 | 婷婷综合五月天| 刘亦菲国产毛片bd| 成人h动漫精品一区二区| 99视频在线免费| 欧美午夜免费影院| 亚洲精品一区二区三区四区五区| 6080成人| 国产日韩欧美在线观看| 精精国产xxxx视频在线野外| 最近2019中文免费高清视频观看www99| www.av黄色| 欧美日韩亚洲综合在线| 日本系列第一页| 亚洲色图视频免费播放| 午夜在线观看一区| 成人黄色777网| 在线看免费毛片| 久久国产精品久久久久久电车| 久久久久久久久久久久久国产| 久久av导航| 国产精品区二区三区日本| 国产精品伊人| 日本午夜精品理论片a级appf发布| 污污的网站在线看| 日韩中文字幕av| 日韩国产福利| 亚洲第一福利在线观看| 国产av精国产传媒| 在线播放91灌醉迷j高跟美女 | av美女在线观看| 久久精品人人爽| 成人激情电影在线看| 日韩高清不卡av| 免费看黄网站在线观看| 日韩欧美不卡在线观看视频| 亚洲网站在线免费观看| 色综合久久久网| 亚洲国产成人无码av在线| 亚洲va天堂va国产va久| 中文字幕手机在线观看| 国产精品久久久久影院| 欧美 日韩 成人| 国产欧美一区二区精品性色| 国产白嫩美女无套久久| 成人99免费视频| 黄色激情在线观看| 成人午夜在线免费| 无码任你躁久久久久久老妇| 国产酒店精品激情| 国模大尺度视频| 国产精品123区| gogo亚洲国模私拍人体| 国产成人免费xxxxxxxx| 久久久国产精品久久久| 国产高清亚洲一区| xfplay5566色资源网站| 成av人片一区二区| 最近日本中文字幕| 91一区二区在线| 久久精品国产亚洲av麻豆| 91免费小视频| 级毛片内射视频| 国产精品久久看| 婷婷在线精品视频| 一区二区免费看| 日韩精品一区三区| 欧美日韩国产一区二区三区| 色一情一乱一伦| 欧美性色欧美a在线播放| 亚洲在线视频播放| 日韩一区二区视频在线观看| 黄色片一区二区| 亚洲精品福利在线| 黄色在线播放| 色悠悠久久久久| 深夜国产在线播放| 91av在线不卡| 日本h片久久| 91原创国产| 亚洲精品国模| 亚洲欧洲日韩综合二区| 欧美成人高清| 男人天堂999| 另类专区欧美蜜桃臀第一页| 亚洲欧美一区二区三区不卡| 成人国产精品视频| mm131丰满少妇人体欣赏图| 国产精品国产自产拍高清av| 懂色av懂色av粉嫩av| 亚洲美女免费视频| 4438国产精品一区二区| 欧美精品亚洲二区| 欧美一级特黄aaaaaa| 亚洲香蕉成人av网站在线观看| 国产精品一区二区三区视频网站| 久久久久久久久久国产| 九九九伊在线综合永久| 91在线播放视频| 波多野结衣的一区二区三区| 成人在线免费高清视频| 天堂影院一区二区| 韩国三级hd中文字幕有哪些| 久久久久久免费网| 麻豆亚洲av熟女国产一区二| 色拍拍在线精品视频8848| 精品久久久久久亚洲综合网站| 日韩激情第一页| 91精品久久久久久粉嫩| 欧美亚洲视频在线观看| 精品国产亚洲一区二区三区| 欧美一区二区三区四区在线观看地址 | 三级欧美日韩| 亚洲免费不卡| 香蕉成人久久| 国产乱淫av麻豆国产免费| 国产精品乱码人人做人人爱| 国产成人在线免费观看视频| 91精品国产欧美一区二区| 久久国产精品高清一区二区三区| 九九九热精品免费视频观看网站| 秋霞国产精品| 久久精品国产美女| 狠狠综合久久| 91性高潮久久久久久久| 亚洲国产精品激情在线观看| 日本少妇bbwbbw精品| 欧美一级淫片007| 天天在线视频色| 国产精品成人一区二区三区吃奶| 欧美国产极品| 97超碰国产精品| 国产精品18久久久久久久久 | 超碰最新在线| 国产日韩精品在线| 成人影院在线| 黄色片在线免费| 久久精品一区八戒影视| 91在线看视频| 亚洲精品理论电影| 国产自产自拍视频在线观看| 超碰97人人在线| 欧美99在线视频观看| 久久综合在线观看| 亚洲免费观看在线观看| a级片在线播放| 欧美成人精品在线视频| 国产精品一区二区三区www| 一区二区三区国产福利| 麻豆成人免费电影| sm捆绑调教视频| 91精品午夜视频| 成人无遮挡免费网站视频在线观看| 国产热re99久久6国产精品| 色综合天天综合网中文字幕| www.夜夜爽| 亚洲视频小说图片| www夜片内射视频日韩精品成人| 久久亚洲国产精品| 欧美另类中文字幕| www精品久久| 久久久久88色偷偷免费| 成人免费一级片| 日韩资源在线观看| 精品视频一区二区三区在线观看| 香蕉视频免费版| 粉嫩一区二区三区在线看| 日韩精品在线不卡| 亚洲乱码av中文一区二区| 成人在线免费av| 男女h黄动漫啪啪无遮挡软件| 国产一区二区视频在线| 欧美人与禽zozzo禽性配| 精品福利一区二区三区 | 国产日本欧美一区二区三区在线| 欧美电影《睫毛膏》| 一级黄色免费毛片| 激情成人在线视频| 国产系列电影在线播放网址| 国产日韩欧美视频| 国内精品久久久久久久影视麻豆| 波多野结衣视频播放| 在线精品视频一区二区| 91精品国产91久久久久久青草| 国产精品加勒比| 日日夜夜一区二区| 暗呦丨小u女国产精品| 亚洲成人免费在线视频| 日本国产欧美| 欧美在线观看视频免费| 久久婷婷国产综合精品青草 | 992tv国产精品成人影院| 强伦女教师2:伦理在线观看| 成人精品国产福利| 高潮无码精品色欲av午夜福利| 久久影视电视剧免费网站| 青青久久av| 国产精品嫩草影视| 色八戒一区二区三区| 四虎亚洲精品| 午夜精品一区二区三区在线观看| 国产精品一区久久久久| av片免费观看| 久久免费视频在线观看| 日韩精品电影| 国产精品300页| 欧美一区二区三区公司| 免费看av不卡| 欧美日韩午夜爽爽| 中文字幕不卡一区|