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

基于Rspack實現大倉應用構建提效實踐

開發 項目管理
既然是業界的普遍性問題,那么外界也肯定會存在不少優化案例可以借鑒或者復用。由于Node.js的優化方案通常都會存在各種場景限制,這里我們主要從另外一個思路去尋找方案。

一、實踐背景

隨著項目的逐步迭代,代碼量和依賴的逐漸增長,應用的構建速度逐步進入緩慢期。以目前所在團隊的業務應用來看(使用webpack構建),應用整體構建耗時已經普遍偏高,影響日常開發測試的使用效率,其中編譯耗時大約占50%。

實際上隨著近些年前端的技術發展以及業務對前端交互體驗的要求提高,前端整個代碼量復雜度和代碼量增長飛快。隨著這一趨勢的變化,服務于前端工程構建方案多年的webpack,在構建效率上已經逐漸成為瓶頸。因此業界也存在不少優化思路和方案,主要分兩個方向:

  • 基于原有Node.js語言實現,通過緩存等方案來提升構建效率,主要是緩存、預構建的方式來減少編譯。此類方案多數存在條件限制,比如緩存方案前提是第一次先生成緩存來提升二次構建效率,對于發布平臺等需要冷啟場景無法生效。
  • 另外一類是采用Golang、Rust等語言重新實現耗時較為復雜的編譯過程,從語言層面實現編譯過程的性能提升。比較有代表的有,基于Golang實現的esbuild、基于Rust實現的SWC,都在對應的場景得到不少的性能提升。

二、業界方案

既然是業界的普遍性問題,那么外界也肯定會存在不少優化案例可以借鑒或者復用。由于Node.js的優化方案通常都會存在各種場景限制,這里我們主要從另外一個思路去尋找方案。經過調研目前業界的主要方案有Rspack、Vite、Turbopack、swcpack相對比較有代表性(可能還有其他方案,由于筆者時間精力有限未能了解到)。幾個方案主要的情況如下(筆者個人主觀分析,僅供參考):

圖片圖片

三、技術選型

先看當前大倉前端應用主要技術體系:整體技術棧主要是React為主,未來Vue還會逐步遷移React;框架層面UmiJS@4大概占60%、UmiJS@v3大概占20%、剩余為其他Vue或者C端的多頁應用。整體技術體系主要是UmiJS為主,配套主要是webpack的構建方案,部分Vue項目有使用Vite。

在這樣的現實情況下,我們面對的主要是React+UmiJS+webpack的應用。基于應用廣泛性考慮,只要解決這部分應用就可以達到80%的應用提速覆蓋。為此,我們選擇了基于Rspack來實現構建方案的性能提升,主要考慮有以下幾點:

  • 高性能:基于Rust實現核心能力,全量編譯+增量編譯(HMR)的實現方式,官方宣稱實際落地有5~10倍的提升,隨著未來逐步優化完善還有提升空間,且生產和開發階段除緩存之外,基本可以獲得一致性的性能收益。
  • 低成本:Rspack大量兼容webpack生態,大量配置和插件可以直接或者調整一下配置即可復用,僅需對一些特殊的插件自研定制開發即可。以下是對項目主要使用到的webpack能力進行了梳理,并對其在Rspack中的情況情況也進行了對照。

圖片圖片

綜合情況來看:雖然性能Rspack未必是最高的,但其兼容webpack生態帶來的低成本遷移,是其他的方案基本上無法做到的。對此,選擇了基于Rspack來作為基礎的底層能力。得益于此,我們最終實現了業務代碼零改動即可實現構建方案遷移(僅微調構建配置),并獲得云構建2倍+編譯性能的提升。

四、方案設計思路

由于大倉目前大量的應用為UmiJS@4體系,作為我們主要服務的目標對象,本文也是主要先針對解決UmiJS@4版本的應用方案。

方案難點

  • UmiJS僅支持webpack和Vite兩種構建模式,如何擴展Rspack構建?
  • 業務應用中有大量使用UmiJS插件、Babel插件來實現一些特殊能力,如何支持此類插件的能力?
  • 如何盡可能降低業務應用接入成本,進而達成方案快速應用到各個業務應用中?

通過擴展插件命令實現Rspack構建

UmiJS默認構建能力是封裝在@umi/max內部,通過max dev/build來調用內置配套的本地/生產構建。在UmiJS官方上并未提供編譯能力的完全自定義擴展能力,僅支持Vite/webpack的選擇以及提供了一些修改構建配置的方法。

通過查看UmiJS項目的源碼,發現其內部的構建實現全部集中在dev/build這兩個擴展命令中。源代碼在preset-umi/src/commands/目錄下的dev/dev.ts和build.ts 兩個文件,分別對應dev和build命令。而實際上的構建邏輯,實現上主要是在 @umijs/bundler-vite 和 @umijs/bundler-webpack兩個包中。其內部執行的主要邏輯如下(這里以dev模式為例,build模式基本上類似,就是少了文件監聽編譯和express相關邏輯):

圖片圖片

那么我們只需要在新的命令中實現相關的邏輯,即可通過擴展命令的方式來擴展Rspack構建能力。另外,使用該方法實現,還能沿用UmiJS原本的代碼生成等原本的插件,進而可以避免需要大量重新實現UmiJS插件的能力,并降低重寫帶來的邏輯不一致風險。

官方平替插件+少部分自研擴展支持原有插件能力

前面的插件擴展模式已經能保證原有大量的UmiJS能力是可以直接沿用的,比如生成路由、添加tailwind.css等UmiJS內置能力都可直接沿用。另外項目主要依賴擴展的插件,除了少部分修改構建能力的插件之外,基本上都可以直接使用或者少量適配即可。不兼容的幾個插件主要是因為:功能是通過修改的webpack配置來調整構建能力,需要通過使用對應的Rspack構建能力來進行兼容。

另外除了UmiJS的插件之外,還有構建依賴的Babel插件部分,當然部分Babel插件也是通過UmiJS插件引入使用的。對此,也對主要的Babel插件的情況進行了梳理,其主要的情況如下表:

圖片圖片

所以整體上還是以沿用webpack原有擴展加Rspack官方能力替換為主,只需要針對少部分未支持的Babel插件進行擴展即可實現。

基于配置映射實現業務超低接入成本

想要達成方案可以快速應用的理想效果,就是讓應用接入過程中盡可能少改內容,特別是業務代碼。因為一旦要改業務代碼邏輯,這種就會增加非常多的接入成本,所以在方案設計上,構建能力以及原本UmiJS的相關配置能力要盡量去沿用并且滿足基本上不需要業務側同學去感知差異化的內容。

帶著這個需求并結合前面的幾塊內容分析來看,大多數內容都是有平替方案,少部分需要進行自定義開發擴展,主要也是集中在Babel插件上。那么我們需要做的就是維持UmiJS轉換生成webpack的配置邏輯不動,在拿到webpack配置之后,再對webpack的配置做解析通過一個配置轉換器對需要轉換成Rspack的內容進行轉化,對原本兼容的配置直接遷移使用即可實現我們的目的。

配置&能力映射示意圖:

圖片圖片

方案架構

結合以上的問題解決思路以及目標,最終方案的架構設計如下:

圖片

架構要點說明:

  • 通過擴展自研插件,提供自定義的rspack-dev和rspack-build命令來提供開發、生產模式,接入時僅需要安裝插件并替換啟動命令即可(舉個例子:package.json中修改max dev為max rspack-dev)。
  • 通過插件內部對配置進行轉化,將原本UmiJS的配置轉為Rspack配置,保障業務應用接入時基本不感知。另外在開發成本方面,由于大多數loader和plugin可以復用,主要是配置和loader等能力替換映射成本。
  • 方案基于UmiJS的max擴展,原本UmiJS的擴展能力不受影響。業務高使用率Babel插件有現成的SWC擴展能力可直接替換(比如:Babel-plugin-import、svgr等),少部分自研插件需要使用Rust重寫。

穩定性保障

切換構建之后,less/postcss插件是一致的,主要風險來自于兩個方面:

  • webpack轉Rspack:Rspack項目內平移了大量的webpack測試用例用于保障一致性,另外默認嚴格模式,出現不兼容配置會拋出錯誤中斷構建,保證了基礎方面的穩定性。

圖片圖片

  • Babel(v7)轉SWC:SWC支持所有stage 3 perposals 、preset-env,JS/TS語法編譯能力上跟Babel 7對齊。在插件生態上不一致,若有使用Babel插件,需要考慮替換方案(詳情參考前文中的Babel插件使用情況)。

圖片圖片

雖然在Rspack方面申明已經兼容了主流的內容,但畢竟是替換了構建方案,對業務來說還是存在一些未知的風險,還是需要一些手段來進行保障業務應用的穩定性。

穩定性保障手段:

  • 構建報錯中斷策略:配置上出現不支持的Babel插件直接報錯中斷構建,避免未支持的內容被跳過進而導致異常發布上線。
  • 階段推進落地策略:由于大多數構建運行都是在開發測試階段(粗略統計平臺發布70%左右為測試環境),先行接入開發&測試環境達到構建效率提升,等開發測試階段跑穩定之后,再從非核心應用開始試點上線,功能穩定之后再逐步推廣。
  • 極簡的應急恢復策略:由于極低的接入成本,若接入遇到問題想快速回退也非常簡單,僅需回退命令為dev/build即可完成應急恢復。

五、方案效益

實現超低接入成本:僅需改動三個小步驟,一兩分鐘即可完成接入。具體步驟如下:

  • 添加并安裝依賴:添加并安裝@umijs/plugin-rspack依賴(得物私有npm包)。
dx add @umijs/plugin-rspack@latest -D
  • 添加UmiJS的plugin:在config/config.ts中修改plugins屬性。
{
    // 原有其他配置
    ...
    plugins: [
        // 原有其他插件
        ..., 
        // 添加 @umijs/plugin-rspack 插件
        '@umijs/plugin-rspack',
    ],
    // 原有其他配置
    ...
}
  • 修改構建命令:修改package.json中的構建命令,將對應環境的命令調整為rspack-dev/rspack-build,并增加NODE_ENV配置。
{
    "scripts": {
        // start 對應支持本地的dx dev,
        // 原配置樣例
        - "start": "cross-env BUILD_ENV=dev max dev",
        // 改rspack構建樣例
        + "start": "cross-env BUILD_ENV=dev NODE_ENV=development max rspack-dev",
        // pnpm:build:x 對應支持發布平臺指定的環境
        // 原t1配置樣例
        - "pnpm:build:t1": "cross-env BUILD_ENV=t1 max build",
        // t1改rspack構建樣例
        + "pnpm:build:t1": "cross-env BUILD_ENV=t1 NODE_ENV=production max rspack-build",
        ... // 原先的其他配置,酌情進行調整
    }
}

平均2倍+的編譯性能提升:大倉應用接入17個應用(目前主要是接入開發、測試環境),平均提升在2倍以上。以自身負責的一個應用為例,原有webpack編譯耗時150秒,接入后降低到40秒(減少73.33%),加上優化過程中去除部分無用的引入代碼最終僅需20秒左右。

六、分享過程中的一些干貨

這里主要結合UmiJS所需要的能力,分享一些UmiJS涉及到的Rspack用法以及過程中一些比較典型的內容。

支持ts/tsx

ts/tsx的支持主要依靠的是swc-loader,Rspack使用了Rust定制的builtin:swc-loader,其使用方式基本上是跟webpack的swc-loader一致的,詳情可以直接參考swc-loader文檔,這里主要體現一些常用的配置項,具體使用可以結合自身項目情況來調整。

export default {
  module: {
    rules: [
      {
        test: /\.(j|t)s(x)?$/,
        loader: 'builtin:swc-loader',
        options: {
          env: {
            // 瀏覽器兼容性,支持browserslist,詳細可以參考:https://swc.rs/docs/configuration/supported-browsers#targets
            targets: {
              chrome: "80",
            },
          },
          // js/ts編譯配置
          jsc: {
            parser: {
              // 開啟ts編譯
              syntax: 'typescript',
              // 開啟tsx編譯
              tsx: true,
              // 開啟@裝飾器編譯
              decorators: true,
              // 動態import
              // dynamicImport: false,
            },
            transform: {
              // react運行環境配置
              react: {
                // dev模式打開development啟動react的開發模式
                development: isDev,
              },
              // stage 1 的舊版本class decorators
              legacyDecorator: true,
              // 支持 ts emitDecoratorMetadata
              decoratorMetadata: true,
            },
          },
        },
      },
    ]
  }
}

React HMR

在看文檔配置時,感覺不好理解,實際使用上其實分兩種情況:

  • 直接使用Rspack的devServer情況下,需要同時開啟devServer.hot和@rspack/plugin-react-refresh。如下配置:
import ReactRefreshPlugin from '@rspack/plugin-react-refresh';


export default {
    ... 其他配置
    devServer: {
        // 開啟HMR,官方文檔也有體現
        hot: true,
    },
    plugins: [
        ...其他插件
        // React熱更新支持插件
        isDev && new ReactRefreshPlugin(),
    ]
}
  • 若不使用devServer的情況下,需要用rspack.HotModuleReplacementPlugin來實現devServer.hot的能力。由于這種方式未在實踐過程中進應用,這里不進行具體的使用舉例。

Module Federation

Rspack提供了兩個版本的模塊聯邦能力,官方文檔主要是介紹的v1.5對應的是經過Rspack改良過的版本。但實際上在一些情況下,如果直接跟webpack的MF對接會存在一些問題。我們在第一次使用過程中,也是對接了默認的v1.5版本,就出現了公共依賴無法找到的問題,錯誤提示如下:

圖片圖片

實際上若需要跟webpack項目對接的情況下,需要采用v1.0版本的MF插件,使用方法如下:

import { container } from '@rspack/core';
export default {
    ... 其他配置
    plugins: [
        new container.ModuleFederationPluginV1({
            ... 這里是mf的配置
        })
    ]
}

樣式按需引入:babel-plugin-import

babel-plugin-import作用:主要是配合ant-design或poizon-design(基于antd定制主題)庫來使用,通過插件識別js中依賴的組件,自動注入樣式文件,進而實現css的按需引用。實現類似如下效果:

// 手寫源代碼
import { Button, Input } from 'antd';


// 通過插件編譯后
import { Button, Input } from 'antd';
import 'antd/lib/button/style';
import 'antd/lib/input/style';

在Rspack中使用的是swc來進行js/ts解析的,故babel-plugin-import是不能直接使用的,需要采用builtin:swc-loader的rspackExperiments來進行對應的能力支持。其配置方法如下:

export default {
  module: {
    rules: [
      {
        test: /\.(j|t)s(x)?$/,
        loader: 'builtin:swc-loader',
        options: {
          experimental: {
            // babel-plugin-import的配置
            import: [
              // pd按需注入樣式
              { libraryName: 'poizon-design', libraryDirectory: 'es', style: true },
              // antd按需注入樣式
              { libraryName: 'antd', libraryDirectory: 'es', style: true },
            ],
          }
        }
      }
    ]
  }
}

cssModules:auto-css-modules

在UmiJS中,默認是通過auto-css-modules來進行css-modules代碼的判斷;其原理為通過ast語法樹,判斷import引入樣式文件時,若有聲明對應的變量,就將其打上一個query標記。并在樣式文件處理時,通過resourceQuery來進行匹配對應的文件,并添加css-modules的編譯能力。詳情見:UmiJS AutoCssModules插件源代碼、UmiJS CSS編譯配置源代碼。

通過UmiJS項目以及結合一些資料,Babel的auto-css-modules能力有swc-plugin-auto-css-modules可以替代,配置的話,主要幾個關鍵點:

  • 添加swc-plugin-auto-css-modules插件(實際上開源的插件并不能用,后文詳細說明原因)。
  • 添加builtins.css配置,指定cssModules編譯時的方式,主要有樣式名是否保持,輸出的樣式格式。
  • 添加resourceQuery識別,并給對應的內容加type: 'css/module';Rspack默認會對type: 'css/module'的代碼當做cssModules編譯,這個用法會比使用css-loader+style-loader更方便。

具體配置實現參考如下:

const postcssLoader = {
  loader: require.resolve('postcss-loader'),
  options: {
    // ...此處省略less-loader配置
  }
};


const lessLoader = {
  loader: require.resolve('less-loader'),
  options: {
    // ...此處省略less-loader配置
  }
}


export default {
  builtins: {
    css: {
      // cssModule默認配置
      modules: {
        // class保持原樣輸出
        localsConvention: 'asIs',
        // class轉換后的格式,localIdentName跟css-loader并不完全兼容,比如[hash:base64:5]這種寫法就會報錯
        localIdentName: '[local]_[hash:8]',
      },
    },
  },
  module: {
    rules: [
      {
        test: /\.(j|t)s(x)?$/,
        loader: 'builtin:swc-loader',
        options: {
          experimental: {
            plugins: [
              // ...此處其他配置內容
              // 添加 swc-plugin-auto-css-modules 插件執行?modules的注入
              [require.resolve('swc-plugin-auto-css-modules'), {}]
            ]
          }
        },
      },
      {
        test: /\.css(\?.*)?$/,
        oneOf: [
          {
            // 通過resourceQuery來匹配?modules
            resourceQuery: /modules/,
            use: [postcssLoader],
            // type聲明指定為cssModules解析
            type: 'css/module'
          },
          {
            use: [postcssLoader],
            // type聲明指定為普通css解析
            type: 'css'
          },
        ]
      },
      {
        test: /\.less(\?.*)?$/,
        oneOf: [
          {
            resourceQuery: /modules/,
            use: [postcssLoader, lessLoader],
            type: 'css/module'
          },
          {
            use: [postcssLoader, lessLoader],
            type: 'css'
          },
        ]
      },
    ]
  }
}

但實際上上述的配置并不能直接跑起來,運行時會提示構建報錯(RuntimeError: out of bounds memory accesSS),錯誤如下圖:

圖片圖片

結合github上的相關issue最終定位為swc_core版本不兼容的問題導致。

原因詳解:

  • Rspack使用的swc_core為0.88.x~0.89.x對應@swc/core為@swc/core@1.3.106~@swc/core@1.3.107(swc官網可見)。
  • swc-plugin-auto-css-modules的@1.6.0雖然在文檔上寫著是兼容>= 1.3.106版本,但實際上由于其內部使用了swc_core@0.90.13(詳見Github源碼)。
  • 但swc在0.90.x進行了ast的重構,跟之前的版本有了較大出入,導致無法生成的wasm調用無法兼容。

問題解決辦法:實際上只要通過將swc-plugin-auto-css-modules的swc_core版本修改為0.88.x~0.89.x這個范圍內,再編譯出新的wasm文件即可解決;若有其他類似情況,也可以借鑒一下。

具體操作步驟:

  • 將swc-plugin-auto-css-modules的swc_core修改版本后,在本地構建生成一個wasm文件,并放到項目內。
  • swc的plugin修改為引入本地構建的wasm文件,其配置如下。
plugins: [
  // ...此處其他配置內容
  // 添加 swc-plugin-auto-css-modules 插件執行?modules的注入
  // 刪掉原有的 swc-plugin-auto-css-modules 引入
  - [require.resolve('swc-plugin-auto-css-modules'), {}]
  // 修改為引入項目相對目錄下的swc_plugin_auto_css_modules.wasm(因為開源的發版有發版周期,先進行自編譯使用)
  + [path.join(__dirname, '../../swc-plugins/swc_plugin_auto_css_modules.wasm'), {}],
]

影響編譯效率的devtool: "source-map"

在以往使用webpack的devtool時,也能感受到有一定的性能開銷;同時在Rspack中,官方文檔中也有說明當devtool開啟并設置sourcemap時有性能開銷。官方文檔:

圖片圖片

實際體驗下來,source-map的模式損耗確實是大,大約會增加30%的耗時,而其他一些模式在構建損耗上會有所優化,具體可視使用情況來選擇建議在開發測試環境不使用,僅在線上等需要的環境開啟。相同應用和機器環境,不同devtool的幾種測試表現如下:

devtool: source-map(40.82s)devtool: source-map(40.82s)

devtool: cheap-module-source-map(39.46s)devtool: cheap-module-source-map(39.46s)

devtool: eval(32.94s)devtool: eval(32.94s)

devtool: false (31.21s)devtool: false (31.21s)

可能你不知道的低效代碼

在前面的內容中有提到babel-plugin-import按需引入的利器,但在業務項目中也有發現,應用/組件中有直接引入.../dist/antd.less的情況。若在項目中有這種情況,實際上就是打包了多次antd的樣式,非但沒有作用反而讓構建打包和應用訪問性能更差。

以下為英特爾i5芯片差異情況(M2等芯片在耗時上會縮小一些):

在css-moduels中(比如:大多數頁面less、組件less):每引入一次,大約增加6~7s左右構建時間,css文件大約增加660kb。

在非css-moduels中(比如:global.less):每引入一次,大約增加4~5s構建時間,css文件大約增加530kb。

??????:建議平時項目中排查注意一下,可以將此類代碼進行刪除,一個小小的習慣就可以直接提升不小的構建和訪問性能。

七、未來規劃

整個項目過程下來,收獲頗豐。一個是對前端構建以及Rust方面有了更多的認識,另外在接入過程中,也對當前的應用現狀和技術體系由了更深入的了解。但當前項目主要服務于自身的業務的開發測試環境,使用范圍還相對比較窄,還存在一些轉換能力缺失的情況。未來將持續完善現有的構建轉換能力,來拓展更多的業務應用場景。

八、特別說明

由于文章內的相關內容實踐已經落地有了一段時間,文章內的一些內容可能已經發生了變化,若存在出入煩請以相應產品的官方介紹為準。比如:Rspack的新版本已經升級了swc_core到v0.91.x~v0.93.x兼容了swc-plugin-auto-css-modules的1.6.0版本,Turbopack計劃未來全面支持webpack的相關工具特性等。

相關參考資料站點:

  • Rspack:https://www.rspack.dev/
  • UmiJS: https://umijs.org/
  • Webpack:https://webpack.js.org/
  • SWC:https://swc.rs/
  • Vite:https://cn.vitejs.dev/guide/
  • Turbopack:https://turbo.build/pack
責任編輯:武曉燕 來源: 得物技術
相關推薦

2023-08-16 19:14:02

微前端

2025-09-28 01:22:00

AI前后端智能化

2022-08-26 09:51:33

Web前端自動化

2024-06-04 22:04:39

2023-07-26 18:38:17

Json提效全量

2020-09-17 14:55:43

大數據

2022-07-08 11:18:33

前端實踐自動化

2023-11-22 19:10:42

前端父應用文案

2009-02-27 15:09:00

傳真服務器企業服務器

2025-02-26 12:00:00

JavaScript代碼開發

2025-09-09 07:05:00

JavaScrip代碼開發

2023-12-27 18:15:42

組裝式生態提效開發中心

2022-10-20 08:34:09

圖像算法商品

2024-03-07 07:31:20

畫像標簽算法業務數據

2025-08-18 13:55:08

2022-04-28 12:17:26

瀏覽器連字符hyphens

2025-09-30 07:12:21

2023-12-07 07:02:00

大倉權限設計
點贊
收藏

51CTO技術棧公眾號

四虎884aa成人精品| 五月婷婷激情久久| 日韩一级片免费| 国产亚洲激情| 亚洲欧洲在线免费| 中文字幕在线综合| sm在线观看| 久久久久久电影| 91情侣偷在线精品国产| 成年人午夜视频| 日韩欧美字幕| 亚洲精品国产精品国自产在线 | 欧美日韩在线精品一区二区三区激情综| 国产精品乱看| 久久亚洲精品中文字幕冲田杏梨 | 精品一区二区三区中文字幕视频 | 国产一区二区四区| 高清毛片在线看| 成人免费视频免费观看| 国产精品女主播视频| 久久无码精品丰满人妻| av在线不卡免费观看| 日韩欧美亚洲一区二区| 91在线视频观看免费| 里番在线播放| 亚洲欧洲精品一区二区精品久久久| 国产精品久久久久久久免费大片| 自拍偷拍精品视频| 亚洲女人av| 欧美片一区二区三区| 夫妇露脸对白88av| 亚洲国产欧美日韩在线观看第一区 | 日韩精品久久久久久久玫瑰园| 天天干天天av| 精精国产xxxx视频在线播放| 欧美国产激情二区三区 | 婷婷丁香激情网| 黄色aa久久| 一区二区三区在线观看国产 | 国产美女性感在线观看懂色av| 国产精品一区二区三区四区| 国产精品午夜视频| 自拍偷拍福利视频| 亚洲视频1区| 日韩中文字幕在线视频播放| 天天躁夜夜躁狠狠是什么心态| 欧美激情99| 亚洲成人黄色网址| www.四虎在线| 国产精品videossex| 欧美日韩激情一区二区| 另类小说色综合| 国产69精品久久久久按摩| 在线免费观看成人短视频| 91麻豆天美传媒在线| 大胆av不用播放器在线播放| 久久久久久久久久看片| 欧美精品中文字幕一区二区| 视频二区在线| 久久久久久久久久久久久久久99 | 99精品视频免费版的特色功能| 日韩电影精品| 欧美丰满少妇xxxbbb| 日韩av三级在线| 怡红院av在线| 亚洲一级二级三级在线免费观看| 日韩久久久久久久久久久久| 国产蜜臀一区二区打屁股调教| 一区二区成人在线| 国产妇女馒头高清泬20p多| 国产h片在线观看| 欧美日韩中文字幕综合视频| 毛片av免费在线观看| 日本另类视频| 777久久久精品| 成人三级做爰av| 麻豆一区二区麻豆免费观看| 亚洲美女喷白浆| 男女全黄做爰文章| 欧美一区综合| 456亚洲影院| 中文字幕欧美色图| 国产精品12区| 欧美一二三区| 黄色在线观看网站| 亚洲va在线va天堂| 91av俱乐部| 9.1麻豆精品| 亚洲国产精彩中文乱码av| 色婷婷在线影院| 91精品高清| 2019中文字幕在线| 91亚洲国产成人精品一区| 国产成人精品一区二区三区网站观看| 精品国产免费人成电影在线观...| 国产香蕉在线| 一卡二卡三卡日韩欧美| www黄色日本| 亚洲精品一区二区在线播放∴| 欧美videofree性高清杂交| 好吊一区二区三区视频| 久久在线视频| 8x拔播拔播x8国产精品| 91福利在线观看视频| 99精品黄色片免费大全| 一级二级三级欧美| 老牛影视精品| 日韩一卡二卡三卡四卡| 亚洲AV无码片久久精品| 国色天香一区二区| 国产精品视频999| 日批视频免费播放| 亚洲欧洲色图综合| 亚洲熟妇av一区二区三区| 伊人久久噜噜噜躁狠狠躁| 亚洲天堂第一页| 日韩av无码中文字幕| 狠狠狠色丁香婷婷综合激情| 欧美日韩国产高清视频| 久久免费电影| 91精品国产麻豆| 日韩视频在线观看免费视频| 日韩午夜高潮| 99国产在线观看| 欧美一区二区三区| 日本韩国一区二区三区视频| 无码任你躁久久久久久老妇| 婷婷丁香综合| 国产精品欧美一区二区三区奶水| www香蕉视频| 综合电影一区二区三区 | 国内精品国产成人| 色999日韩自偷自拍美女| av在线免费观看网址| 欧美久久久久久久久| 波多野在线播放| 国产精品主播| 精品久久蜜桃| caoprom在线| 欧美tk—视频vk| 久草综合在线视频| 国产在线精品一区二区三区不卡| 亚洲精品在线视频观看| 成人日韩在线| 在线视频欧美日韩精品| 高潮毛片又色又爽免费 | 久久五月精品中文字幕| 欧美一区二区黄色| 午夜69成人做爰视频| 国产一区二区中文字幕| 懂色av一区二区三区四区五区| 国内欧美日韩| 中国china体内裑精亚洲片| 人人妻人人爽人人澡人人精品| 99国产麻豆精品| 91九色在线观看视频| 亚洲图区在线| 国产91九色视频| 福利成人在线观看| 欧美午夜寂寞影院| 国产精品视频一区二区在线观看| 久久精品国产第一区二区三区| 亚洲精品第一区二区三区| abab456成人免费网址| 中文字幕一精品亚洲无线一区 | 日韩一级大片在线观看| 久久久国产成人| 不卡的av电影在线观看| 久久久久久免费看| 久操成人av| 国产精品美乳一区二区免费| 日本中文字幕电影在线免费观看 | 色欧美自拍视频| 91在线观看免费| av免费在线视| 亚洲性线免费观看视频成熟| 在线观看国产小视频| 亚洲天堂免费看| jjzzjjzz欧美69巨大| 免费欧美在线| 亚洲天堂电影网| 日韩中文字幕| 日本国产一区二区三区| 一本一道波多野毛片中文在线| 91精品国产福利在线观看 | 在线中文资源天堂| 日韩欧美www| 日批视频免费在线观看| 亚洲视频中文字幕| 国产精品无码在线| 美美哒免费高清在线观看视频一区二区| 综合视频免费看| 欧美日韩夜夜| 成人激情综合网| 欧美男男tv网站在线播放| 正在播放欧美视频| 色欲久久久天天天综合网| 欧美图区在线视频| 日本少妇性高潮| 国产精品成人在线观看| 99久久人妻精品免费二区| 美日韩一区二区三区| 日韩人妻无码精品久久久不卡| 国模精品一区| 国产精品中出一区二区三区| 懂色aⅴ精品一区二区三区| 欧美极品在线播放| 美女羞羞视频在线观看| 日韩av在线最新| 国产高中女学生第一次| 91国偷自产一区二区使用方法| 九九久久免费视频| 国产精品福利av| 高潮毛片无遮挡| 成人高清视频在线观看| 中文字幕在线视频一区二区三区 | 欧美性视频精品| av网站大全在线| 在线日韩第一页| 丝袜视频国产在线播放| 精品少妇一区二区三区在线播放| 中文字幕人妻互换av久久| 欧美午夜激情在线| 国语对白一区二区| 一区二区理论电影在线观看| 小泽玛利亚一区| 欧美极品少妇xxxxⅹ高跟鞋| 亚洲av无码一区二区二三区| 成人综合婷婷国产精品久久免费| 日韩a一级欧美一级| 久久成人免费网| 超碰在线公开97| 日韩av二区在线播放| 男人亚洲天堂网| 国产精品婷婷| 黄色成人在线看| 日韩一级不卡| 欧美日韩精品在线一区二区| 激情欧美日韩| www.一区二区.com| 自拍偷拍欧美| 日韩中文字幕亚洲精品欧美| 99久久99热这里只有精品| 亚洲无玛一区| 欧美国产偷国产精品三区| 亚洲一二三区精品| 日韩88av| 一区二区三视频| 国产精品国产一区| 色撸撸在线观看| 欧美精品入口| 国产一级做a爰片久久毛片男| 欧美福利专区| 青青在线免费观看| 一本不卡影院| 人妻少妇被粗大爽9797pw| 香蕉久久夜色精品| 日韩av播放器| 另类中文字幕网| 亚洲精品国产一区二区三区| 国产精品中文字幕欧美| 国产无套精品一区二区三区| 不卡的av在线播放| 青青草福利视频| 中文文精品字幕一区二区| 国产黄色录像视频| 亚洲精品精品亚洲| 日本少妇xxxx动漫| 91国内精品野花午夜精品| 在线黄色av网站| 欧美喷水一区二区| 亚洲成人一级片| 亚洲欧美国产高清va在线播| 91伦理视频在线观看| 色偷偷偷亚洲综合网另类| 成人影院在线观看| 91av在线影院| 成人在线不卡| 国产成人看片| 宅男在线一区| 福利网在线观看| 亚洲乱亚洲高清| 九一精品在线观看| 国产成人自拍网| 亚洲第一成人网站| 亚洲色图在线视频| 91九色丨porny丨肉丝| 欧美日韩一区三区四区| 丰满人妻一区二区三区免费视频| 日韩毛片在线观看| caopen在线视频| 欧美做爰性生交视频| 精品一区二区三区亚洲| 蜜桃成人在线| 欧美精选一区| 黄色aaa级片| 不卡av免费在线观看| 毛片视频免费播放| 精品成人乱色一区二区| 一区二区精品视频在线观看| 亚洲成色777777女色窝| 色大18成网站www在线观看| 91精品国产91久久久久久吃药 | 香蕉国产精品偷在线观看不卡| 色婷婷.com| 久久综合国产精品| 久久国产在线观看| 欧美麻豆精品久久久久久| 同心难改在线观看| 久久国产精品99国产精| 国产精成人品2018| 免费看国产精品一二区视频| 女人天堂亚洲aⅴ在线观看| 熟妇人妻无乱码中文字幕真矢织江| 国产成人在线免费| 一本在线免费视频| 一本一本久久a久久精品综合麻豆| av中文字幕在线免费观看| 一区二区欧美日韩视频| 国产乱码精品一区二三赶尸艳谈| 亚洲一区免费网站| 久久视频国产| 亚洲一区二区三区四区五区xx| 91最新地址在线播放| 青青青在线视频| 91精品国产一区二区三区蜜臀| 国产三级视频在线播放线观看| 91sa在线看| 成人资源在线播放| 超级碰在线观看| 韩国一区二区视频| 黄色一级片一级片| 欧洲视频一区二区| 黄色av网站在线看| 日本成人精品在线| 亚洲精品亚洲人成在线| 国产精品久久中文字幕| 国产 欧美在线| 久久婷婷一区二区| 精品不卡在线视频| 国产高清在线a视频大全| 91视频免费在线观看| 欧美成人国产| 人妻少妇偷人精品久久久任期| 亚洲图片激情小说| 国产99视频在线| 不卡毛片在线看| 国产精品3区| 亚洲啊啊啊啊啊| 大尺度一区二区| 国产成人精品片| 亚洲免费视频一区二区| 日韩成人动漫| 先锋影音网一区| 久热成人在线视频| 中文字幕av播放| 4438成人网| 蜜乳av一区| 黄色99视频| 日韩专区中文字幕一区二区| 免费网站在线高清观看| 欧美日免费三级在线| 国产在线高潮| 国产麻豆日韩| 久久亚洲图片| 国产jizz18女人高潮| 欧美精品 日韩| 女人黄色免费在线观看| 欧美日韩成人激情| 免费视频网站在线观看入口| 亚洲免费精彩视频| 成人网ww555视频免费看| 亚洲图色在线| 国产传媒欧美日韩成人| 久久精品视频9| 亚洲另类图片色| 成人一区视频| 日韩成人手机在线| 久久综合色婷婷| 伊人网站在线观看| 久久国产精品久久久久久久久久| 国产精品一区二区三区美女| 韩国日本在线视频| 亚洲日韩欧美一区二区在线| 亚洲精品综合网| 国产激情999| 欧美成人69av| 男人天堂av电影| 欧美一区二区啪啪| 欧美91看片特黄aaaa| 日本精品免费视频| 26uuu国产一区二区三区| 亚洲一区二区色| 午夜精品久久久99热福利| 秋霞欧美视频| 制服丝袜在线第一页| 欧美日韩亚洲高清一区二区| 国产蜜臀一区二区打屁股调教| 日本一区网站| fc2成人免费人成在线观看播放|