精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

av免费在线观看不卡| 久久亚洲AV成人无码国产野外| 成年人在线观看| 爽好多水快深点欧美视频| 精品视频—区二区三区免费| 日韩网址在线观看| www 日韩| 国产成人av一区二区三区在线观看| 久久久久久久久久久网站| 亚洲成人日韩在线| 国产视频一区二区在线播放| 亚洲va中文字幕| 深田咏美在线x99av| 国产精品探花视频| 日韩香蕉视频| 久久天天躁狠狠躁夜夜躁 | 成人性生活视频| 亚洲欧美偷拍卡通变态| 精品一区二区日本| 亚洲一级片免费看| 亚洲国产国产亚洲一二三| 中文国产亚洲喷潮| 污污免费在线观看| va天堂va亚洲va影视| 狠狠色狠色综合曰曰| 亚洲国产精品女人| 久久精品a一级国产免视看成人 | 欧美成人片在线| 国产在线精品免费| 日韩av高清不卡| 欧美日韩一级在线观看| 久草成人在线| 精品免费国产一区二区三区四区| 亚洲天堂av线| 桃色av一区二区| 亚洲乱码日产精品bd| 秋霞在线观看一区二区三区| 黄色小视频免费在线观看| 久久黄色级2电影| 国产精品va在线播放| 中文字幕一区二区三区精品| 午夜日韩福利| 色婷婷成人综合| 91视频在线网站| 精品综合久久88少妇激情| 欧美一区二区视频观看视频| www.日本xxxx| 国模套图日韩精品一区二区| 亚洲一区二区三区影院| 91精品国产毛片武则天| 欧美被日视频| 国产精品嫩草99a| 欧美人与物videos另类| 蜜桃视频在线入口www| av电影在线观看不卡| 国产精品18毛片一区二区| 97久久人国产精品婷婷 | 久久6免费视频| 国产第一精品| 欧美日韩视频在线一区二区| 色多多视频在线播放| 日韩av中字| 日韩欧美第一页| 91黄色在线看| av成人影院在线| 五月天亚洲婷婷| 人妻熟妇乱又伦精品视频| 女海盗2成人h版中文字幕| 婷婷久久综合九色国产成人 | 水野朝阳av一区二区三区| 欧美一级电影久久| 免费污污视频在线观看| 久久午夜激情| 国产精品一区二区久久久久| 91激情在线观看| 国产精品一区久久久久| 99一区二区三区| 三区在线观看| 国产片一区二区三区| 亚洲一区二区三区免费看| 黄色精品免费看| 一区二区三区国产精品| 三上悠亚久久精品| 欧美成人ⅴideosxxxxx| 欧美精选午夜久久久乱码6080| 欧美丝袜在线观看| 一区二区三区亚洲变态调教大结局 | 成人一区二区三区视频 | 国产欧美日韩一区二区三区四区| 国产一区二区三区免费视频| 中国特黄一级片| 欧美在线视屏| 奇门遁甲1982国语版免费观看高清 | 久久电影中文字幕| 中文字幕一区在线观看| 国产尤物av一区二区三区| 9999在线视频| 欧美最新大片在线看| aaaaaaaa毛片| japanese色系久久精品| 一本色道久久88综合日韩精品| 成人在线观看小视频| 一本一本久久| 国产一区玩具在线观看| 无码精品在线观看| 国产精品久久久一本精品| 国产黄色激情视频| 日韩国产网站| 亚洲第一精品电影| 国产黄a三级三级| 日韩图片一区| 91最新国产视频| 美国成人毛片| 亚洲一区在线播放| 亚洲 激情 在线| 免费看成人人体视频| 日韩中文字幕在线看| 日韩成年人视频| 国产资源在线一区| 久久久久久国产精品免费免费| 黄色网在线免费观看| 欧美性xxxxxxxxx| 久久久久中文字幕亚洲精品| 欧美日韩国产一区二区三区不卡| 久久久免费精品视频| 97超碰资源站| 国产欧美一区二区在线观看| 久久久久久久久久久99| 国产午夜久久av| 在线日韩精品视频| 二区视频在线观看| 国产91精品一区二区| 亚洲一区免费看| 欧美成人性网| 日韩经典第一页| 久久久久久久蜜桃| 国产一区 二区 三区一级| 欧美亚洲免费在线| 黄色视屏在线免费观看| 日韩久久免费av| 在线免费看av网站| 精品一区二区国语对白| 午夜老司机精品| 色豆豆成人网| 亚洲欧美日韩中文视频| 久久久久久久久久影院| av综合在线播放| 日本人体一区二区| 91久久精品无嫩草影院 | 手机看片日韩av| 久久国产毛片| 欧美极品色图| 日韩欧美看国产| 亚洲欧洲一区二区三区在线观看| 中日韩黄色大片| 99re亚洲国产精品| 日韩精品―中文字幕| 亚洲精品国模| 日韩免费观看av| 国产免费av高清在线| 色香蕉成人二区免费| 一区二区黄色片| 美国毛片一区二区| 一本二本三本亚洲码| 精品国产亚洲一区二区三区在线 | 久久午夜精品视频| 青娱乐精品视频| 伊人久久大香线蕉av一区| 玖玖精品在线| 不卡伊人av在线播放| 成人高潮片免费视频| 亚洲国产视频一区二区| 久久久午夜精品福利内容| 在线欧美亚洲| 欧美一区二区高清在线观看| 草莓视频成人appios| 另类色图亚洲色图| 国精品人妻无码一区二区三区喝尿 | cao在线视频| 精品偷拍一区二区三区在线看| 国产高清中文字幕| 欧美高清在线精品一区| 国产资源中文字幕| 日韩视频不卡| 四虎一区二区| 欧美一级大片在线视频| 午夜免费在线观看精品视频| 九色在线免费| 91精品国产高清一区二区三区蜜臀| 久青草免费视频| 久久日一线二线三线suv| 午夜久久久精品| 亚洲午夜在线| 色狠狠久久av五月综合| 欧美a级大片在线| 欧美在线性爱视频| 欧美性videos| 亚洲电影天堂av| 中文字幕在线2019| 亚洲一区二区三区在线播放| 少妇无套高潮一二三区| 丁香啪啪综合成人亚洲小说| 成人免费xxxxx在线视频| 欧美国产精品| 日本一区二区三区四区高清视频| 久久影院一区二区三区| 欧美一级电影免费在线观看| 1区2区3区在线视频| 亚洲欧洲国产一区| www.黄色片| 欧美综合在线视频| 亚洲免费在线观看av| 亚洲女子a中天字幕| 精品亚洲aⅴ无码一区二区三区| 成人成人成人在线视频| 亚洲精品综合在线观看| 久久午夜影视| 欧美日韩激情四射| 日韩欧美午夜| 欧美精品久久久| 91成人精品在线| 91久久国产精品| 性欧美hd调教| 97色在线观看免费视频| av毛片在线看| 深夜福利亚洲导航| 男男电影完整版在线观看| 精品国内片67194| 国产又大又粗又硬| 欧美日免费三级在线| 欧美亚洲另类小说| 精品国产乱码久久久久酒店| 欧美成人黄色网| 亚洲激情成人在线| 我要看一级黄色录像| 欧美国产1区2区| 日韩不卡av在线| 国产婷婷精品av在线| 大黑人交xxx极品hd| 99久久综合精品| 日本五十肥熟交尾| 成人一区二区三区视频| 波多野结衣三级视频| 国产一区二区调教| www.色就是色.com| 久久99精品国产| 日韩av.com| 韩国av一区二区三区四区| 中文字幕精品一区二区三区在线| 久99久精品视频免费观看| 美女一区二区三区视频| 日韩二区三区在线观看| 日本中文字幕高清| 蜜臀av一级做a爰片久久| 91人人澡人人爽人人精品| 喷水一区二区三区| 午夜久久久精品| 国内一区二区视频| 男男受被啪到高潮自述| 国产在线精品一区二区不卡了| 在线视频日韩欧美| 国产成人av资源| 又黄又爽的网站| 91色综合久久久久婷婷| 欧美 变态 另类 人妖| 久久精品亚洲国产奇米99| jizz中文字幕| 亚洲欧洲三级电影| 欧美色图亚洲天堂| 午夜精品福利一区二区三区蜜桃| 99久热在线精品996热是什么| 欧美特级www| 91porny九色| 欧美精品三级日韩久久| 精品国产亚洲一区二区麻豆| 亚洲福利视频网站| 久草在线青青草| 久久久国产一区二区三区| 天天干在线视频论坛| 97视频人免费观看| 久久久成人av毛片免费观看| 成人亚洲综合色就1024| 极品国产人妖chinesets亚洲人妖| 久久视频在线观看中文字幕| 日韩理论在线| www.av91| 日本亚洲最大的色成网站www| 91香蕉国产线在线观看| jizz一区二区| 9.1片黄在线观看| 亚洲综合区在线| 国产成人精品777777| 5月丁香婷婷综合| 日韩性xxxx| 最近中文字幕2019免费| 国产精品一区hongkong| 国产精品高清在线观看| 亚洲乱码一区| 日韩av大全| 亚洲五月婷婷| 天堂av2020| 久久久另类综合| 免费中文字幕视频| 精品视频一区二区不卡| 天堂中文在线官网| 久久躁狠狠躁夜夜爽| 成年美女黄网站色大片不卡| 亚洲在线免费观看| 国产尤物久久久| 蜜臀av无码一区二区三区| 蜜臀a∨国产成人精品| 国产黄色三级网站| ●精品国产综合乱码久久久久| 日韩特黄一级片| 欧美一级午夜免费电影| 2017亚洲天堂1024| 欧美诱惑福利视频| 一区二区在线免费播放| 杨幂一区欧美专区| 久久精品动漫| 伊人久久一区二区三区| 中文字幕日韩欧美一区二区三区| 51国产偷自视频区视频| 亚洲爱爱爱爱爱| 粗大黑人巨茎大战欧美成人| 国产精品久久久久久av福利软件| 欧美日韩一区二区三区不卡视频| 好吊色这里只有精品| 蜜桃免费网站一区二区三区| 亚洲乱码国产乱码精品精大量| 亚洲一区中文在线| 国产探花精品一区二区| 日韩在线观看免费网站| 精品成人免费一区二区在线播放| 精品欧美日韩在线| 亚洲国产高清一区二区三区| 精产国品一区二区三区| 综合久久久久久| 亚洲一二区视频| 日韩中文综合网| 国产福利亚洲| 亚洲一卡二卡三卡| 日本午夜一区二区| 久久久免费看片| 欧美日韩一区二区在线视频| h网站视频在线观看| 国产成人精品在线播放| 国产精品欧美日韩一区| 久久9精品区-无套内射无码| 久久一区二区三区国产精品| 久久免费激情视频| 亚洲美女自拍视频| 亚洲综合电影| 日本一区免费看| 青青国产91久久久久久| av在线播放中文字幕| 欧美美女黄视频| 中中文字幕av在线| 91亚色免费| 伊人久久综合| 中文字幕一区二区人妻在线不卡| 日韩欧美中文免费| 都市激情在线视频| 国产日韩欧美视频| 欧美黄色免费| 怡红院一区二区| 色婷婷av一区二区三区之一色屋| 国产毛片在线看| 91久久国产综合久久91精品网站 | 亚洲一区二区三区在线免费| 成年人视频网站免费| 91丝袜美腿高跟国产极品老师| 中文字幕亚洲乱码熟女1区2区| 亚洲四色影视在线观看| 九九热这里有精品| 一本色道久久88亚洲精品综合| 国产传媒日韩欧美成人| 日韩三级免费看| 国产亚洲精品久久久久久牛牛| 免费日韩成人| 女人色极品影院| 久久综合色之久久综合| 在线观看国产一区二区三区| 欧美成人免费网| 婷婷成人综合| 欧美日韩一区二区三区69堂| 玉米视频成人免费看| 精品三级久久久久久久电影聊斋| 成人黄色在线观看| 在线亚洲伦理| 婷婷丁香综合网| 精品av综合导航| 色综合天天色| 国产真人做爰毛片视频直播| 日本一区二区三级电影在线观看 | 狠狠色综合播放一区二区| 日本一级黄色录像| 神马久久久久久| 欧美尿孔扩张虐视频| 亚洲精品视频三区|