瀏覽器載入
傳統方法:在html網頁中,瀏覽器通過
載入規則
瀏覽器載入es6模板,也是使用網頁中插入乙個模組foo.js,由於type屬性設為module,所以瀏覽器知道這是乙個 es6 模組。
瀏覽器對於帶有type="module"的es6模組允許內嵌在網頁中,語法行為與載入外部指令碼一致;
外部的模組指令碼(foo.js),有幾點需要注意:
(1) **是在模組作用域之中執行,而不是在全域性作用域執行,模組內部的頂層變數,外部不可見。
(2) 模組之中,可以使用import命令載入其他模組(.js字尾不可省略,也可以使用export命令輸出對外介面)
(3)模組之中,頂層的this關鍵字返回undefined,而不是指向window,也就是說:在模組頂層使用this關鍵字是無意義的;
(4)同乙個模組如果載入多次只執行一次;
//例項模組
import utils from "";
const x =1;
console.log(x ===window)// false
console.log(this === undefined) //true
delete x ;//語法錯誤,不能刪除x
利用頂層的this等於undefined這個語法點,可以偵測當前**是否在 es6 模組之中。
const isnotmodulescript = this !== undefined;
es6模組與commonjs模組的差異
(1)commonjs模組輸出的是乙個值的拷貝,es6模組輸出得失值的引用;
(2)commonjs模組是執行時載入,es6模組是編譯時輸出介面。
commonjs模組輸出的是值的拷貝,也就是說一旦輸出乙個值,模組內部的變化就影響不到這個值;
var counter = 3;
function incounter ()
module.exports = ;
//在main.js裡面載入這個模組
var mod = require(".lib");
console.log(mod.counter);//3
mod.incounter();
console.log(mod.counter);//3
lib.js模組載入以後,他的內部變化就影響不到輸出的mod.counter了,這是因為mod.counter是乙個元素型別的值;
es6模組的執行機制與commonjs不一樣,js引擎對指令碼靜態分析的時候,遇到模組載入命令import,就會生成乙個唯讀引用。等到指令碼真正執行時,再根據這個唯讀引用,到被載入的那個模組裡面去取值。原始值變了,import載入的值也會跟著變。因此,es6 模組是動態引用,並且不會快取值,模組裡面的變數繫結其所在的模組。
export let counter = 3;
export function incounter ()
import from "./lib";
console.log(counter);//3
incounter();
console.log(counter);//4
es6 模組輸入的變數counter是活的,完全反應其所在模組lib.js內部的變化。
內部變數
es6 模組應該是通用的,同乙個模組不用修改,就可以用在瀏覽器環境和伺服器環境。為了達到這個目標,node 規定 es6 模組之中不能使用 commonjs 模組的特有的一些內部變數。
首先,就是this關鍵字。es6 模組之中,頂層的this指向undefined;commonjs 模組的頂層this指向當前模組,這是兩者的乙個重大差異。
其次,以下這些頂層變數在 es6 模組之中都是不存在的。
arguments
require
module
exports
filename
dirname
commonjs模組的載入原理
commonjs的乙個模組,就是乙個指令碼檔案,require命令第一次載入該指令碼,就會執行這個指令碼,然後在記憶體生成乙個物件。
,
loaded:true,
...}
node內部載入模組後生成的乙個物件,該物件的id屬性是模組名,exports屬性是模組輸出的各個介面,loaded屬性是乙個布林值,表示該模板的指令碼是否執行完畢,等等屬性;
以後需要用到這個模組的時候就會到export屬性上面取值,即使再次執行require命令,也不會再次執行該模組,而是到快取之中取值,也就是說:commonjs模組無論載入多少次,只在第一次載入時執行一次,以後再載入,就返回第一次執行的結果;
備註:es6模組:每乙個模組只載入一次, 每乙個js只執行一次, 如果下次再去載入同目錄下同檔案,直接從記憶體中讀取。
備註: 模組化的好處主要是兩點:
1. 避免全域性變數汙染
2. 有效的處理依賴關係
學習記錄 ES6 module
export 和 import 簡單的例子 a.js export const a i am a index.js import from a.js console.log a i am a export import 嚴格模式 export 的具體使用方式,以及 import 的具體使用方式 de...
ES6 Module 多種用法
使用者需要知道所要載入的變數名或函式名,否則無法載入 export const a 1export const b 1 等價於 const a 1const b 1export export 等價於 const a 1const b 1export import from const a 1cons...
帶你了解ES6 Module
1.commonjs 在說 es6 模組以前,我們先來看一下後端普遍使用的打包方式,commonjs的一些特性。仔細閱讀以下 module.js let a 1 function foo module.exports index.js let require module.js console.lo...