日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

“睡服”面试官系列第十一篇之module加载实现(建议收藏学习)

發(fā)布時間:2023/12/10 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 “睡服”面试官系列第十一篇之module加载实现(建议收藏学习) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

1. 瀏覽器加載

1.1傳統(tǒng)方法

1.2加載規(guī)則

2. ES6 模塊與 CommonJS 模塊的差異

3. Node 加載

3.1概述

3.2內(nèi)部變量

4ES6 模塊加載 CommonJS 模塊

5CommonJS 模塊加載 ES6 模塊

6循環(huán)加載

6.1CommonJS 模塊的加載原理

6.2CommonJS 模塊的循環(huán)加載

7ES6 模塊的循環(huán)加載

8ES6 模塊的轉(zhuǎn)碼

8.1ES6 module transpiler

8.2SystemJS

總結(jié)

“睡服“面試官系列之各系列目錄匯總(建議學(xué)習(xí)收藏)


1. 瀏覽器加載

1.1傳統(tǒng)方法

HTML 網(wǎng)頁中,瀏覽器通過 <script> 標(biāo)簽加載 JavaScript 腳本

<!-- 頁面內(nèi)嵌的腳本 --> <script type="application/javascript"> // module code </script> <!-- 外部腳本 --> <script type="application/javascript" src="path/to/myModule.js"> </script>

上面代碼中,由于瀏覽器腳本的默認(rèn)語言是 JavaScript,因此 type="application/javascript" 可以省略。
默認(rèn)情況下,瀏覽器是同步加載 JavaScript 腳本,即渲染引擎遇到 <script> 標(biāo)簽就會停下來,等到執(zhí)行完腳本,再繼續(xù)向下渲染。如果是外部腳本,還
必須加入腳本下載的時間。
如果腳本體積很大,下載和執(zhí)行的時間就會很長,因此造成瀏覽器堵塞,用戶會感覺到瀏覽器“卡死”了,沒有任何響應(yīng)。這顯然是很不好的體驗(yàn),所以瀏覽
器允許腳本異步加載,下面就是兩種異步加載的語法

<script src="path/to/myModule.js" defer></script> <script src="path/to/myModule.js" async></script>

上面代碼中, <script> 標(biāo)簽打開 defer 或 async 屬性,腳本就會異步加載。渲染引擎遇到這一行命令,就會開始下載外部腳本,但不會等它下載和執(zhí)行,
而是直接執(zhí)行后面的命令。
defer 與 async 的區(qū)別是: defer 要等到整個頁面在內(nèi)存中正常渲染結(jié)束(DOM 結(jié)構(gòu)完全生成,以及其他腳本執(zhí)行完成),才會執(zhí)行; async 一旦下載
完,渲染引擎就會中斷渲染,執(zhí)行這個腳本以后,再繼續(xù)渲染。一句話, defer 是“渲染完再執(zhí)行”, async 是“下載完就執(zhí)行”。另外,如果有多個 defer
腳本,會按照它們在頁面出現(xiàn)的順序加載,而多個 async 腳本是不能保證加載順序的。

1.2加載規(guī)則

瀏覽器加載 ES6 模塊,也使用 <script> 標(biāo)簽,但是要加入 type="module" 屬性。

<script type="module" src="./foo.js"></script>

上面代碼在網(wǎng)頁中插入一個模塊 foo.js ,由于 type 屬性設(shè)為 module ,所以瀏覽器知道這是一個 ES6 模塊。
瀏覽器對于帶有 type="module" 的 <script> ,都是異步加載,不會造成堵塞瀏覽器,即等到整個頁面渲染完,再執(zhí)行模塊腳本,等同于打開了 <script>
標(biāo)簽的 defer 屬性

<script type="module" src="./foo.js"></script> <!-- 等同于 --> <script type="module" src="./foo.js" defer></script>

如果網(wǎng)頁有多個 <script type="module"> ,它們會按照在頁面出現(xiàn)的順序依次執(zhí)行。
<script> 標(biāo)簽的 async 屬性也可以打開,這時只要加載完成,渲染引擎就會中斷渲染立即執(zhí)行。執(zhí)行完成后,再恢復(fù)渲染

<script type="module" src="./foo.js" async></script>

一旦使用了 async 屬性, <script type="module"> 就不會按照在頁面出現(xiàn)的順序執(zhí)行,而是只要該模塊加載完成,就執(zhí)行該模塊。
ES6 模塊也允許內(nèi)嵌在網(wǎng)頁中,語法行為與加載外部腳本完全一致

<script type="module"> import utils from "./utils.js"; // other code </script>

對于外部的模塊腳本(上例是 foo.js ),有幾點(diǎn)需要注意。
代碼是在模塊作用域之中運(yùn)行,而不是在全局作用域運(yùn)行。模塊內(nèi)部的頂層變量,外部不可見。
模塊腳本自動采用嚴(yán)格模式,不管有沒有聲明 use strict 。
模塊之中,可以使用 import 命令加載其他模塊( .js 后綴不可省略,需要提供絕對 URL 或相對 URL),也可以使用 export 命令輸出對外接口。
模塊之中,頂層的 this 關(guān)鍵字返回 undefined ,而不是指向 window 。也就是說,在模塊頂層使用 this 關(guān)鍵字,是無意義的。
同一個模塊如果加載多次,將只執(zhí)行一次。
下面是一個示例模塊

import utils from 'https://example.com/js/utils.js'; const x = 1; console.log(x === window.x); //false console.log(this === undefined); // true delete x; // 句法錯誤,嚴(yán)格模式禁止刪除變量

利用頂層的 this 等于 undefined 這個語法點(diǎn),可以偵測當(dāng)前代碼是否在 ES6 模塊之中

const isNotModuleScript = this !== undefined;

2. ES6 模塊與 CommonJS 模塊的差異

討論 Node 加載 ES6 模塊之前,必須了解 ES6 模塊與 CommonJS 模塊完全不同。
它們有兩個重大差異。
CommonJS 模塊輸出的是一個值的拷貝,ES6 模塊輸出的是值的引用。
CommonJS 模塊是運(yùn)行時加載,ES6 模塊是編譯時輸出接口。
第二個差異是因?yàn)?CommonJS 加載的是一個對象(即 module.exports 屬性),該對象只有在腳本運(yùn)行完才會生成。而 ES6 模塊不是對象,它的對外接
口只是一種靜態(tài)定義,在代碼靜態(tài)解析階段就會生成。
下面重點(diǎn)解釋第一個差異。
CommonJS 模塊輸出的是值的拷貝,也就是說,一旦輸出一個值,模塊內(nèi)部的變化就影響不到這個值。請看下面這個模塊文件 lib.js 的例子。

// lib.js var counter = 3; function incCounter() { counter++; } module.exports = { counter: counter, incCounter: incCounter, };

上面代碼輸出內(nèi)部變量 counter 和改寫這個變量的內(nèi)部方法 incCounter 。然后,在 main.js 里面加載這個模塊。

// main.js var mod = require('./lib'); console.log(mod.counter); // 3 mod.incCounter(); console.log(mod.counter); // 3

上面代碼說明, lib.js 模塊加載以后,它的內(nèi)部變化就影響不到輸出的 mod.counter 了。這是因?yàn)?mod.counter 是一個原始類型的值,會被緩存。除非寫
成一個函數(shù),才能得到內(nèi)部變動后的值。

// lib.js var counter = 3; function incCounter() { counter++; } module.exports = { get counter() { return counter }, incCounter: incCounter, };

上面代碼中,輸出的 counter 屬性實(shí)際上是一個取值器函數(shù)。現(xiàn)在再執(zhí)行 main.js ,就可以正確讀取內(nèi)部變量 counter 的變動了。

$ node main.js 3 4

ES6 模塊的運(yùn)行機(jī)制與 CommonJS 不一樣。JS 引擎對腳本靜態(tài)分析的時候,遇到模塊加載命令 import ,就會生成一個只讀引用。等到腳本真正執(zhí)行
時,再根據(jù)這個只讀引用,到被加載的那個模塊里面去取值。換句話說,ES6 的 import 有點(diǎn)像 Unix 系統(tǒng)的“符號連接”,原始值變了, import 加載的值

也會跟著變。因此,ES6 模塊是動態(tài)引用,并且不會緩存值,模塊里面的變量綁定其所在的模塊。
還是舉上面的例子。

// lib.js export let counter = 3; export function incCounter() { counter++; } // main.js import { counter, incCounter } from './lib'; console.log(counter); // 3 incCounter(); console.log(counter); // 4

上面代碼說明,ES6 模塊輸入的變量 counter 是活的,完全反應(yīng)其所在模塊 lib.js 內(nèi)部的變化。
再舉一個出現(xiàn)在 export 一節(jié)中的例子

// m1.js export var foo = 'bar'; setTimeout(() => foo = 'baz', 500); // m2.js import {foo} from './m1.js'; console.log(foo); setTimeout(() => console.log(foo), 500);

上面代碼中, m1.js 的變量 foo ,在剛加載時等于 bar ,過了 500 毫秒,又變?yōu)榈扔?baz 。
讓我們看看, m2.js 能否正確讀取這個變化。

$ babel-node m2.js bar baz

上面代碼表明,ES6 模塊不會緩存運(yùn)行結(jié)果,而是動態(tài)地去被加載的模塊取值,并且變量總是綁定其所在的模塊。
由于 ES6 輸入的模塊變量,只是一個“符號連接”,所以這個變量是只讀的,對它進(jìn)行重新賦值會報(bào)錯。

// lib.js export let obj = {}; // main.js import { obj } from './lib'; obj.prop = 123; // OK obj = {}; // TypeError

上面代碼中, main.js 從 lib.js 輸入變量 obj ,可以對 obj 添加屬性,但是重新賦值就會報(bào)錯。因?yàn)樽兞?obj 指向的地址是只讀的,不能重新賦值,這就
好比 main.js 創(chuàng)造了一個名為 obj 的 const 變量。
最后, export 通過接口,輸出的是同一個值。不同的腳本加載這個接口,得到的都是同樣的實(shí)例

// mod.js function C() { this.sum = 0; this.add = function () { this.sum += 1; }; this.show = function () { console.log(this.sum); }; } export let c = new C();

上面的腳本 mod.js ,輸出的是一個 C 的實(shí)例。不同的腳本加載這個模塊,得到的都是同一個實(shí)例

// x.js import {c} from './mod'; c.add(); // y.js import {c} from './mod'; c.show() // main.js import './x'; import './y';

現(xiàn)在執(zhí)行 main.js ,輸出的是 1?

$ babel-node main.js 1

這就證明了 x.js 和 y.js 加載的都是 C 的同一個實(shí)例

3. Node 加載

3.1概述

Node 對 ES6 模塊的處理比較麻煩,因?yàn)樗凶约旱?CommonJS 模塊格式,與 ES6 模塊格式是不兼容的。目前的解決方案是,將兩者分開,ES6 模塊
和 CommonJS 采用各自的加載方案。
Node 要求 ES6 模塊采用 .mjs 后綴文件名。也就是說,只要腳本文件里面使用 import 或者 export 命令,那么就必須采用 .mjs 后綴名。 require 命令不
能加載 .mjs 文件,會報(bào)錯,只有 import 命令才可以加載 .mjs 文件。反過來, .mjs 文件里面也不能使用 require 命令,必須使用 import 。
目前,這項(xiàng)功能還在試驗(yàn)階段。安裝 Node v8.5.0 或以上版本,要用 --experimental-modules 參數(shù)才能打開該功能

$ node --experimental-modules my-app.mjs

為了與瀏覽器的 import 加載規(guī)則相同,Node 的 .mjs 文件支持 URL 路徑

import './foo?query=1'; // 加載 ./foo 傳入?yún)?shù) ?query=1

上面代碼中,腳本路徑帶有參數(shù) ?query=1 ,Node 會按 URL 規(guī)則解讀。同一個腳本只要參數(shù)不同,就會被加載多次,并且保存成不同的緩存。由于這個
原因,只要文件名中含有 : 、 % 、 # 、 ? 等特殊字符,最好對這些字符進(jìn)行轉(zhuǎn)義。
目前,Node 的 import 命令只支持加載本地模塊( file: 協(xié)議),不支持加載遠(yuǎn)程模塊。
如果模塊名不含路徑,那么 import 命令會去 node_modules 目錄尋找這個模塊。

import 'baz'; import 'abc/123';

如果模塊名包含路徑,那么 import 命令會按照路徑去尋找這個名字的腳本文件

import 'file:///etc/config/app.json'; import './foo'; import './foo?search'; import '../bar'; import '/baz';

如果腳本文件省略了后綴名,比如 import './foo' ,Node 會依次嘗試四個后綴名: ./foo.mjs 、 ./foo.js 、 ./foo.json 、 ./foo.node 。如果這些腳
本文件都不存在,Node 就會去加載 ./foo/package.json 的 main 字段指定的腳本。如果 ./foo/package.json 不存在或者沒有 main 字段,那么就會依次
加載 ./foo/index.mjs 、 ./foo/index.js 、 ./foo/index.json 、 ./foo/index.node 。如果以上四個文件還是都不存在,就會拋出錯誤。
最后,Node 的 import 命令是異步加載,這一點(diǎn)與瀏覽器的處理方法相同

3.2內(nèi)部變量

ES6 模塊應(yīng)該是通用的,同一個模塊不用修改,就可以用在瀏覽器環(huán)境和服務(wù)器環(huán)境。為了達(dá)到這個目標(biāo),Node 規(guī)定 ES6 模塊之中不能使用
CommonJS 模塊的特有的一些內(nèi)部變量。
首先,就是 this 關(guān)鍵字。ES6 模塊之中,頂層的 this 指向 undefined ;CommonJS 模塊的頂層 this 指向當(dāng)前模塊,這是兩者的一個重大差異。
其次,以下這些頂層變量在 ES6 模塊之中都是不存在的

arguments
require
module
exports
__filename
__dirname

如果你一定要使用這些變量,有一個變通方法,就是寫一個 CommonJS 模塊輸出這些變量,然后再用 ES6 模塊加載這個 CommonJS 模塊。但是這樣
一來,該 ES6 模塊就不能直接用于瀏覽器環(huán)境了,所以不推薦這樣做。

// expose.js module.exports = {__dirname}; // use.mjs import expose from './expose.js'; const {__dirname} = expose;

上面代碼中, expose.js 是一個 CommonJS 模塊,輸出變量 __dirname ,該變量在 ES6 模塊之中不存在。ES6 模塊加載 expose.js ,就可以得到
__dirname 。

4ES6 模塊加載 CommonJS 模塊

CommonJS 模塊的輸出都定義在 module.exports 這個屬性上面。Node 的 import 命令加載 CommonJS 模塊,Node 會自動將 module.exports 屬
性,當(dāng)作模塊的默認(rèn)輸出,即等同于 export default xxx 。
下面是一個 CommonJS 模塊。

// a.js module.exports = { foo: 'hello', bar: 'world' }; // 等同于 export default { foo: 'hello', bar: 'world' };

import 命令加載上面的模塊, module.exports 會被視為默認(rèn)輸出,即 import 命令實(shí)際上輸入的是這樣一個對象 { default: module.exports } 。
所以,一共有三種寫法,可以拿到 CommonJS 模塊的 module.exports 。

// 寫法一 import baz from './a'; // baz = {foo: 'hello', bar: 'world'}; // 寫法二 import {default as baz} from './a'; // baz = {foo: 'hello', bar: 'world'}; // 寫法三 import * as baz from './a'; // baz = { // get default() {return module.exports;}, // get foo() {return this.default.foo}.bind(baz), // get bar() {return this.default.bar}.bind(baz) // }

上面代碼的第三種寫法,可以通過 baz.default 拿到 module.exports 。 foo 屬性和 bar 屬性就是可以通過這種方法拿到了 module.exports 。
下面是一些例子

// b.js module.exports = null; // es.js import foo from './b'; // foo = null; import * as bar from './b'; // bar = { default:null };

上面代碼中, es.js 采用第二種寫法時,要通過 bar.default 這樣的寫法,才能拿到 module.exports?

// c.js module.exports = function two() { return 2; }; // es.js import foo from './c'; foo(); // 2 import * as bar from './c'; bar.default(); // 2 bar(); // throws, bar is not a function

上面代碼中, bar 本身是一個對象,不能當(dāng)作函數(shù)調(diào)用,只能通過 bar.default 調(diào)用。
CommonJS 模塊的輸出緩存機(jī)制,在 ES6 加載方式下依然有效

// foo.js module.exports = 123; setTimeout(_ => module.exports = null);

上面代碼中,對于加載 foo.js 的腳本, module.exports 將一直是 123 ,而不會變成 null 。
由于 ES6 模塊是編譯時確定輸出接口,CommonJS 模塊是運(yùn)行時確定輸出接口,所以采用 import 命令加載 CommonJS 模塊時,不允許采用下面的寫
法。

// 不正確 import { readfile } from 'fs';

上面的寫法不正確,因?yàn)?fs 是 CommonJS 格式,只有在運(yùn)行時才能確定 readfile 接口,而 import 命令要求編譯時就確定這個接口。解決方法就是改
為整體輸入。

// 正確的寫法一 import * as express from 'express'; const app = express.default(); // 正確的寫法二 import express from 'express'; const app = express();

5CommonJS 模塊加載 ES6 模塊

CommonJS 模塊加載 ES6 模塊,不能使用 require 命令,而要使用 import() 函數(shù)。ES6 模塊的所有輸出接口,會成為輸入對象的屬性

// es.mjs let foo = { bar: 'my-default' }; export default foo; foo = null; // cjs.js const es_namespace = await import('./es'); // es_namespace = { // get default() { // ... // } // } console.log(es_namespace.default); // { bar:'my-default' }

上面代碼中, default 接口變成了 es_namespace.default 屬性。另外,由于存在緩存機(jī)制, es.js 對 foo 的重新賦值沒有在模塊外部反映出來。
下面是另一個例子。

// es.js export let foo = { bar:'my-default' }; export { foo as bar }; export function f() {}; export class c {}; // cjs.js const es_namespace = await import('./es'); // es_namespace = { // get foo() {return foo;} // get bar() {return foo;} // get f() {return f;} // get c() {return c;} // }

6循環(huán)加載

“循環(huán)加載”(circular dependency)指的是, a 腳本的執(zhí)行依賴 b 腳本,而 b 腳本的執(zhí)行又依賴 a 腳本。

// a.js var b = require('b'); // b.js var a = require('a');

通常,“循環(huán)加載”表示存在強(qiáng)耦合,如果處理不好,還可能導(dǎo)致遞歸加載,使得程序無法執(zhí)行,因此應(yīng)該避免出現(xiàn)。
但是實(shí)際上,這是很難避免的,尤其是依賴關(guān)系復(fù)雜的大項(xiàng)目,很容易出現(xiàn) a 依賴 b , b 依賴 c , c 又依賴 a 這樣的情況。這意味著,模塊加載機(jī)制必須考
慮“循環(huán)加載”的情況。
對于 JavaScript 語言來說,目前最常見的兩種模塊格式 CommonJS 和 ES6,處理“循環(huán)加載”的方法是不一樣的,返回的結(jié)果也不一樣。

6.1CommonJS 模塊的加載原理

介紹 ES6 如何處理“循環(huán)加載”之前,先介紹目前最流行的 CommonJS 模塊格式的加載原理。
CommonJS 的一個模塊,就是一個腳本文件。 require 命令第一次加載該腳本,就會執(zhí)行整個腳本,然后在內(nèi)存生成一個對象

{ id: '...', exports: { ... }, loaded: true, ... }

上面代碼就是 Node 內(nèi)部加載模塊后生成的一個對象。該對象的 id 屬性是模塊名, exports 屬性是模塊輸出的各個接口, loaded 屬性是一個布爾值,表
示該模塊的腳本是否執(zhí)行完畢。其他還有很多屬性,這里都省略了。
以后需要用到這個模塊的時候,就會到 exports 屬性上面取值。即使再次執(zhí)行 require 命令,也不會再次執(zhí)行該模塊,而是到緩存之中取值。也就是說,
CommonJS 模塊無論加載多少次,都只會在第一次加載時運(yùn)行一次,以后再加載,就返回第一次運(yùn)行的結(jié)果,除非手動清除系統(tǒng)緩存。

6.2CommonJS 模塊的循環(huán)加載

CommonJS 模塊的重要特性是加載時執(zhí)行,即腳本代碼在 require 的時候,就會全部執(zhí)行。一旦出現(xiàn)某個模塊被"循環(huán)加載",就只輸出已經(jīng)執(zhí)行的部
分,還未執(zhí)行的部分不會輸出。
讓我們來看,Node 官方文檔里面的例子。腳本文件 a.js 代碼如下。

exports.done = false; var b = require('./b.js'); console.log('在 a.js 之中,b.done = %j', b.done); exports.done = true; console.log('a.js 執(zhí)行完畢');

上面代碼之中, a.js 腳本先輸出一個 done 變量,然后加載另一個腳本文件 b.js 。注意,此時 a.js 代碼就停在這里,等待 b.js 執(zhí)行完畢,再往下執(zhí)行。
再看 b.js 的代碼。

exports.done = false; var a = require('./a.js'); console.log('在 b.js 之中,a.done = %j', a.done); exports.done = true; console.log('b.js 執(zhí)行完畢');

上面代碼之中, b.js 執(zhí)行到第二行,就會去加載 a.js ,這時,就發(fā)生了“循環(huán)加載”。系統(tǒng)會去 a.js 模塊對應(yīng)對象的 exports 屬性取值,可是因?yàn)?a.js
還沒有執(zhí)行完,從 exports 屬性只能取回已經(jīng)執(zhí)行的部分,而不是最后的值。
a.js 已經(jīng)執(zhí)行的部分,只有一行。

exports.done = false;

因此,對于 b.js 來說,它從 a.js 只輸入一個變量 done ,值為 false 。
然后, b.js 接著往下執(zhí)行,等到全部執(zhí)行完畢,再把執(zhí)行權(quán)交還給 a.js 。于是, a.js 接著往下執(zhí)行,直到執(zhí)行完畢。我們寫一個腳本 main.js ,驗(yàn)證這
個過程。

var a = require('./a.js'); var b = require('./b.js'); console.log('在 main.js 之中, a.done=%j, b.done=%j', a.done, b.done);

執(zhí)行 main.js ,運(yùn)行結(jié)果如下。

$ node main.js 在 b.js 之中,a.done = false b.js 執(zhí)行完畢 在 a.js 之中,b.done = true a.js 執(zhí)行完畢 在 main.js 之中, a.done=true, b.done=true

上面的代碼證明了兩件事。一是,在 b.js 之中, a.js 沒有執(zhí)行完畢,只執(zhí)行了第一行。二是, main.js 執(zhí)行到第二行時,不會再次執(zhí)行 b.js ,而是輸出
緩存的 b.js 的執(zhí)行結(jié)果,即它的第四行

exports.done = true;

總之,CommonJS 輸入的是被輸出值的拷貝,不是引用。
另外,由于 CommonJS 模塊遇到循環(huán)加載時,返回的是當(dāng)前已經(jīng)執(zhí)行的部分的值,而不是代碼全部執(zhí)行后的值,兩者可能會有差異。所以,輸入變量的
時候,必須非常小心。

var a = require('a'); // 安全的寫法 var foo = require('a').foo; // 危險的寫法 exports.good = function (arg) { return a.foo('good', arg); // 使用的是 a.foo 的最新值 }; exports.bad = function (arg) { return foo('bad', arg); // 使用的是一個部分加載時的值 };

上面代碼中,如果發(fā)生循環(huán)加載, require('a').foo 的值很可能后面會被改寫,改用 require('a') 會更保險一點(diǎn)

7ES6 模塊的循環(huán)加載

ES6 處理“循環(huán)加載”與 CommonJS 有本質(zhì)的不同。ES6 模塊是動態(tài)引用,如果使用 import 從一個模塊加載變量(即 import foo from 'foo' ),那些
變量不會被緩存,而是成為一個指向被加載模塊的引用,需要開發(fā)者自己保證,真正取值的時候能夠取到值。
請看下面這個例子。

// a.mjs import {bar} from './b'; console.log('a.mjs'); console.log(bar); export let foo = 'foo'; // b.mjs import {foo} from './a'; console.log('b.mjs'); console.log(foo); export let bar = 'bar'

上面代碼中, a.mjs 加載 b.mjs , b.mjs 又加載 a.mjs ,構(gòu)成循環(huán)加載。執(zhí)行 a.mjs ,結(jié)果如下

$ node --experimental-modules a.mjs b.mjs ReferenceError: foo is not defined

上面代碼中,執(zhí)行 a.mjs 以后會報(bào)錯, foo 變量未定義,這是為什么?
讓我們一行行來看,ES6 循環(huán)加載是怎么處理的。首先,執(zhí)行 a.mjs 以后,引擎發(fā)現(xiàn)它加載了 b.mjs ,因此會優(yōu)先執(zhí)行 b.mjs ,然后再執(zhí)行 a.js 。接
著,執(zhí)行 b.mjs 的時候,已知它從 a.mjs 輸入了 foo 接口,這時不會去執(zhí)行 a.mjs ,而是認(rèn)為這個接口已經(jīng)存在了,繼續(xù)往下執(zhí)行。執(zhí)行到第三行
console.log(foo) 的時候,才發(fā)現(xiàn)這個接口根本沒定義,因此報(bào)錯。
解決這個問題的方法,就是讓 b.mjs 運(yùn)行的時候, foo 已經(jīng)有定義了。這可以通過將 foo 寫成函數(shù)來解決。

// a.mjs import {bar} from './b'; console.log('a.mjs'); console.log(bar()); function foo() { return 'foo' } export {foo}; // b.mjs import {foo} from './a'; console.log('b.mjs'); console.log(foo()); function bar() { return 'bar' } export {bar};

這時再執(zhí)行 a.mjs 就可以得到預(yù)期結(jié)果

$ node --experimental-modules a.mjs b.mjs foo a.mjs bar

這是因?yàn)楹瘮?shù)具有提升作用,在執(zhí)行 import {bar} from './b' 時,函數(shù) foo 就已經(jīng)有定義了,所以 b.mjs 加載的時候不會報(bào)錯。這也意味著,如果把函
數(shù) foo 改寫成函數(shù)表達(dá)式,也會報(bào)錯

// a.mjs import {bar} from './b'; console.log('a.mjs'); console.log(bar()); const foo = () => 'foo'; export {foo};

上面代碼的第四行,改成了函數(shù)表達(dá)式,就不具有提升作用,執(zhí)行就會報(bào)錯。
我們再來看 ES6 模塊加載器SystemJS給出的一個例子

// even.js import { odd } from './odd' export var counter = 0; export function even(n) { counter++; return n === 0 || odd(n - 1); } // odd.js import { even } from './even'; export function odd(n) { return n !== 0 && even(n - 1); }

上面代碼中, even.js 里面的函數(shù) even 有一個參數(shù) n ,只要不等于 0,就會減去 1,傳入加載的 odd() 。 odd.js 也會做類似操作。
運(yùn)行上面這段代碼,結(jié)果如下

$ babel-node > import * as m from './even.js'; > m.even(10); true > m.counter 6 > m.even(20) true > m.counter 17

上面代碼中,參數(shù) n 從 10 變?yōu)?0 的過程中, even() 一共會執(zhí)行 6 次,所以變量 counter 等于 6。第二次調(diào)用 even() 時,參數(shù) n 從 20 變?yōu)?0,
even() 一共會執(zhí)行 11 次,加上前面的 6 次,所以變量 counter 等于 17。
這個例子要是改寫成 CommonJS,就根本無法執(zhí)行,會報(bào)錯

// even.js var odd = require('./odd'); var counter = 0; exports.counter = counter; exports.even = function (n) { counter++; return n == 0 || odd(n - 1); } // odd.js var even = require('./even').even; module.exports = function (n) { return n != 0 && even(n - 1); }

上面代碼中, even.js 加載 odd.js ,而 odd.js 又去加載 even.js ,形成“循環(huán)加載”。這時,執(zhí)行引擎就會輸出 even.js 已經(jīng)執(zhí)行的部分(不存在任何結(jié)
果),所以在 odd.js 之中,變量 even 等于 null ,等到后面調(diào)用 even(n-1) 就會報(bào)錯

$ node > var m = require('./even'); > m.even(10) TypeError: even is not a function

8ES6 模塊的轉(zhuǎn)碼

瀏覽器目前還不支持 ES6 模塊,為了現(xiàn)在就能使用,可以將轉(zhuǎn)為 ES5 的寫法。除了 Babel 可以用來轉(zhuǎn)碼之外,還有以下兩個方法,也可以用來轉(zhuǎn)碼

8.1ES6 module transpiler

ES6 module transpiler是 square 公司開源的一個轉(zhuǎn)碼器,可以將 ES6 模塊轉(zhuǎn)為 CommonJS 模塊或 AMD 模塊的寫法,從而在瀏覽器中使用。
首先,安裝這個轉(zhuǎn)碼器

$ npm install -g es6-module-transpiler

然后,使用 compile-modules convert 命令,將 ES6 模塊文件轉(zhuǎn)碼。

$ compile-modules convert file1.js file2.js

-o 參數(shù)可以指定轉(zhuǎn)碼后的文件名。

$ compile-modules convert -o out.js file1.js

8.2SystemJS

另一種解決方法是使用 SystemJS。它是一個墊片庫(polyfill),可以在瀏覽器內(nèi)加載 ES6 模塊、AMD 模塊和 CommonJS 模塊,將其轉(zhuǎn)為 ES5 格
式。它在后臺調(diào)用的是 Google 的 Traceur 轉(zhuǎn)碼器。
使用時,先在網(wǎng)頁內(nèi)載入 system.js 文件。

<script src="system.js"></script>

然后,使用 System.import 方法加載模塊文件

<script> System.import('./app.js'); </script>

上面代碼中的 ./app ,指的是當(dāng)前目錄下的 app.js 文件。它可以是 ES6 模塊文件, System.import 會自動將其轉(zhuǎn)碼。
需要注意的是, System.import 使用異步加載,返回一個 Promise 對象,可以針對這個對象編程。下面是一個模塊文件

// app/es6-file.js: export class q { constructor() { this.es6 = 'hello'; } }

然后,在網(wǎng)頁內(nèi)加載這個模塊文件

<script> System.import('app/es6-file').then(function(m) { console.log(new m.q().es6); // hello }); </script>

上面代碼中, System.import 方法返回的是一個 Promise 對象,所以可以用 then 方法指定回調(diào)函數(shù)。

總結(jié)

本博客源于本人閱讀相關(guān)書籍和視頻總結(jié),創(chuàng)作不易,謝謝點(diǎn)贊支持。學(xué)到就是賺到。我是歌謠,勵志成為一名優(yōu)秀的技術(shù)革新人員。

歡迎私信交流,一起學(xué)習(xí),一起成長。

推薦鏈接 其他文件目錄參照

“睡服“面試官系列之各系列目錄匯總(建議學(xué)習(xí)收藏)

總結(jié)

以上是生活随笔為你收集整理的“睡服”面试官系列第十一篇之module加载实现(建议收藏学习)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

97视频在线观看免费 | 五月婷婷激情综合网 | 日韩欧美网站 | 中文字幕中文字幕在线一区 | 激情中文在线 | 日日操日日 | 91精品啪 | 久久久久美女 | 国产成人一区二区精品非洲 | 免费a级大片 | 国产在线欧美 | www成人精品 | av网站地址| 中文字幕日韩一区二区三区不卡 | 日本一区二区三区免费观看 | 欧美一级特黄高清视频 | 中文字幕av有码 | 伊人色**天天综合婷婷 | 久久字幕 | 久久成人麻豆午夜电影 | 高清视频一区二区三区 | av噜噜噜在线播放 | 婷婷综合亚洲 | 国产高清视频免费最新在线 | 狠狠色噜噜狠狠狠狠 | 欧美性色综合网站 | 欧美日本不卡 | 国产一级二级在线观看 | 99久久精品免费 | 天天操天天爱天天干 | www.99久久.com | 人人要人人澡人人爽人人dvd | 超碰在线9 | 在线一区观看 | 九九三级毛片 | 激情开心网站 | 免费在线观看一区二区三区 | www色com| wwwwww国产| 午夜视频在线观看一区二区三区 | 中文字幕久久久精品 | 久久久久久久久久久久av | 日韩欧美视频在线 | 成年人免费在线播放 | 午夜日b视频 | 国产二区精品 | 91欧美视频网站 | 亚洲视频分类 | 亚洲 欧美日韩 国产 中文 | www天天干com | 精品成人免费 | 久久96国产精品久久99软件 | 亚洲黄色激情小说 | 2021国产视频 | 欧美日韩高清在线 | 天天拍夜夜拍 | 国产午夜精品免费一区二区三区视频 | 97香蕉超级碰碰久久免费软件 | 一区二区三区四区在线 | 91最新在线 | 日韩欧美一区二区三区视频 | 成年人在线免费视频观看 | 国产精品私人影院 | 亚洲国产精品传媒在线观看 | 男女拍拍免费视频 | 成人av影视在线 | 欧美日韩精品影院 | 精品国产精品久久 | 国产高清中文字幕 | 91视频91蝌蚪 | 91丨九色丨91啦蝌蚪老版 | 久久只有精品 | 成人精品福利 | 亚洲资源在线网 | 久久综合狠狠综合久久激情 | 一级黄色大片 | 久久精品久久精品久久 | 亚洲国产欧美一区二区三区丁香婷 | 美女久久久久久久久久久 | 狠狠干天天色 | 天天操天天射天天插 | 黄色成人影院 | 日本性动态图 | 狠狠干网址 | 日本在线精品视频 | 亚洲国产欧美一区二区三区丁香婷 | 中文字幕在线观看免费高清完整版 | 日日夜夜天天干 | 国产精品一区二区白浆 | 国产黄色免费看 | 国产一区二区视频在线 | 国产精品12| 美女久久视频 | 亚洲国产97在线精品一区 | 四虎在线视频免费观看 | 99精品国产免费久久 | 狠狠网亚洲精品 | 欧美精品久久久久久久亚洲调教 | 精品视频999 | 国产正在播放 | 中文字幕av网站 | 亚洲永久国产精品 | 美女视频黄频大全免费 | 久久伊人免费视频 | 天天爱天天射 | 在线视频 国产 日韩 | 久久中文字幕视频 | 在线观看自拍 | 精品久久网 | 亚洲综合成人婷婷小说 | 人人干97| 天堂成人在线 | 婷婷丁香国产 | 高清一区二区三区av | 婷婷视频导航 | 91最新网址 | 免费三级a | 国内99视频 | 国产美腿白丝袜足在线av | 日韩高清精品免费观看 | 五月婷婷激情 | 国产精品九九久久99视频 | 国产成人精品一区二区三区免费 | 精品国产理论 | 国产欧美高清 | 在线国产一区 | 在线观看黄网 | 久久久久久久久久久网 | 中文字幕美女免费在线 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 麻豆影视在线免费观看 | 国产精品自在欧美一区 | 久久久久激情视频 | 夜夜躁狠狠躁日日躁视频黑人 | 九九热免费视频在线观看 | 国产91在线 | 美洲 | av三级av| 麻豆精品传媒视频 | 韩国视频一区二区三区 | 国产午夜精品福利视频 | 免费中文字幕视频 | 99免费在线观看 | 国产精品高潮呻吟久久av无 | 婷婷在线网 | 国产精品麻 | 久久久久久久久久久久久久免费看 | 91精品国产高清自在线观看 | 九七人人干 | 久久国产精品99久久久久久进口 | 国产视频中文字幕 | 狠狠干狠狠色 | 一级片免费观看 | 日韩字幕在线观看 | 婷婷深爱网 | 99精品免费在线 | 97色在线视频 | 久久人人爽视频 | 日韩有码中文字幕在线 | 黄a在线观看 | 久草视频一区 | 天天干婷婷 | 日韩高清不卡在线 | 中文伊人 | 国产第一页福利影院 | 91精品国产自产91精品 | 91精品国产99久久久久 | 丁香六月伊人 | 国产亚洲精品成人av久久ww | 男女啪啪视屏 | 在线观看国产麻豆 | 色七七亚洲影院 | 中文字幕高清有码 | 国产特级毛片 | 国产91av视频在线观看 | 超碰97久久 | 中文字幕黄色网址 | 插综合网 | 色视频成人在线观看免 | 婷婷中文字幕在线观看 | 一区二区三区三区在线 | 在线激情影院一区 | 人人要人人澡人人爽人人dvd | 园产精品久久久久久久7电影 | 婷婷中文在线 | 欧美日韩国产精品一区二区 | 手机av电影在线观看 | 9草在线 | 久久午夜网 | 99久久精品免费看国产四区 | 色就是色综合 | 国产高清成人在线 | 91免费的视频在线播放 | 免费色视频网站 | 中文字幕乱码在线播放 | 92中文资源在线 | 国产中文字幕在线观看 | 欧洲亚洲精品 | 久久国产精品一区二区三区四区 | 中文字幕高清 | 成年人免费在线观看网站 | 91欧美视频网站 | 91亚洲在线| 日本在线观看一区 | 国产手机在线观看视频 | 激情av网址 | 国产理论在线 | 麻豆视传媒官网免费观看 | 久久看片网 | 亚洲欧美综合精品久久成人 | 欧洲精品在线视频 | 国产精品久久久久久久久久东京 | 精品九九九九 | 国产精品video| 成人在线视频免费看 | 久久久久麻豆v国产 | 午夜私人影院久久久久 | 久久在线视频在线 | 久久爱www.| 日韩中文字幕亚洲一区二区va在线 | 天天爱综合 | 亚洲,播放| 欧美影片 | 亚洲精品国产高清 | 亚洲精品久久久久58 | 亚洲激情在线播放 | 免费在线观看日韩欧美 | 黄色精品国产 | 综合网欧美| 国产亚洲精品久久网站 | 欧美日韩精品在线 | 美女国内精品自产拍在线播放 | 99热这里只有精品在线观看 | 97超碰站| 99国产在线视频 | 婷婷在线网站 | 91精品国产欧美一区二区成人 | 亚洲不卡在线 | 99精品国产aⅴ | 中文字幕专区高清在线观看 | 香蕉精品在线观看 | 人人干在线 | 亚洲精品视频网站在线观看 | 成人综合日日夜夜 | 成人app在线播放 | 综合五月婷婷 | 五月婷婷六月综合 | 黄色毛片在线观看 | 国产精品永久久久久久久久久 | 天天爽天天搞 | 国产精品久久久久毛片大屁完整版 | 日韩肉感妇bbwbbwbbw | 久久精品视频在线免费观看 | 久久在线精品视频 | 亚洲高清av在线 | 精品国内自产拍在线观看视频 | 六月丁香综合 | 亚洲资源 | 中文字幕制服丝袜av久久 | 亚洲精品在线视频观看 | 久久午夜电影网 | 伊人干综合 | 日韩电影中文,亚洲精品乱码 | а天堂中文最新一区二区三区 | 欧美成人在线免费 | 69xxxx欧美 | 五月婷婷在线观看视频 | 天天干天天操天天操 | 亚洲1级片| 香蕉视频在线免费 | 最新免费中文字幕 | 亚洲特级片 | 在线观看色视频 | 在线看一区 | 国产在线传媒 | 婷婷在线五月 | www成人av| 国产成人一区二区三区在线观看 | 国产精品一区二区吃奶在线观看 | 国产在线欧美 | 欧美在线日韩在线 | 一二三区高清 | 久久 精品一区 | 欧美日韩xx | 天天操狠狠操 | 91免费视频黄 | 国色综合 | 色综合久久网 | 亚洲激情在线视频 | 国产一区二区视频在线播放 | 91福利视频免费 | 一区二区伦理 | 99视频在线观看视频 | 久久精品国产一区二区 | 国产日韩在线一区 | www.五月天婷婷 | 国产首页 | 国产精品久久久毛片 | 一区二区三区在线免费播放 | 精品乱码一区二区三四区 | 99c视频高清免费观看 | 国产视频导航 | 欧洲色吧 | 国产手机av | 国产最新在线观看 | 美女免费视频观看网站 | 人人讲| 天天色综合1 | 人人爱爱 | 中文字幕乱在线伦视频中文字幕乱码在线 | 久久久精品久久日韩一区综合 | 国产福利精品在线观看 | 免费91在线| 丝袜+亚洲+另类+欧美+变态 | 伊人天天综合 | 精选久久 | a在线免费观看视频 | 九九精品久久久 | 国产丝袜在线 | 免费观看的黄色 | 97成人精品区在线播放 | 中文字幕 欧美性 | 五月婷婷另类国产 | 婷婷久久丁香 | 91精品高清| 精品亚洲男同gayvideo网站 | 欧美va天堂va视频va在线 | 在线观看视频日韩 | 黄色一级免费电影 | 亚洲一级二级三级 | 五月婷婷久草 | aa一级片| 日韩一二三区不卡 | 天天干 天天摸 天天操 | 天天拍天天草 | 日韩精品不卡在线 | 97视频成人| 91av小视频 | 天海翼一区二区三区免费 | av在线之家电影网站 | 天天干夜夜擦 | 亚洲无人区小视频 | 丁香视频全集免费观看 | 1024手机基地在线观看 | 亚洲日本va午夜在线影院 | 日韩免费看 | 手机看片中文字幕 | 亚洲国产精品久久久久婷婷884 | 成人精品福利 | 国产高清中文字幕 | 国产91综合一区在线观看 | av免费线看| 999成人 | 精品在线一区二区三区 | 伊人天天狠天天添日日拍 | a级黄色片视频 | 日韩美视频 | 又黄又刺激的视频 | 国产一区二区精品91 | 日韩手机在线 | 中文字幕丝袜一区二区 | 日韩一区二区免费在线观看 | 中文字幕中文字幕在线中文字幕三区 | 开心丁香婷婷深爱五月 | 在线视频欧美日韩 | 久久精品一区八戒影视 | 免费在线一区二区 | 久久视 | 国产精品麻豆果冻传媒在线播放 | 亚洲精品久久久久久久不卡四虎 | 香蕉蜜桃视频 | 久热精品国产 | 国产很黄很色的视频 | 亚洲91中文字幕无线码三区 | 国产精品久久久久一区二区国产 | 久久久免费观看视频 | 久久这里只有精品首页 | 精品国产免费久久 | 97免费在线观看视频 | 国产精品毛片久久久久久 | 草久电影| 日日碰夜夜爽 | 成人一区影院 | 黄色片视频在线观看 | 正在播放 国产精品 | 免费看三片 | 奇米影视999 | 成人av手机在线 | 日韩一区二区三区高清免费看看 | 最近中文字幕mv免费高清在线 | 欧美精品视 | 中文在线| 久久五月情影视 | 国产高清精 | 中文字幕在线观看三区 | 日日摸日日爽 | 免费看的黄色的网站 | 亚洲妇女av| 97超碰人人网 | 欧美日韩精品在线一区二区 | 视频国产精品 | 久久影院精品 | 成人欧美日韩国产 | 久久视影 | 国产精品theporn | 久久精品a | 超碰97中文| a黄色片在线观看 | 插综合网 | 五月婷婷在线视频观看 | 久久人人看 | 日韩v欧美v日本v亚洲v国产v | 免费久久99精品国产 | 欧美日韩久久不卡 | 婷婷综合在线 | 视频91在线 | 综合久久综合久久 | 精品国产aⅴ麻豆 | 色综合色综合久久综合频道88 | 日日爱夜夜爱 | 在线观看一区 | 国产 精品 资源 | 国产精品久久久久久模特 | 国产精品12345 | 国产91精品一区二区绿帽 | 制服丝袜一区二区 | 精品久久久久国产 | 久久亚洲欧美日韩精品专区 | 免费看在线看www777 | 亚洲综合网站在线观看 | 色综合亚洲精品激情狠狠 | 亚洲成人蜜桃 | 日韩18p| 国产资源免费 | 亚洲免费在线播放视频 | 久久久91精品国产 | 久久综合成人网 | zzijzzij亚洲日本少妇熟睡 | 欧美在线视频一区二区 | 日韩在线一级 | av大全免费在线观看 | 热久久在线视频 | 久久在线视频在线 | 日韩国产精品久久久久久亚洲 | 国产午夜视频在线观看 | 国产aaa免费视频 | 国产高清无av久久 | 91一区二区三区在线观看 | 中文字幕在线日 | 伊人天堂久久 | 国语自产偷拍精品视频偷 | 久草精品在线播放 | 在线看片视频 | 九九九九热精品免费视频点播观看 | 日韩视频在线不卡 | 69av视频在线 | 婷婷资源站| 91黄视频在线 | 91看片淫黄大片一级在线观看 | 黄网站免费大全入口 | 免费观看一区二区 | 成人黄色电影免费观看 | 九九av | 国产成人精品日本亚洲999 | av亚洲产国偷v产偷v自拍小说 | 在线视频精品 | 国产中文字幕三区 | 久久99久久99精品免观看粉嫩 | 超碰在97| 8090yy亚洲精品久久 | 中文字幕专区高清在线观看 | 国产在线观看h | 国产精品99久久久久久小说 | 精品视频国产 | 色噜噜狠狠色综合中国 | 激情欧美一区二区免费视频 | 国产精品中文在线 | 在线观看 国产 | 91精品国产91久久久久福利 | 日韩黄色中文字幕 | 精品福利av | 91视频在线看 | 亚洲国产日韩一区 | 天天干天天射天天插 | 黄色视屏av | 亚洲综合射 | 97超视频在线观看 | 在线成人小视频 | 99热精品在线观看 | 在线观看黄色免费视频 | 欧美激情综合五月色丁香小说 | 国产一级视频在线免费观看 | 天天色天天操天天爽 | 久久国产精品久久精品国产演员表 | 亚洲影音先锋 | 精品国产一区二区三区av性色 | 国产精品久久久久久久久毛片 | 精品电影一区二区 | 国产精品久久久视频 | 伊人午夜 | 少妇搡bbbb搡bbb搡aa | 麻豆av一区二区三区在线观看 | 狠狠做深爱婷婷综合一区 | 天天干夜夜想 | 91久久国产精品 | 国产精品美女久久久久久免费 | av午夜电影| 免费av在线网 | 亚洲专区免费观看 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 欧美精品做受xxx性少妇 | 免费男女羞羞的视频网站中文字幕 | 天天摸日日摸人人看 | 国产精品系列在线观看 | 99国产在线 | 久久躁日日躁aaaaxxxx | 国产午夜精品一区二区三区在线观看 | 国产精品免费一区二区三区 | 五月婷婷视频在线 | 天天干天天看 | 日本成人免费在线观看 | 91av在线不卡| a午夜电影| 国产在线日韩 | zzijzzij亚洲日本少妇熟睡 | 91亚洲精品久久久中文字幕 | 中文字幕激情 | 免费观看高清 | 久久久综合九色合综国产精品 | 91av在线免费看 | 操操操操网| 国产精品久久久久久久久久久久 | 日韩黄色在线 | 久久在线观看视频 | 久久不卡国产精品一区二区 | 日韩欧美在线观看一区 | 日韩av免费在线看 | 奇米网444| 天天色天天操综合 | 99在线视频播放 | 一区三区视频在线观看 | 国产精品18毛片一区二区 | 日韩一区二区久久 | 在线观看黄色免费视频 | 天天射天天射 | 欧美在线视频第一页 | 久久都是精品 | 区一区二区三区中文字幕 | 毛片一二区| 国产精品麻豆欧美日韩ww | 亚洲国产欧美一区二区三区丁香婷 | 2018精品视频| 麻豆国产网站 | 一区二区三区三区在线 | av一本久道久久波多野结衣 | 黄污网| 亚洲国内精品在线 | 九九热免费视频在线观看 | 国产在线国偷精品产拍免费yy | 国产黄色特级片 | 国产精成人品免费观看 | 久久久高清一区二区三区 | 婷婷5月激情5月 | 久久久久久久毛片 | 免费看色的网站 | 一区二区三区免费在线观看视频 | 在线视频 影院 | 久久精品a| 国产黑丝一区二区三区 | 久久九九视频 | 色网影音先锋 | 国产精品成人一区二区 | 国产第页 | 日韩在线免费视频观看 | 日韩高清一区在线 | 国产精品99久久99久久久二8 | 91精品亚洲影视在线观看 | 色噜噜在线观看 | 亚洲精品国产视频 | 日韩一区二区三区在线观看 | 天天操人人干 | 超级碰碰碰免费视频 | 国产福利久久 | 日韩欧美在线观看一区二区 | 国产色在线 | 涩av在线| 国产精品视频免费 | 国产一区二区免费 | 久久免费看av | 五月婷婷丁香 | 欧美片网站yy | 91自拍视频在线观看 | 97天堂网| av软件在线观看 | 日韩在线观看网站 | 超碰人人99 | 狠狠综合| 人人看人人 | 亚洲欧美视频一区二区三区 | 成人在线观看免费 | 日韩午夜在线 | 国产精品久久久久久久久久久久午夜 | 超碰.com| 中文字幕亚洲在线观看 | 日日射天天射 | 2024国产精品视频 | 色资源网在线观看 | 国产成人亚洲在线观看 | 欧美精品一区二区免费 | 国产性xxxx | 亚洲精品成人av在线 | 欧美精品一级视频 | 91久久在线观看 | 国内精品久久久久国产 | 激情 一区二区 | 日韩在线一区二区免费 | 国产一级大片在线观看 | 欧美日韩在线电影 | 五月天开心 | 日韩a在线看 | 亚洲一二三区精品 | 日韩在线观看影院 | 一区二区三区在线电影 | 国产精品原创 | 久久久久久久av麻豆果冻 | 97超碰免费在线 | 在线观看中文字幕第一页 | 日韩一区二区三区在线观看 | www.色的| 蜜臀aⅴ精品一区二区三区 久久视屏网 | 激情 一区二区 | 国产日产av | 一级国产视频 | 西西44人体做爰大胆视频 | 18国产精品福利片久久婷 | 91少妇精拍在线播放 | 亚洲成av片人久久久 | 亚洲精品中文在线资源 | 日韩有码中文字幕在线 | 久久国产成人午夜av影院宅 | 日本中文乱码卡一卡二新区 | 最新极品jizzhd欧美 | 婷婷激情av | 国产黄在线免费观看 | 一区二区国产精品 | 午夜精品电影一区二区在线 | 视频直播国产精品 | 欧美日韩国产区 | 色91在线视频 | 国产精品第十页 | 在线看污网站 | 日韩一区二区在线免费观看 | 婷婷av电影| 五月天婷婷在线观看视频 | 国产91在| 日本精a在线观看 | 麻豆小视频在线观看 | 亚洲国产中文在线 | 国产婷婷精品av在线 | 日韩精品免费 | 在线观看精品国产 | 菠萝菠萝蜜在线播放 | 麻豆视频在线观看免费 | 91精品啪在线观看国产 | 91爱看片 | 天天干天天干天天干 | 亚洲综合成人专区片 | 999久久久国产精品 高清av免费观看 | 成人av电影网址 | 日韩在线免费不卡 | 亚洲婷婷网 | 久久精品视频网址 | 国产精品美女久久久久久 | 伊人婷婷久久 | 日韩成人免费观看 | 在线免费观看黄色大片 | 中文字幕日韩一区二区三区不卡 | 国产剧情在线一区 | 国产精品自在欧美一区 | 欧美a级在线免费观看 | 久久综合九色综合久99 | 欧美与欧洲交xxxx免费观看 | 97综合视频| 色噜噜日韩精品欧美一区二区 | 蜜臀久久99精品久久久酒店新书 | 免费观看日韩 | 久久综合电影 | 午夜国产福利在线观看 | 久久久影片 | 国产九九精品视频 | 欧美视频一区二 | 久久夜夜夜 | 欧美日韩视频 | 日韩av一区二区三区四区 | 免费视频网 | www.伊人网 | 精品亚洲男同gayvideo网站 | 这里只有精品视频在线 | 99久久精品免费看国产免费软件 | 中文字幕资源网在线观看 | 亚洲成人资源在线观看 | 看片网站黄 | 国产精品麻豆欧美日韩ww | 在线你懂的视频 | 色婷婷综合在线 | 91色一区二区三区 | 亚洲三级毛片 | 国产精品18久久久久久久久 | 亚洲mv大片欧洲mv大片免费 | 国产成人福利片 | 久久久免费看片 | 91精品久久香蕉国产线看观看 | 日韩av电影手机在线观看 | 99一级片 | 日韩不卡高清视频 | 91精品1区2区 | 久久精品一二三区白丝高潮 | 精品视频9999| 国产欧美综合在线观看 | 在线免费观看的av网站 | 五月天久久久 | 99久久综合国产精品二区 | 人人干免费 | 91探花系列在线播放 | 欧美日韩一区二区视频在线观看 | 高清在线一区 | 天天射网站 | 丁香婷婷基地 | 亚洲精品玖玖玖av在线看 | 国产精品久久网 | 色婷婷激情四射 | 中文字幕在线第一页 | 岛国av在线不卡 | 91精品国产一区 | 亚洲伦理中文字幕 | 国产成人久久 | av综合站| 亚洲欧美日韩一区二区三区在线观看 | 国产精品日韩久久久久 | 欧美一级片免费观看 | 欧美日韩国产欧美 | 欧美 日韩 性 | 在线天堂日本 | 2024av| 久久久久色| 91精品国产电影 | 毛片激情永久免费 | 狠狠干夜夜操天天爽 | 亚洲激情精品 | 亚洲三级国产 | 99久久9| 色综合夜色一区 | 婷婷国产v亚洲v欧美久久 | av在线网站免费观看 | 久久久久久久久久久久久久电影 | 东方av在线免费观看 | 精品国产一区二区三区久久久蜜月 | 久久久免费毛片 | 日日久视频 | 成人av一级片 | 欧美日韩在线观看一区二区 | 亚洲韩国一区二区三区 | 国产91精品一区二区麻豆亚洲 | 国产精品高清免费在线观看 | 9999免费视频 | 天天摸天天干天天操天天射 | 91av播放 | 狠狠网 | a黄色大片 | 人人干人人爽 | 五月天综合婷婷 | 91tv国产成人福利 | 九九久久免费 | 精品国产一区二区久久 | 精品国产观看 | 一级c片| 久久久久久久国产精品 | 亚洲最新av在线网站 | 91色在线观看视频 | 91精品视频免费在线观看 | 久久国产香蕉视频 | 狠狠的干 | h文在线观看免费 | 久草电影在线观看 | 成人久久免费 | 99久久久国产精品美女 | www日日| 欧美性做爰猛烈叫床潮 | 婷婷视频在线播放 | 国产精品亚洲人在线观看 | 在线看黄色av | 深爱婷婷网 | 天天干天天拍天天操 | 欧美激情第一区 | 久久精品国产精品亚洲 | 黄色毛片在线观看 | 深爱婷婷久久综合 | 日韩中文字幕免费看 | 一区二区 不卡 | 亚洲黄色片在线 | 国产精品色婷婷视频 | 亚洲狠狠婷婷综合久久久 | 免费h在线观看 | 亚洲乱码中文字幕综合 | 一区二区三区免费网站 | 久久黄色影院 | 99亚洲精品在线 | 国产高清福利在线 | 国产色在线观看 | 国产精品videossex国产高清 | 中中文字幕av | 日韩影视大全 | 国产亚洲片 | 91秒拍国产福利一区 | 日韩av偷拍 | 久久综合电影 | 午夜三级毛片 | 四虎影视8848aamm | 亚洲 成人 欧美 | 五月综合久久 | 999视频在线播放 | 免费在线成人 | 日日操操 | 天天干夜夜夜 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 国产99久久久国产精品 | 国产精品第十页 | 成人欧美一区二区三区在线观看 | 国产福利91精品张津瑜 | 天堂视频中文在线 | 在线观看国产 | 久久国产精品久久国产精品 | 久久久国内精品 | 久久精品美女视频 | 国内精品视频一区二区三区八戒 | 五月天婷亚洲天综合网鲁鲁鲁 | 蜜臀av.com | 欧美一区二区三区在线观看 | 日韩欧美视频 | 不卡的av片 | 手机成人在线 | 在线亚洲日本 | 人人爽人人av | 四虎国产 | 深爱开心激情 | 国产精品69久久久久 | 欧美成a人片在线观看久 | 亚洲 欧美 另类人妖 | 日韩精品中文字幕在线 | 亚洲国产成人在线 | 亚洲无毛专区 | 黄色一级性片 | 久久99精品国产一区二区三区 | 97国产在线 | 成在人线av | 一级免费黄视频 | avv天堂| 日韩精品久久一区二区三区 | 欧美日韩中文字幕在线视频 | 999久久久久久久久6666 | 婷婷射五月 | 欧美男女爱爱视频 | 91桃色免费视频 | 夜添久久精品亚洲国产精品 | 精品国产乱码久久久久久三级人 | 91色在线观看视频 | 国产精品美女久久久久久2018 | wwwwww黄 | 免费a视频在线 | 成人app在线播放 | 国产免费观看久久黄 | 亚洲一级免费电影 | 国产一级片播放 | 国产精在线 | 永久免费毛片在线观看 | 西西www4444大胆视频 | 久久久久久国产精品999 | 色一级片| 黄色成人av | 久久欧洲视频 | 亚洲精品视频网站在线观看 | 亚洲欧洲av | 国产高清视频色在线www | 久久精品视频国产 | 国产精品一区二区久久精品 | 91专区在线观看 | 国产最新在线观看 | 精品国产综合区久久久久久 | 奇米影视777四色米奇影院 | 日本一区二区三区免费看 | 久久久久在线观看 | 国产麻豆精品95视频 | 久久伊人色综合 | 热久久视久久精品18亚洲精品 | 欧美二区三区91 | 99精品一区二区三区 | 天天干天天操天天操 | 成人国产精品久久久春色 | 欧美大片第1页 | 日韩城人在线 | 97在线视 | 玖玖爱国产在线 | 夜夜夜夜爽 | 久久1电影院 | 99精品欧美一区二区蜜桃免费 | 欧美性生活一级片 | 欧美色婷婷| 一级一级一片免费 | 日韩电影一区二区在线观看 | 日韩av成人在线观看 | 最新av在线网站 | 麻豆久久久久久久 | 在线视频 影院 | 五月天亚洲综合小说网 | 久色 网 | 日韩成人免费观看 | 日韩网站免费观看 | 中文字幕精品一区二区三区电影 | 国产精品资源在线观看 | 日本在线精品视频 | 亚洲黄色免费 | 国产在线小视频 | 天天干夜夜操视频 | 91网在线观看 | 亚洲在线观看av | 亚洲一区二区精品视频 | av短片在线观看 | 天天看天天干 | 成人播放器 | 麻花天美星空视频 | 久久精品99久久久久久2456 | 国产青春久久久国产毛片 | 在线天堂中文在线资源网 | 久久精品a| 超碰成人免费电影 | 亚洲激情六月 | 国产精品igao视频网入口 | 国产精品视频全国免费观看 | 97精品国产97久久久久久春色 | 欧美久久久| 中文字幕 成人 | 一级做a爱片性色毛片www | 国产精品免费不卡 | 亚洲精品成人 | 欧美日韩亚洲第一页 | 欧美日韩视频在线观看一区二区 | 国产精品日韩久久久久 | 欧美99精品| 激情五月色播五月 | 精品久久五月天 | 天天爽夜夜爽人人爽一区二区 | 人人草网站 | 免费看黄20分钟 | 久热av | 欧美一区在线观看视频 | 中文字幕免费一区 | 亚洲精品综合一区二区 | 精品一区二区6 | 97精品国自产拍在线观看 | 国产精品白浆视频 | 久久久精品国产一区二区三区 | 久草在线视频看看 | 久久久亚洲麻豆日韩精品一区三区 | av中文字幕av | 精品黄色在线 | 精品一区二区久久久久久久网站 | 亚洲欧美视频在线 | 97成人在线观看视频 | 色在线免费观看 | 亚洲三级精品 | 久久精品视频免费观看 | 在线精品在线 | 波多野结衣亚洲一区二区 | 久草在线资源网 | av线上看 | 成人一级免费电影 | 五月天久久久 | 五月激情视频 | 福利一区视频 | 亚洲日本欧美在线 | 精品国产乱码久久久久久久 | 日韩免费一区二区在线观看 | 国产又黄又硬又爽 | 天天综合网入口 | 亚洲一区二区视频在线播放 | 青青草久草在线 | 久久久久五月天 | 久草视频免费在线播放 | 色操插| 在线中文字幕播放 | 久久精品视频在线播放 | 国产日韩欧美在线播放 | 国产精品日韩久久久久 | 最近日韩免费视频 | mm1313亚洲精品国产 | 激情xxxx| 欧美一级性生活视频 | 欧美成年人在线视频 | 日韩精品视频一二三 |