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

91网在线免费观看| 7777精品伊人久久久大香线蕉| 鬼打鬼之黄金道士1992林正英| www.天天色| 欧美亚洲色图校园春色| 在线精品视频小说1| 免费看啪啪网站| 天天干天天摸天天操| 美女免费视频一区| 海角国产乱辈乱精品视频| 美女爆乳18禁www久久久久久| crdy在线观看欧美| 色综合久久综合网97色综合 | 亚洲欧美日本一区二区三区| heyzo在线欧美播放| 中文字幕精品综合| 国产一区二区精品免费| 最近中文字幕在线观看视频| 极品尤物久久久av免费看| 主播福利视频一区| 特大黑人巨人吊xxxx| 国产va免费精品观看精品| 欧美视频在线看| 久久久99精品视频| 2021av在线| 久久亚洲综合av| 99理论电影网| 亚洲一二区视频| 午夜在线a亚洲v天堂网2018| 欧美激情精品久久久久久大尺度| 成人性视频免费看| 亚洲精品播放| 亚洲第一精品夜夜躁人人爽| 想看黄色一级片| 欧美性片在线观看| 欧美性猛交xxxx免费看漫画 | 久久夜色精品| 97碰碰碰免费色视频| 日本a级片视频| 91视频综合| 国产一区二区三区在线观看视频| 少妇一级淫片免费放播放| 亚洲精品国产九九九| 这里只有精品视频在线观看| 人人爽人人av| 亚洲精品粉嫩美女一区| 欧美日韩在线视频一区| 国产www免费| 黄网站在线观| 一区二区三区不卡在线观看| 亚洲一区 在线播放| www红色一片_亚洲成a人片在线观看_| 中日韩免费视频中文字幕| 欧美一区二区三区在线播放 | 亚洲最新av网站| 蜜臀av在线播放一区二区三区| 国产成一区二区| 国产成人a v| 秋霞av亚洲一区二区三| 国产精品免费一区| 亚洲天堂aaa| 九色综合狠狠综合久久| 成人a在线观看| 国产又大又粗又长| 国产一区不卡在线| 91免费观看| 国产成人三级在线观看视频| 国产成人av一区二区| av色综合网| 手机av免费在线观看| 99久久婷婷国产精品综合| 久久99九九| 成人一区二区不卡免费| 国产精品剧情在线亚洲| 国产免费一区二区三区四在线播放| 成人福利网站| 亚洲国产cao| 国模吧无码一区二区三区| 自拍视频在线看| 欧美在线不卡一区| 九九热视频免费| 成人性生交大片免费看96| 亚洲欧美变态国产另类| 影音先锋男人看片资源| 欧美激情五月| 热久久免费国产视频| 亚洲一区二区视频在线播放| 国产不卡视频在线播放| 欧美成人第一区| 国内外激情在线| 午夜精品123| 亚洲综合日韩欧美| 日韩欧美一级| 亚洲欧美福利视频| 国产真实乱在线更新| 日韩一级大片| 91精品久久久久久久久久久久久久| 国产三级三级在线观看| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 99久久婷婷国产精品综合| 亚洲春色在线视频| 国语对白在线刺激| 欧美熟乱第一页| 一边摸一边做爽的视频17国产| 成人羞羞网站| 性欧美xxxx| 国产毛片一区二区三区va在线| 91免费精品国自产拍在线不卡| av动漫免费观看| 91av亚洲| 精品久久久久久最新网址| 精品人妻中文无码av在线| 欧美日韩午夜| 91美女福利视频高清| 久草视频在线看| 亚洲国产精品天堂| 亚洲黄色av片| 欧美三级伦理在线| 91精品国产色综合久久不卡98口| 国产精品视频一二区| 久久久激情视频| 国产69精品久久久久999小说| 婷婷激情成人| 在线成人激情视频| 可以免费在线观看的av| 国产suv精品一区二区883| 亚洲国产精品综合| 欧美日韩免费看片| 日韩精品小视频| 日本三级中文字幕| 成人性生交大片免费| 小说区视频区图片区| 国产精品久久久久77777丨| 日韩精品中文字幕在线| 在线看成人av| www.视频一区| 人妻少妇精品无码专区二区| 一区二区亚洲视频| 欧美成人免费在线视频| 国产精品久久久久久久久毛片| 亚洲国产高清在线| 91视频免费版污| 欧美日韩播放| 国产精品美女视频网站| 番号在线播放| 欧美中文字幕一二三区视频| 亚洲精品成人无码| 日韩成人精品在线观看| 亚洲aⅴ天堂av在线电影软件| 日韩欧美精品电影| 亚洲无限av看| 亚洲中文一区二区三区| 成人免费一区二区三区在线观看| 中文字幕成人在线视频| 国产精品传媒精东影业在线| 成人黄色免费看| 在线视频观看国产| 日韩精品在线一区二区| 久久综合色综合| www.性欧美| 久久精品网站视频| 国产一区二区三区天码| 国产精品欧美风情| 看黄网站在线| 日韩精品一区二区三区三区免费 | 99精品久久久| 久久久亚洲综合网站| 性感美女一区二区在线观看| 一区二区三区在线播放欧美| 夜夜狠狠擅视频| 亚洲精品成人a在线观看| 性久久久久久久久久久| 久久精品中文| 男插女免费视频| 麻豆一区二区麻豆免费观看| 日韩免费中文字幕| 欧美成人三区| 亚洲第一福利网站| 久久久久久在线观看| 亚洲视频免费观看| aaaa黄色片| 捆绑调教美女网站视频一区| 国产精品久久久影院| 欧美天堂影院| 国产欧美欧洲在线观看| 999福利在线视频| 在线观看精品国产视频| 亚洲精品.www| 欧美在线free| 国产一级中文字幕| 国产欧美一区二区三区在线老狼| 樱花草www在线| 欧美日本一区二区高清播放视频| 久久综合狠狠综合久久综青草 | 国产尤物91| 日韩电影精品| 5252色成人免费视频| 巨大荫蒂视频欧美另类大| 日韩精品在线影院| 国内精品偷拍视频| 欧美怡红院视频| 国产性一乱一性一伧一色| 欧美激情一区三区| 无码人妻一区二区三区一| 日本不卡在线视频| 欧美视频在线观看视频| 久久一本综合| 欧美日韩高清免费| 一区二区在线视频观看| 国产精品亚洲片夜色在线| 岛国在线视频网站| 久久综合伊人77777尤物| 可以在线观看的黄色| 精品欧美一区二区在线观看| 伊人网综合在线| 欧美日韩一二三四五区| 久草视频免费在线播放| 国产精品久久久久影院色老大| 亚洲av无码一区二区三区网址| 国产在线视频不卡二| 91国产精品视频在线观看| 亚洲精品麻豆| 大荫蒂性生交片| 一区二区三区四区电影| 先锋影音亚洲资源| 一区二区美女| 久久99精品久久久久久久久久| swag国产精品一区二区| 亚洲自拍在线观看| 高清在线一区| 国产精品自在线| 日韩一区二区三区免费视频| 77777亚洲午夜久久多人| 日本天码aⅴ片在线电影网站| 色噜噜狠狠狠综合曰曰曰| 国产鲁鲁视频在线观看免费| 亚洲片在线资源| 日本一级在线观看| 日韩精品在线第一页| 香港一级纯黄大片| 日韩av在线一区二区| 无码国产伦一区二区三区视频| 精品国产污网站| 亚洲av无码乱码国产精品| 91麻豆精品国产91久久久| 91国在线视频| 欧美色图天堂网| 在线视频1卡二卡三卡| 欧美日韩精品电影| 在线播放成人av| 欧美狂野另类xxxxoooo| 91女人18毛片水多国产| 制服丝袜亚洲精品中文字幕| 国产黄色片免费| 欧美精品一区二区精品网| 免费看国产片在线观看| 亚洲精品第一国产综合精品| 国产精品国产高清国产| 亚洲欧洲成视频免费观看| www视频在线观看免费| 色狠狠久久aa北条麻妃| yellow91字幕网在线| 欧美激情高清视频| 中文字幕人成乱码在线观看 | 五月天色综合| 91精品啪aⅴ在线观看国产| 日韩精品三级| 精品蜜桃传媒| 波多野结衣在线观看一区二区三区| 亚洲一卡二卡区| 影音先锋成人在线电影| 国产免费黄视频| 丝袜美腿亚洲综合| 视频免费1区二区三区| 懂色av一区二区在线播放| 手机在线看片日韩| 国产女人18水真多18精品一级做| 日韩在线一卡二卡| 亚洲一区二区三区在线播放| 一级成人黄色片| 欧美日韩久久久久久| 亚洲第九十九页| 亚洲精品网址在线观看| 好了av在线| 欧美最猛性xxxxx免费| 欧美成人xxxx| 国产九区一区在线| 日韩亚洲一区在线| 波多野结衣av一区二区全免费观看 | 欧美视频xxxx| 日韩免费看网站| 触手亚洲一区二区三区| 欧美日韩电影在线观看| 日本高清不卡一区二区三区视频| 亚洲va欧美va国产综合久久| 欧美18xxxx| 麻豆中文字幕在线观看| 国产视频一区欧美| 182午夜在线观看| 337p粉嫩大胆噜噜噜噜噜91av | 亚洲free性xxxx护士白浆| 极品束缚调教一区二区网站 | 欧美日韩成人综合在线一区二区 | 国产欧美视频在线| 久久视频在线观看中文字幕| 亚洲国产日韩欧美在线| 波多野结衣作品集| 成人av免费在线观看| 天天做夜夜爱爱爱| 色8久久精品久久久久久蜜| 亚洲av无码乱码国产麻豆| 尤物yw午夜国产精品视频| 激情国产在线| 91福利视频导航| 久久美女精品| 国产精彩免费视频| 不卡高清视频专区| 久草中文在线视频| 欧美日韩你懂得| 毛片网站在线| 69久久夜色精品国产69乱青草| 香港久久久电影| 先锋影音男人资源| 麻豆成人久久精品二区三区小说| 国产精品亚洲无码| 五月激情综合网| 黑人操亚洲女人| 久久99精品久久久久久琪琪 | 欧美一区二区三区四区视频| 北岛玲一区二区三区| 日本不卡视频在线播放| 欧美男人操女人视频| 免费人成在线观看视频播放| 国产一区二区三区久久久| 在线看片中文字幕| 欧美在线免费观看视频| 撸视在线观看免费视频| 欧美在线视频一二三| 日本欧美高清| 欧美精品99久久| 99这里都是精品| 日韩伦理在线视频| 亚洲国产三级网| 国产资源在线观看入口av| 狠狠色综合色区| 国产亚洲精品bv在线观看| 亚洲国产精品无码久久久久高潮 | 久久精品成人欧美大片古装| 欧美日韩免费电影| 伊人久久大香线蕉综合75| 精品在线观看免费| 国产一区二区精彩视频| 日韩一区二区三区三四区视频在线观看 | 日韩精品一区二区三区中文在线| 400部精品国偷自产在线观看| 国产精品资源站在线| 国产在线视频卡一卡二| 欧美精品一区二区三区蜜桃| 日韩影院在线| 日本一区二区精品视频| 日韩高清一区二区| 99热99这里只有精品| 777午夜精品视频在线播放| 国产激情在线| 国产精品久久久久久久免费大片| 99成人在线| 国产jk精品白丝av在线观看 | 秋霞视频一区二区| 欧美一区二区影院| 成人在线视频免费观看| 红桃视频一区二区三区免费| 亚洲自拍偷拍网站| 亚洲欧洲精品视频| 国产美女被下药99| 欧美网站在线| 国产精品第七页| 欧美三级在线看| 调教一区二区| 欧美日韩在线一区二区三区| 开心九九激情九九欧美日韩精美视频电影 | 亚洲日本成人在线观看| 三级视频在线看| 国产精品美女免费视频| 亚洲视频精品| 黄色片网站免费| 日韩一级高清毛片| 亚洲欧美一区二区三区| 一区二区三区欧美在线| 成人h动漫精品一区二区| 五月天中文字幕| 欧美黑人一级爽快片淫片高清| 欧美极品中文字幕| 毛片毛片毛片毛片毛| 色综合一个色综合| 中文字幕在线观看网站| 日韩av一区二区三区美女毛片| 国产制服丝袜一区| 亚洲欧美一二三区| 欧美激情视频网| 日本一二区不卡|