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

前端 TypeError 錯誤永久消失術

開發 前端
通過開發 Babel 插件,打包時自動為代碼添加可選鏈運算符(?.),從而有效避免 TypeError 的發生。

一、背景介紹

在 JS 中當獲取引用對象為空值的屬性時,程序會立即終止運行并報錯:TypeError: Cannot read properties of ...

在 ECMAScript 2020 新增的 可選鏈運算符(?.),當屬性值不存在時返回 undefined,從而可有效避免該錯誤的發生。

let a
a.b.c.d // Uncaught TypeError: Cannot read properties of undefined (reading 'b')
a?.b?.c?.d // undefined

本文將分享如何借助這一特性開發 Babel 插件,自動為代碼添加 ?.,從而根治系統中的 TypeError 錯誤。

二、項目痛點

  1. 維護中的代碼可能存在 TypeError 隱患,數量大維護成本高,比如:存在大量直接取值操作:a.b.c.d。
  2. 在新代碼中使用 ?. 書寫起來太繁瑣,同時也導致源碼不易閱讀,比如:a?.b?.c?.d。

因此,如果我們只要在打包環節自動為代碼添加 ?.,就可以很好解決這些問題。

三、解決思路

開發 Babel 插件 在打包時進行代碼轉換:

  • 將存在隱患的操作符 . 或 [] 轉換為 ?.
  • 將臃腫的短路表達式 && 轉換為 ?.
// in
a.b.c.d
a['b']['c']['d']
a && a.b && a.b.c && a.b.c.d


// out
a?.b?.c?.d

四、目標價值

通用于任何基于 Babel 的 JS 項目,在源碼 0 改動的情況下,徹底消滅 TypeError 錯誤。

五、功能實現

5.1 Babel 插件核心

  • 識別代碼中可能存在 TypeError 的風險操作:屬性獲取 和 方法調用
  • 支持自定義 Babel 參數配置,includes 或 excludes 代碼轉換規則
  • 短路表達式 && 自動優化
import { declare } from '@babel/helper-plugin-utils';
import * as t from '@babel/types';


export default declare((api, options) => {
  // 僅支持 Babel7 
  api.assertVersion(7);


  return {
    // Babel 插件名稱
    name: 'babel-plugin-auto-optional-chaining',
    visitor: {
      /**
       * 通過 Babel AST 解析語法后,僅針對以下數據類型做處理
       * - MemberExpression:a.b 或 a['b']
       * - CallExpression:a.b() 或 a['b']()
       * - OptionalMemberExpression:a?.b 或 a?.['b']
       * - OptionalCallExpression:a.b?.() 或 a.['b']?.()
       */
      'MemberExpression|CallExpression|OptionalMemberExpression|OptionalCallExpression'(path) {
        // 避免重復處理
        if (path.node.extra.hasAoc) return;


        // isValidPath:通過 Babel 配置參數決定是否處理該節點
        const isMeCe = path.isMemberExpression() || path.isCallExpression();
        if (isMeCe && !isValidPath(path, options)) return;
        
        
        // 屬性獲取
        // shortCircuitOptimized:&& 短路表達式優化后再做替換處理
        if (path.isMemberExpression() || path.isOptionalMemberExpression()) {
          const ome = t.OptionalMemberExpression(path.node.object, path.node.property, path.node.computed, true);
          if (!shortCircuitOptimized(path, ome)) {
            path.replaceWith(ome);
          };
        };


        // 方法掉用
        // shortCircuitOptimized:&& 短路表達式優化后再做替換處理
        if (path.isCallExpression() || path.isOptionalCallExpression()) {
          const oce = t.OptionalCallExpression(path.node.callee, path.node.arguments, false);
          if (!shortCircuitOptimized(path, oce)) {
            path.replaceWith(oce);
          };
        };
        
        // 添加已處理標記
        path.node.extra.hasAoc = true;
      }
    }
  };
});

5.2 Babel 參數配置

支持 includes 和 excludes 兩個參數,決定自動處理的代碼 ?. 的策略。

  • includes - 僅處理指定代碼片段
  • excludes - 排除指定代碼片段不做處理
// includes 列表,支持正則
const isIncludePath = (path, includes: []) => {
  return includes.some(item => {
    let op = path.hub.file.code.substring(path.node.start, path.node.end);
    return new RegExp(`^${item}$`).test(op);
  })
};


// excludes 列表,支持正則
const isExcludePath = (path, excludes: []) => {
  // 忽略:excludes 列表,支持正則
  return excludes.some(item => {
    let op = path.hub.file.code.substring(path.node.start, path.node.end);
    return new RegExp(`^${item}$`).test(op);
  })
};


// 校驗配置參數
const isValidPath = (path, {includes, excludes}) => {
  // 如果配置了 includes,僅處理 includes 匹配的節點
  if (includes?.length) {
    return isIncludePath(path, includes);
  }


  // 如果配置了 excludes,則不處理 excludes 匹配的節點
  if (includes?.length) {
    return !isExcludePath(path, includes);
  }


  // 默認全部處理
  return true;
}

5.3 短路表達式優化

支持添加參數 optimizer=false 關閉優化。

const shortCircuitOptimized = (path, replaceNode) => {
  // 支持添加參數 optimizer=false 關閉優化
  if (options.optimizer === false) return false;


  const pc = path.container;


  // 判斷是否邏輯操作 && 
  if (pc.type !== 'LogicalExpression') return false;


  // 只處理 a && a.b 中的 a.b
  if (pc.type === 'LogicalExpression' && path.key === 'left') return false;


  // 遞歸尋找上一級是否邏輯表達式,即:a && a.b && a.b.c
  const pp = path.parentPath;
  if (pp.isLogicalExpression() && path.parent.operator === '&&'){
    let ln = pp.node.left;
    let rn = pp.node.right?.object ?? pp.node.right?.callee ?? {};


    const isTypeId = type => 'Identifier' === type;
    const isValidType = type => [
      'MemberExpression',
      'OptionalMemberExpression',
      'CallExpression',
      'OptionalCallExpression'
    ].includes(type);
    const isEqName = (a, b) => {
      if ((a?.name ?? b?.name) === undefined) return false;
      return a?.name === b?.name;
    };


    // 遞歸處理并替換
    // 如:a && a.b && a.b.c ==> a?.b && a.b.c ==> a?.b?.c
    const getObj = (n, r = '') => {
      const reObj = obj => {
          r = r ? `${obj.name}.${r}` : obj.name;
      };
      isTypeId(n.property?.type) && reObj(n.property);
      isTypeId(n.object?.type) && reObj(n.object);
      isTypeId(n.callee?.type) && reObj(n.callee);


      if (isValidType(n.object?.type)) {
        return getObj(n.object, r);
      };
      if (isValidType(n.callee?.type)) {
        return getObj(n.callee, r);
      };
      return r;
    };


    // eg:a && a.b
    if (isTypeId(ln.type) && isTypeId(rn.type)) {
      if (isEqName(ln, rn)) {
        return pp.replaceWith(replaceNode);
      }
    };


    // eg:a && a.b | a && a.b.c...
    if (isTypeId(ln.type) && isValidType(rn.type)) {
      const rnObj = getObj(rn);
      if (rnObj.startsWith(ln.name)) {
        return pp.replaceWith(replaceNode);
      }
    };


    // eg:a.b && a.b.c | a.b && a.b.c...
    // 注意:a.b.c && a.b.d 不會被轉換
    if (isValidType(ln.type) && isValidType(rn.type)) {
      const lnObj = getObj(ln);
      const rnObj = getObj(rn);
      if (rnObj.startsWith(lnObj)) {
        return pp.replaceWith(replaceNode);
      }
    };
  };
  return false;
};

六、插件應用

配置 babel.config.js 文件。

支持3個配置項:

  • includes - 僅處理指定代碼片段(優先級高于 excludes)
  • excludes - 排除指定代碼片段不做處理
  • optimizer - 如果設置為 false 則關閉優化短路表達式 &&
module.exports = {
  plugins: [
    ['babel-plugin-auto-optional-chaining', {
      excludes: [
        'new .*',       // eg:new a.b() 不能轉為 new a.b?.()
        'process.env.*' // 固定短語通過.鏈接,不做處理
      ],
      // includes: [],
      // optimizer: false
    }]
  ]
}

七、不足之處

自動為代碼添加 ?. 可能會導致打包后文件體積略微增加,從而影響頁面訪問速度。

八、相關插件

對于不支持 可選鏈運算符 (?.) 的瀏覽器或者版本(如:Chrome<80),可以再使用插件 @babel/plugin-transform-optional-chaining 做反向降級。

使用后效果如下:

// 第1步:考慮健壯性,使用本文插件將代碼自動轉為可選鏈
a.b ===> a?.b


// 第2步:考慮兼容性,使用 @babel/plugin-transform-optional-chaining 再做反向降級
a?.b ==> a === null || a === void 0 ? void 0 : a.b;

九、插件測試

以下是一些測試用例僅供參考,使用 babel-plugin-tester 進行測試。

Input 輸入用例

// 常規操作
const x = a.b.c.d
const y = a['b']['c'].d
const z = a.b[c.d].e
if(a.b.c.d){}
switch (a.b.c.d){}
// 特殊操作
(a).b // 括號運算
const w = +a.b.c // 一元運算
// 方法調用
a.b.c.d()
a().b
a.b().c
a.b(c.d).e
fn(a.b.c.d)
fn(a.b, 1)
fn(...a)
fn.a(...b).c(...d)
// 短路表達式優化
// optional member
a && a.b
a && a.b && a.b.c
a.b && a.b.c && a.b.c.d
this.a && this.a.b
this.a.b && this.a.b.c && this.a.b.c.d
this['a'] && this['a'].b
this['a'] && this['a']['b'] && this['a']['b']['c']
this['a'] && this['a'].b && this['a'].b['c']
// optional method
a && a.b()
a && a.b().c
a.b && a.b.c()
a && a.b && a.b.c()
// assign expression
let a = a && a.b
let b = a && a.b && a.b.c && a.b.c.d
let c = a && a.b && a.b.c()
// self is optional chaining
a && a?.b
a && a.b && a?.b?.c
a && a?.b && a?.b?.c
a && a?.b() && a?.b()?.c
// function args
fn(a && a.b)
fn(a && a.b && a.b.c)
// only did option chaining
a.b && b.c
a.b && a.c.d
a.b && a.b.c && a.c.d
a.b.c && a.b.d
a.b.c && a.b
a.b.c.d && a.b.c.e
// not handle
a && b
a && b && c
a || b
a || b || true
// 忽略賦值操作
x.a = 1
x.a.c = 2
// 忽略算術運算
a.b++
++a.b
a.b--
--a.b
// 忽略指派賦值運算
a.b += 1
a.b -= 1
// 忽略 in/of
for (a in b.c.d);
for (bar of b.c.d);
// 忽略 new 操作符
new a.b()
new a.b.c()
new a.b.c.d()
new a().b
new a.b().c.d
// 配置忽略項
process.env.a
process.env.a.b.c
// 忽略 ?. 本身
a?.b
a?.b?.c?.d

Out 結果輸出

// 常規操作
const x = a?.b?.c?.d;
const y = a?.["b"]?.["c"]?.d;
const z = a?.b?.[c?.d]?.e;
if (a?.b?.c?.d) {
}
switch (a?.b?.c?.d) {
}
// 特殊操作
a?.b; // 括號運算
const w = +a?.b?.c; // 一元運算
// 方法調用
a?.b?.c?.d();
a()?.b;
a?.b()?.c;
a?.b(c?.d)?.e;
fn(a?.b?.c?.d);
fn(a?.b, 1);
fn(...a);
fn?.a(...b)?.c(...d);
// 短路表達式優化
// optional member
a?.b;
a?.b?.c;
a?.b?.c?.d;
this.a?.b;
this.a?.b?.c?.d;
this["a"]?.b;
this["a"]?.["b"]?.["c"];
this["a"]?.b?.["c"];
// optional method
a?.b();
a?.b()?.c;
a?.b?.c();
a?.b?.c();
// assign expression
let a = a?.b;
let b = a?.b?.c?.d;
let c = a?.b?.c();
// self is optional chaining
a?.b;
a?.b?.c;
a?.b?.c;
a?.b()?.c;
// function args
fn(a?.b);
fn(a?.b?.c);
// only did option chaining
a?.b && b?.c;
a?.b && a?.c?.d;
a?.b?.c && a?.c?.d;
a?.b?.c && a?.b?.d;
a?.b?.c && a?.b;
a?.b?.c?.d && a?.b?.c?.e;
// not handle
a && b;
a && b && c;
a || b;
a || b || true;
// 忽略賦值操作
x.a = 1;
x.a.c = 2;
// 忽略算術運算
a.b++;
++a.b;
a.b--;
--a.b;
// 忽略指派賦值運算
a.b += 1;
a.b -= 1;
// 忽略 in/of
for (a in b.c.d);
for (bar of b.c.d);
// 忽略 new 操作符
new a.b();
new a.b.c();
new a.b.c.d();
new a().b;
new a.b().c.d;
// 配置忽略項
process.env.a;
process.env.a.b.c;
// 忽略 ?. 本身
a?.b;
a?.b?.c?.d;

十、寫在最后

本文通過介紹如何開發一個 Babel 插件,在打包時自動為代碼添加 可選鏈運算符(?.),從而有效避免 JS 項目 TypeError 的發生。
希望這個思路能夠有效的提升大家項目的健壯性和穩定性。

十一、參考資料

責任編輯:龐桂玉 來源: vivo互聯網技術
相關推薦

2022-10-27 09:13:58

CSSGradient

2022-08-02 06:39:06

多行文本CSS

2019-05-20 09:30:20

MySQL常見錯誤數據庫

2025-06-26 08:24:11

AndroidView尺寸消失術

2022-11-28 07:35:52

前端錯誤

2011-07-28 10:32:06

廣聯達

2025-06-11 03:22:00

JavaScript開發前端

2022-05-30 16:31:08

CSS

2009-11-25 10:47:45

2024-11-06 11:15:59

2016-11-25 00:38:45

隔離負載均衡系統

2015-09-02 14:27:30

戴爾大數據

2009-12-16 14:34:32

Visual Stud

2025-11-10 08:36:00

2025-09-01 01:55:00

2019-07-15 07:58:10

前端開發技術

2021-02-22 07:48:35

Excel數據分析快捷方式

2023-02-17 08:03:11

2016-11-25 00:45:37

隊列數據

2013-11-28 13:35:47

icon程序員
點贊
收藏

51CTO技術棧公眾號

国产精品激情av电影在线观看| 亚洲国产又黄又爽女人高潮的| 亚洲啪啪av| 国产精品久久久久久久久毛片| 黄色欧美成人| 亚洲午夜激情免费视频| 毛毛毛毛毛毛毛片123| 国产乱码午夜在线视频| 国产精品视频第一区| 国产传媒一区| 亚洲午夜精品久久久| 精品成人久久| 久久久精品国产亚洲| 艳妇乳肉亭妇荡乳av| 九七电影院97理论片久久tvb| 亚洲夂夂婷婷色拍ww47| 亚洲不卡一卡2卡三卡4卡5卡精品| 在线观看视频二区| 一本色道久久综合一区| 欧美成人剧情片在线观看| 无码h肉动漫在线观看| 精品99re| 欧美少妇xxx| 国产二区视频在线播放| 怡红院在线观看| 国产欧美精品一区二区色综合朱莉| 99久久无色码| 97caocao| 免费成人美女在线观看| 91福利视频网| 国产精品第56页| 91av精品| 日韩中文字幕网| av网站免费在线看| 午夜精品福利影院| 亚洲精品一区二区三区福利| 国产精品嫩草影视| 巨大黑人极品videos精品| 色天天综合色天天久久| 欧美亚洲精品一区二区| 国产高清在线a视频大全| 亚洲人成在线观看一区二区| 亚洲精品日韩精品| 狠狠v欧美ⅴ日韩v亚洲v大胸| caoporn国产精品| 国产精品免费视频一区二区 | 免费在线观看av片| 中文成人综合网| 日韩精品一线二线三线| 黄色大片在线看| 国产欧美一区二区三区在线看蜜臀 | 久久中文资源| 精品国产麻豆免费人成网站| 91丨porny丨九色| 国产精品美女久久久久人| 欧美日韩国产一级| 污视频网站观看| 亚洲老司机网| 日韩欧美成人午夜| 亚洲美女高潮久久久| 99ri日韩精品视频| 亚洲精品一线二线三线| 欧美大片免费播放器| 欧美三级午夜理伦三级小说| 日韩av最新在线观看| 懂色av粉嫩av蜜乳av| 久久99国内| 在线看日韩av| 182在线观看视频| 欧美日本一区二区高清播放视频| 久久久久久久久久久av| 日韩视频免费观看高清| 美女日韩在线中文字幕| 青青久久av北条麻妃黑人| 波多野结衣一区二区三区在线| 强制捆绑调教一区二区| 91久久久久久久久久久久久| 国产99视频在线| 成人毛片在线观看| 欧美精品人人做人人爱视频| 在线日本视频| 一级中文字幕一区二区| 国产老熟妇精品观看| 日韩免费va| 777xxx欧美| 一区二区三区少妇| 91免费精品| 欧美激情一区二区三区成人 | 久久精品国产精品青草色艺 | 久久成人免费视频| 日韩成人一区二区三区| 日韩经典中文字幕一区| 91精品视频免费看| 香蕉av一区二区三区| 国产精品美女久久久久久| 992tv快乐视频| 欧美成人影院| 日韩午夜精品电影| 国精产品一区二区三区| 艳女tv在线观看国产一区| 2019中文字幕全在线观看| 亚洲资源在线播放| 成人av电影在线| 午夜探花在线观看| 免费看av不卡| 日韩欧美专区在线| 欧美激情久久久久久久| 亚洲高清不卡| 91夜夜未满十八勿入爽爽影院| 午夜国产在线观看| 怡红院av一区二区三区| 在线观看免费黄网站| 欧美成a人免费观看久久| 久久精品国产精品亚洲| 视频一区二区三区四区五区| 国产精品99久久不卡二区| 天天综合狠狠精品| 手机在线观看av| 日韩欧美一二三四区| 日本美女xxx| 久久亚洲欧美| 精品久久精品久久| 暖暖在线中文免费日本| 欧美日韩你懂的| 少妇无套高潮一二三区| 亚洲美女色禁图| 国产精品高清一区二区三区| 麻豆网在线观看| 欧美图区在线视频| 成人免费无遮挡无码黄漫视频| 亚洲精品美女91| 国产成人av一区二区三区| 国产在线激情| 欧美日韩电影在线| 美国精品一区二区| 日韩成人一级大片| 色一情一区二区三区四区| 欲香欲色天天天综合和网| 亚洲精品v欧美精品v日韩精品| 青青草原国产视频| 国产高清不卡二三区| 欧美日韩一区二区三区电影| 3d动漫一区二区三区在线观看| 国产亚洲精品美女久久久| 国产又粗又猛又黄视频| 国产亚洲综合在线| 久久黄色免费看| 红桃视频在线观看一区二区| 国产黑人绿帽在线第一区| 国产女主播在线写真| 日本高清不卡一区| 手机毛片在线观看| 久久精品国产精品青草| 一本一本a久久| 国产专区精品| 欧美激情国产高清| 天天操天天干天天爽| 精品久久久香蕉免费精品视频| 中文字幕乱码一区| 亚洲欧美久久久| 日本一区视频在线观看| 青青在线精品| 欧美伦理91i| 神宫寺奈绪一区二区三区| 第一福利永久视频精品 | 免费av网站观看| 精品久久久国产| 亚洲综合色一区| 免费看精品久久片| 好色先生视频污| 久久精品66| 国产精品久久精品| 高清免费电影在线观看| 欧美成人video| 亚洲高清毛片一区二区| 欧美经典一区二区三区| 在线观看网站黄| 亚洲综合社区| 中文字幕不卡每日更新1区2区| 永久免费精品视频| 欧美一区二区三区艳史| fc2在线中文字幕| 日韩免费一区二区| 精产国品一区二区| 亚洲视频免费在线观看| 在线观看av中文字幕| 日韩精彩视频在线观看| 免费高清一区二区三区| 久久av中文| 国产精品加勒比| 成人亚洲网站| 国产91av在线| 国产二区三区在线| 国产亚洲日本欧美韩国| www日本高清视频| 欧美三级电影在线看| 日本三级理论片| 国产精品视频一二| 亚洲黄色免费在线观看| 国内久久婷婷综合| 91淫黄看大片| 亚洲第一网站| 秋霞在线一区二区| 国产精品探花在线观看| 国产精品久久亚洲| 亚洲久草在线| 国产精品久久久久久久电影| free性护士videos欧美| 久久综合久久美利坚合众国| 九色视频成人自拍| 亚洲成人网av| 国产精品免费无遮挡| 在线免费亚洲电影| 免费日韩一级片| 一区二区三区不卡视频在线观看| 国产精品美女高潮无套 | 黄色精品视频在线观看| 久久综合九色综合97婷婷女人 | 久久精品人人爽人人爽| 日韩精品视频一区二区| 国产激情视频一区二区三区欧美| 日韩福利视频在线| 亚洲麻豆av| 男人天堂a在线| 欧美色一级片| 免费成人进口网站| 天天av综合| 性高潮久久久久久久久| 国产一区二区区别| 农村寡妇一区二区三区| 欧美日韩看看2015永久免费 | 成人激情在线观看| 朝桐光一区二区| 国产成人av网址| 亚洲1234区| 日韩av电影院| 欧美黄色三级| 国产精品老牛影院在线观看| 欧美日韩电影免费看| 日本亚洲欧洲色α| 欧美成人精品一区二区男人小说| 日本aⅴ大伊香蕉精品视频| 欧洲一区精品| 青青久久av北条麻妃海外网| 成人美女视频| 日韩av理论片| 成人精品动漫| 国产欧美日韩中文字幕| 亚洲精品三区| av成人观看| 日韩精品免费一区二区三区竹菊| 国产伦精品一区二区三区视频孕妇| av不卡一区二区| 国产一区在线观| 要久久电视剧全集免费| 欧美日韩高清免费| 日韩精品免费| 成人在线免费高清视频| 亚洲激情国产| 国产视频一区二区视频| 美女精品一区二区| 中文国产在线观看| 懂色av一区二区三区蜜臀| 久久人妻少妇嫩草av无码专区 | 久久精品色妇熟妇丰满人妻| 国产精品久久久久影院色老大| 欧美风情第一页| 亚洲综合成人在线视频| 天天操天天爽天天干| 欧美亚男人的天堂| 国产成人精品毛片| 日韩精品极品视频| 成年人视频网站在线| 不卡伊人av在线播放| 国产美女高潮在线观看| 国产精品999999| 国产精品久久久久久久久久久久久久久| 成人xxxxx色| 国产不卡av一区二区| 一本二本三本亚洲码| 亚洲毛片视频| 另类小说第一页| 国产a区久久久| 亚洲色成人网站www永久四虎| 亚洲乱码一区二区三区在线观看| 日韩欧美一区二区一幕| 欧美另类久久久品| 天堂在线视频免费观看| 色妞在线综合亚洲欧美| 国产又色又爽又黄刺激在线视频| 国产成人精品在线| 亚洲超碰在线观看| 亚洲精品一区二区三区蜜桃久 | 国语对白做受69| 国产69精品久久久久按摩| 国产精品久久亚洲| 五月激情久久久| 黄色片视频在线免费观看| 国产一区不卡在线| 国产综合精品在线| 亚洲福利一二三区| 91麻豆国产在线| 亚洲欧美日韩图片| 国产深夜视频在线观看| 国产日韩欧美电影在线观看| 麻豆一区二区| 亚洲精品天堂成人片av在线播放 | 一起草在线视频| 亚洲人成在线观看一区二区| 黄色av网站免费观看| 精品噜噜噜噜久久久久久久久试看| 国产女主播在线写真| 91精品国产色综合| 日本精品在线播放| 一区二区三区观看| 久久久久久夜| 性色av蜜臀av色欲av| 亚洲一区二区欧美日韩| 国产精品一二三四五区| 在线a欧美视频| 国产另类xxxxhd高清| 久久99久久精品国产| 亚洲国产导航| 国产精久久久久| 樱桃视频在线观看一区| 国产999久久久| 久久综合88中文色鬼| 亚洲国产综合在线观看| 亚洲精品永久www嫩草| 日本欧美一区二区三区| 中文字幕一区二区三区人妻电影| 天天综合网天天综合色| 色香蕉在线视频| 国内精品视频一区| 黄色欧美网站| 香港三级韩国三级日本三级| 成人高清在线视频| 日韩欧美不卡视频| 亚洲缚视频在线观看| 成全电影大全在线观看| 国产精品日韩欧美一区二区| 伊人天天综合| 手机在线成人av| 丰满岳妇乱一区二区三区| 午夜视频福利在线| 日本成熟性欧美| 欧美一区2区| 成人日韩在线视频| 最近中文字幕一区二区三区| 国产精品久久久久久久免费| 欧美成人精品激情在线观看| 亚洲精品影片| 福利视频一二区| 久久久青草青青国产亚洲免观| 毛片在线免费视频| 日韩国产精品亚洲а∨天堂免| 三妻四妾的电影电视剧在线观看 | 亚洲精品在线视频免费观看| 天天色天天爱天天射综合| 男人的天堂在线视频| 国产精品久久久久久久久久东京| 色欧美自拍视频| 香蕉视频xxxx| 婷婷综合五月天| 粉嫩av一区| 亚洲mm色国产网站| 中文亚洲字幕| 国产精品18在线| 日韩欧美国产系列| 欧洲一区精品| 中文字幕综合在线观看| 成人在线综合网| 无码人妻精品一区二区三区不卡| 日韩在线观看免费网站| 18国产精品| 国产熟人av一二三区| 中文字幕人成不卡一区| 欧美一级片免费| 国产精品jizz在线观看麻豆| 欧美一区二区三区久久精品茉莉花| 无码国产69精品久久久久网站| 91成人在线精品| 欧美男男video| 日本精品一区二区| 国产福利一区在线| 91视频在线视频| 色综合色综合久久综合频道88| 亚洲免费专区| 日本少妇激三级做爰在线| 精品国产乱码久久久久久婷婷| 欧美jizzhd69巨大| 久久99国产精品| 国产一区二区三区在线观看精品| 国产无套粉嫩白浆内谢| 色爱av美腿丝袜综合粉嫩av| 日韩福利视频一区| 中文字幕第66页| 在线精品视频免费观看| 欧美草逼视频| 天天做天天爱天天高潮|