【ES6】Module的語法、加載實現(xiàn)

概述

在ES6之前魂拦,JavaScript一直沒有模塊(module)體系讨勤,無法將一個大程序拆分成互相依賴的小文件,再用簡單的方法拼裝起來晨另。這對開發(fā)大型的、復雜的項目形成了障礙谱姓。

為了解決這個問題借尿,創(chuàng)造了一些模塊加載方案(如用于服務器的CommonJS,用于瀏覽器的AMD屉来、CMD)路翻,各個方案各有自己的特點,并且語法還不一樣茄靠,如果是要同時做前后端茂契,那真的是會“精分”了。

好消息是ES6給我們帶來了模塊化的設計慨绳!這完全可以取代CommonJS掉冶、AMD等規(guī)范,成為瀏覽器和服務器通用的模塊解決方案脐雪。

語法

模塊功能主要由兩個命令構成:exportimport厌小。export 命令用于規(guī)定模塊的對外接口,import 命令用于輸入其他模塊提供的功能战秋。

export

一個模塊就是一個獨立的文件璧亚。該文件內部的所有變量,外部無法獲取脂信。如果你希望外部能夠讀取模塊內部的某個變量癣蟋,就必須使用 export 關鍵字輸出該變量透硝。

對外輸出變量

// 寫法一
export var m = 1;

// 寫法二
var m = 1;
export {m};

// 寫法三
var n = 1;
export {n as m};

需要注意的是,使用先聲明再輸出的寫法時疯搅,即使只有一個變量濒生,也不能省略 { ... },否則會報錯秉撇。

// 報錯
var m = 1;
export m;

記住甜攀,使用 export 命令時,要提供對外的接口琐馆,而不是提供一個值规阀!

對外輸出函數(shù)

當然也可以使用類似的語法,對外輸出函數(shù)瘦麸。需要注意的點還是一樣的谁撼,對外輸出的是接口,不是函數(shù)本身滋饲。

說白了厉碟,就是 記得加上 { ... }!

// 寫法一
export function f() {};

// 寫法二
function f() {}
export {f};

// 報錯
function f() {}
export f;

import

加載變量、函數(shù)

import { m, n } from "./export.js";

需要注意的是屠缭,import 命令輸入的變量都是只讀的箍鼓,修改會報錯。這很合理呵曹,當然不能在加載模塊的腳本里改寫接口款咖。

不過如果加載的變量是一個對象,修改這個對象的屬性是允許的奄喂。

模塊的整體加載

除了指定加載某個值铐殃,還可以使用整體加載的方法,加載整個模塊的所有輸出值跨新。

語法很簡單富腊,用 * 指代“所有”即可。

import * from "./export.js";

了解了 importexport 的語法之后域帐,我迫不及待地想要去嘗試了赘被,然后……

在瀏覽器中加載ES6模塊

由于粗心,沒認真了解規(guī)則肖揣,廢了好多時間帘腹,下面來說說經(jīng)驗之談。

加載規(guī)則

瀏覽器加載ES6模塊许饿,也是使用 <script> 標簽阳欲,但注意,需要加上 type="module" 屬性

有兩種方法:

1. 通過 <script src=""> 加載js腳本

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

2. 直接使用 <script> 標簽內嵌js代碼

<script type="module">
    import { a } from "./export.js";
    console.log(a);
</script>

面對瀏覽器的試煉...

了解了以上知識球化,想要在瀏覽器中實現(xiàn)ES6模塊的加載秽晚,還是有坑...

首先要說的是,如今(8102年)筒愚,各大主流瀏覽器都(早)已經(jīng)支持了ES6的模塊了赴蝇。千萬別再說Chrome瀏覽器沒有支持ES6的Module之類的話了。

火狐瀏覽器

火狐瀏覽器沒問題巢掺,直接打開html文件句伶,就可以完成模塊的加載。

Chrome瀏覽器

而對于Chrome瀏覽器陆淀,則會有一點問題考余。

直接打開html文件時,Chrome瀏覽器會報錯:

Access to script at 'file:///masaike' from origin 'null' has been blocked by CORS policy: The response is invalid.

image

這并不是Chrome不支持加載模塊轧苫,而是ES6模塊遵循同源策略楚堤。解決方法就是打開本地服務器,讓各個文件同源就可以了含懊。

參考資料

http://es6.ruanyifeng.com/#docs/module

http://es6.ruanyifeng.com/#docs/module-loader

https://stackoverflow.com/questions/52919331/access-to-script-at-from-origin-null-has-been-blocked-by-cors-policy

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末身冬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子岔乔,更是在濱河造成了極大的恐慌酥筝,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雏门,死亡現(xiàn)場離奇詭異嘿歌,居然都是意外死亡,警方通過查閱死者的電腦和手機剿配,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阅束,“玉大人呼胚,你說我怎么就攤上這事∠⒙悖” “怎么了蝇更?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長呼盆。 經(jīng)常有香客問我年扩,道長,這世上最難降的妖魔是什么访圃? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任厨幻,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘况脆。我一直安慰自己饭宾,他們只是感情好,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布格了。 她就那樣靜靜地躺著看铆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盛末。 梳的紋絲不亂的頭發(fā)上弹惦,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音悄但,去河邊找鬼棠隐。 笑死,一個胖子當著我的面吹牛算墨,可吹牛的內容都是我干的宵荒。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼净嘀,長吁一口氣:“原來是場噩夢啊……” “哼报咳!你這毒婦竟也來了?” 一聲冷哼從身側響起挖藏,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤暑刃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后膜眠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岩臣,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年宵膨,在試婚紗的時候發(fā)現(xiàn)自己被綠了架谎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡辟躏,死狀恐怖谷扣,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情捎琐,我是刑警寧澤会涎,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站瑞凑,受9級特大地震影響末秃,放射性物質發(fā)生泄漏。R本人自食惡果不足惜籽御,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一练慕、第九天 我趴在偏房一處隱蔽的房頂上張望惰匙。 院中可真熱鬧,春花似錦贺待、人聲如沸徽曲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秃臣。三九已至,卻和暖如春哪工,著一層夾襖步出監(jiān)牢的瞬間奥此,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工雁比, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留稚虎,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓偎捎,卻偏偏與公主長得像蠢终,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子茴她,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內容

  • 系列文章導航 模塊(一) CommonJs,AMD, CMD, UMD 本文參考阮一峰 ES6入門 Module的...
    合肥黑閱讀 6,104評論 0 4
  • 上一章介紹了模塊的語法寻拂,本章介紹如何在瀏覽器和 Node 之中加載 ES6 模塊,以及實際開發(fā)中經(jīng)常遇到的一些問題...
    emmet7life閱讀 2,735評論 0 1
  • 瀏覽器加載 傳統(tǒng)方法 HTML網(wǎng)頁中丈牢,瀏覽器通過 標簽加載JavaScript腳本祭钉。 上面代碼中,由于瀏覽器腳本的...
    oWSQo閱讀 661評論 0 0
  • 概述 歷史上己沛,JavaScript 一直沒有模塊(module)體系慌核,無法將一個大程序拆分成互相依賴的小文件,再用...
    emmet7life閱讀 615評論 0 0
  • 體驗入:今天下雨 一天不怎么忙 下午洗了一只古牧 快吹完了 主人來了 然后古牧看見主人就開始不配合了 各種鬧...
    洋氵羊閱讀 167評論 0 2