module 模塊語法

 // CommonJS模塊引入模塊
  let { stat, exists, readFile } = require('fs');
// 等同于
let _fs = require('fs');
let stat = _fs.stat;
let exists = _fs.exists;
readfile = _fs.readfile;
這種加載稱為“運(yùn)行時加載”曙旭,因?yàn)橹挥羞\(yùn)行時才能得到這個對象,導(dǎo)致完全沒辦法在編譯時做“靜態(tài)優(yōu)化”。
ES6 模塊不是對象,而是通過export命令顯式指定輸出的代碼萄焦,再通過import命令輸入楷扬。
// ES6模塊

import { stat, exists, readFile } from 'fs';

面代碼的實(shí)質(zhì)是從fs模塊加載3個方法,其他方法不加載。這種加載稱為“編譯時加載”或者靜態(tài)加載,即 ES6 可以在編譯時就完成模塊加載,效率要比 CommonJS 模塊的加載方式高。當(dāng)然,這也導(dǎo)致了沒法引用 ES6 模塊本身,因?yàn)樗皇菍ο蟆?/h5>

多的不多說就說一些基本用法個人粗劣的大白話

improt 就是簡單的引入模塊配合export使用 export是暴露

建一個文件

// circle.js

export function area(radius) {
  return Math.PI * radius * radius;
}

export function circumference(radius) {
 return 2 * Math.PI * radius;

}

通過export來暴露變量方法 也可以使用export{}

如果不用{} 但是不能直接使用實(shí)際的常量值

引用加載

// main.js

import { area, circumference } from './circle';

 console.log('圓面積:' + area(4));
 console.log('圓周長:' + circumference(14));

使用import{}form+"路徑"來引用

加載所有暴露的變量方法

import * as circle from './circle';

console.log('圓面積:' + circle.area(4));
console.log('圓周長:' + circle.circumference(14));

*代表所有 as 可以自定義一個變量名字


exprot default

從前面的例子可以看出噩咪,使用import命令的時候仆百,用戶需要知道所要加載的變量名或函數(shù)名,否則無法加載。但是,用戶肯定希望快速上手拴曲,未必愿意閱讀文檔蕉汪,去了解模塊有哪些屬性和方法

export default為模塊指定默認(rèn)輸出驹马。

// export-default.js
export default function () {
console.log('foo');
}

上面代碼是一個模塊文件export-default.js泳姐,它的默認(rèn)輸出是一個函數(shù)阎肝。
其他模塊加載該模塊時眼刃,import命令可以為該匿名函數(shù)指定任意名字。

// import-default.js
import customName from './export-default';
customName(); // 'foo'

export default命令用在非匿名函數(shù)前赴恨,也是可以的额港。

// export-default.js
export default function foo() {
  console.log('foo');
}

// 或者寫成

function foo() {
  console.log('foo');
}

export default foo;

上面代碼中向瓷,foo函數(shù)的函數(shù)名foo,在模塊外部是無效的。加載的時候,視同匿名函數(shù)加載巢钓。

下面比較一下默認(rèn)輸出和正常輸出咬展。

// 第一組
export default function crc32() { // 輸出
  // ...
}

import crc32 from 'crc32'; // 輸入

// 第二組
export function crc32() { // 輸出
  // ...
};

import {crc32} from 'crc32'; // 輸入

本質(zhì)上玖媚,export default就是輸出一個叫做default的變量或方法淹真,然后系統(tǒng)允許你為它取任意名字陷寝。所以,下面的寫法是有效的。只不過省略了default而已

// modules.js
function add(x, y) {
 return x * y;
}
export {add as default};//輸出default
// 等同于
// export default add;

   // app.js
    import { default as xxx } from 'modules';
   // 等同于
  // import xxx from 'modules';

輸出所有

 export * from 'circle';

輸出暴露 'circle';的所有屬性方法
引入所有的

 import * as math from 'circleplus';

引入 'circleplus'';的所有屬性方法

跨模塊常量
一個值要被多個模塊共享

// constants.js 模塊
 export const A = 1;export const B = 3;export const C = 4;
 //test1.js 模塊
  import * as constants from './constants';console.log(constants.A); 
 //  1console.log(constants.B); // 3
  // test2.js 模塊
 import {A, B} from './constants';console.log(A); // 1console.log(B); // 3

如果要使用的常量非常多彻犁,可以建一個專門的constants
目錄森篷,將各種常量寫在不同的文件里面,保存在該目錄下抖韩。

 // constants/db.js
export const db = { 
    url: 'http://my.couchdbserver.local:5984', 
    admin_username: 'admin',
    admin_password: 'admin password
'};

 // constants/user.js
    export const users = ['root', 'admin', 'staff', 'ceo', 'chief', 'moderator'];
然后席揽,將這些文件輸出的常量熊痴,合并在index.js里面许赃。


// constants/index.js
    export {db} from './db';export {users} from './users';

使用的時候沟于,直接加載index.js就可以了。
 // script.js
  import {db, users} from './constants';

inmprot()方法
inport命令會被 JavaScript 引擎靜態(tài)分析供搀,先于模塊內(nèi)的其他模塊執(zhí)行(叫做”連接“更合適)摄悯。所以撒遣,下面的代碼會報錯义黎。

// 報錯
if (x === 2) {
import MyModual from './myModual';
}

引擎處理import語句是在編譯時 import和export命令只能在模塊的頂層,不能在代碼塊之中(比如层释,在if代碼塊之中贡羔,或在函數(shù)之中)。

如果import命令要取代 Node 的require方法弄息,這就形成了一個障礙缨称。因?yàn)閞equire是運(yùn)行時加載模塊权纤,import命令無法取代require的動態(tài)加載功能妖碉。

const path = './' + fileName;
const myModual = require(path);

上面的語句就是動態(tài)加載,require到底加載哪一個模塊芥被,只有運(yùn)行時才知道欧宜。import語句做不到這一點(diǎn)。

因此拴魄,有一個提案冗茸,建議引入import()函數(shù),完成動態(tài)加載匹中。

 import(specifier)

上面代碼中夏漱,import函數(shù)的參數(shù)specifier,指定所要加載的模塊的位置顶捷。import命令能夠接受什么參數(shù)挂绰,import()函數(shù)就能接受什么參數(shù),兩者區(qū)別主要是后者為動態(tài)加載服赎。import() 返回一個 Promise 對象葵蒂。


js的異步加載
<script src="path/to/myModule.js" defer></script>
<script src="path/to/myModule.js" async></script>
es6
<script src="...js" type="module"></script>
自動異步 也可以設(shè)置async同步
——————————

ES6 模塊與 CommonJS 模塊的差異

討論 Node 加載 ES6 模塊之前,必須了解 ES6 模塊與 CommonJS 模塊完全不同重虑。

它們有兩個重大差異践付。

CommonJS 模塊輸出的是一個值的拷貝,ES6 模塊輸出的是值的引用缺厉。
CommonJS 模塊是運(yùn)行時加載永高,ES6 模塊是編譯時輸出接口。
第二個差異是因?yàn)?CommonJS 加載的是一個對象(即module.exports屬性)提针,該對象只有在腳本運(yùn)行完才會生成命爬。而 ES6 模塊不是對象,它的對外接口只是一種靜態(tài)定義辐脖,在代碼靜態(tài)解析階段就會生成遇骑。

CommonJS 模塊輸出的是值的拷貝,也就是說揖曾,一旦輸出一個值落萎,模塊內(nèi)部的變化就影響不到這個值

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

1:ES6 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

參數(shù)可以指定轉(zhuǎn)碼后的文件名擎厢。
$ compile-modules convert -o out.js file1.js
————————————————————————————

SystemJS
另一種解決方法是使用 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ù)倚评。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浦徊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子天梧,更是在濱河造成了極大的恐慌盔性,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呢岗,死亡現(xiàn)場離奇詭異冕香,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)后豫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門悉尾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挫酿,你說我怎么就攤上這事构眯。” “怎么了饭豹?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵鸵赖,是天一觀的道長。 經(jīng)常有香客問我拄衰,道長它褪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任翘悉,我火速辦了婚禮茫打,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘妖混。我一直安慰自己老赤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布制市。 她就那樣靜靜地躺著抬旺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪祥楣。 梳的紋絲不亂的頭發(fā)上开财,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音误褪,去河邊找鬼责鳍。 笑死,一個胖子當(dāng)著我的面吹牛兽间,可吹牛的內(nèi)容都是我干的历葛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼嘀略,長吁一口氣:“原來是場噩夢啊……” “哼恤溶!你這毒婦竟也來了乓诽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤咒程,失蹤者是張志新(化名)和其女友劉穎问裕,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孵坚,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡粮宛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了卖宠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巍杈。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖扛伍,靈堂內(nèi)的尸體忽然破棺而出筷畦,到底是詐尸還是另有隱情,我是刑警寧澤刺洒,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布鳖宾,位于F島的核電站,受9級特大地震影響逆航,放射性物質(zhì)發(fā)生泄漏鼎文。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一因俐、第九天 我趴在偏房一處隱蔽的房頂上張望拇惋。 院中可真熱鬧,春花似錦抹剩、人聲如沸撑帖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胡嘿。三九已至,卻和暖如春钳踊,著一層夾襖步出監(jiān)牢的瞬間衷敌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工箍土, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逢享,地道東北人罐监。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓吴藻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親弓柱。 傳聞我的和親對象是個殘疾皇子沟堡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 認(rèn)識模塊 JS 作為一名編程語言侧但,一直以來沒有模塊的概念。嚴(yán)重導(dǎo)致大型項(xiàng)目開發(fā)受阻航罗,js 文件越寫越大禀横,不方便維護(hù)...
    faremax閱讀 628評論 0 0
  • ES6模塊不是對象,而是export命令顯示指定輸出的代碼粥血,輸入時也采用靜態(tài)命令的形式柏锄。 上面是從fs模塊里加載3...
    竹天亮閱讀 7,542評論 2 17
  • 【轉(zhuǎn)】 遵循的模塊化規(guī)范不一樣 模塊化規(guī)范:即為 JavaScript 提供一種模塊編寫、模塊依賴和模塊運(yùn)行的方案...
    houruyaogeili閱讀 3,303評論 0 2
  • 以下內(nèi)容是我在學(xué)習(xí)和研究ES6時复亏,對ES6的特性趾娃、重點(diǎn)和注意事項(xiàng)的提取、精練和總結(jié)缔御,可以做為ES6特性的字典抬闷;在本...
    科研者閱讀 3,126評論 2 9
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券耕突,享受所有官網(wǎng)優(yōu)惠笤成,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 3,657評論 2 27