JavaScript ES6 Module模塊詳解
0.什麼是Module
歷史上,JavaScript 一直沒有模塊(module)體系,無法將一個大程序拆分成互相依賴的小文件,再用簡單的方法拼裝起來。其他語言都有這項功能,比如 Ruby 的require、Python 的import,甚至就連 CSS 都有@import,但是 JavaScript 任何這方面的支持都沒有,這對開發大型的、復雜的項目形成瞭巨大障礙。
在 ES6 之前,社區制定瞭一些模塊加載方案,最主要的有 CommonJS 和 AMD 兩種。ES6 模塊的設計思想是盡量的靜態化,使得編譯時就能確定模塊的依賴關系,以及輸入和輸出的變量。ES6 模塊不是對象,而是通過export命令顯式指定輸出的代碼,再通過import命令輸入。
模塊系統主要解決的問題:
- 模塊化的問題
- 消除全局變量
- 管理加載順序
1.Module 的加載
使用 < script >標簽加載模塊時需要添加 type=“module”。
1.1 方式一
<script type="module"> import module from "./module.js"; </script>
1.2 方式二
<script src="./module.js" type="module"></script>
2.導出和導入
2.1 一個模塊的導出可以被其它模塊導入,並訪問。
例1:使用About.js調用Base.js內的Base對象,並在首頁打印。
index.html
<script type="module"> import About from "./js/About.js"; console.log(About); </script>
Base.js
const Base = { nick: 'admin', age: 19 } export default Base;
About.js
import Base from '../js/Base.js'; const src = `nick:${Base.nick},age:${Base.age}.`; export default src;
輸出結果:
nick:admin,age:19.
2.2 沒有導出,也可以將其導入
例2:About.js不導出,在首頁將其導入。
index.html
<script type="module"> import "./js/About.js"; </script>
About.js
const src = 'Hello World!'; console.log(src);
輸出結果:
Hello World!
2.3 被導入的代碼都會執行一遍,也僅會執行一遍
例3:導入3次About.js,觀察導出結果。
index.html
<script type="module"> import "./js/About.js"; import "./js/About.js"; import "./js/About.js"; </script>
About.js
const src = 'Hello World!'; console.log(src);
輸出結果:
Hello World!
3.export default 和對應的 import
export default 用於導出一個默認值,一個模塊隻能有一個。
使用 export default 進行導出時,import 的名字可以隨意起。
例4:使用 export default 進行導出,import 的名字隨意起。
index.html
<script type="module"> import bbb from "./js/About.js"; console.log(bbb); </script>
About.js
const src = 'Hello World!'; export default src;
輸出結果:
Hello World!
4.export 和對應的 import
使用 export 進行導出時,import 的名字不能隨意起。
例5:使用 export 進行導出。
index.html
<script type="module"> import { age, nick } from "./js/About.js"; console.log(nick, age); </script>
About.js
const age = 18; export {age}; // export age; × // export const age = 18; √ export const nick = 'admin';
輸出結果:
admin 18
5.Module 的註意事項
1.模塊中,頂層的 this 指向 undefined;
2import 具有提升效果,會提升到整個模塊的頭部,率先執行;
3.import 執行的時候,代碼還沒執行;
4.import 和 export 隻能在模塊的頂層,不能在代碼塊中執行;
5.import() 可以按條件導入;
6.復合寫法導出的,無法在當前模塊中使用
復合寫法,導入後導出:
export About from './js/About.js';
總結
本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!
推薦閱讀:
- JavaScript 模塊化詳解
- JS中ESModule和commonjs介紹及使用區別
- Js模塊打包exports require import的用法和區別
- 一文帶你瞭解vite對瀏覽器的請求做瞭什麼
- webpack模塊化的原理解析