成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

ES6: import和export

wapeyang / 3411人閱讀

摘要:一模塊化前端模塊化的好處都已經(jīng)被說(shuō)爛了,歸納為兩點(diǎn)避免全局變量污染有效的處理依賴關(guān)系終于引入了模塊的概念,最近學(xué)習(xí)了下,順便記下筆記。命名導(dǎo)出命名導(dǎo)出就是明確導(dǎo)出的變量名稱和值。其中表示導(dǎo)出模塊所有的命名輸出。

一、模塊化

前端模塊化的好處都已經(jīng)被說(shuō)爛了,歸納為兩點(diǎn):

避免全局變量污染

有效的處理依賴關(guān)系

ES2015終于引入了模塊的概念,最近學(xué)習(xí)了下,順便記下筆記。

二、準(zhǔn)備工作

借助Babel演示Demo。
創(chuàng)建個(gè)module目錄,并在該目錄里執(zhí)行:

npm init -y

然后安裝各種依賴:

npm install --save-dev babel-cli babel-preset-env babel-preset-es2015

接著創(chuàng)建.babelrc文件:

{
  "presets": [
      "es2015",
      "env"
      ]
}

修改package.json文件的"scripts"配置:

"scripts": {
    "build": "babel src --out-dir dist"
  }

最終的目錄結(jié)構(gòu)如:

三、模塊導(dǎo)出

一個(gè)文件定義一個(gè)模塊;

通過(guò)export語(yǔ)句導(dǎo)出該模塊輸出的變量。export語(yǔ)句有兩種語(yǔ)法格式:命名導(dǎo)出, 默認(rèn)導(dǎo)出。

1.命名導(dǎo)出

命名導(dǎo)出就是明確導(dǎo)出的變量名稱和值。
在src目錄下創(chuàng)建math.js,index.js文件。
math.js內(nèi)容:

// Case 1: export后面跟變量輸出聲明語(yǔ)句
export var PI = 3.14;

// Case 2: export后面直接跟變量定義語(yǔ)句
export var add = function (x, y) { // 導(dǎo)出函數(shù)print
    return x + y;
}

這表示math.js模塊導(dǎo)出變量PI和add, 用NodeJS的模塊格式可表示為:

var PI = 3.14;
var add = function (x, y) { // 導(dǎo)出函數(shù)print
    return x + y;
}

module.exports.PI = PI; 
module.exports.add = add;

index.js內(nèi)容:

import * as Math from "./math.js"; // import是導(dǎo)入模塊,后面會(huì)說(shuō)。

console.log(Math.PI);
console.log(Math.add(1, 2));

然后執(zhí)行下面的命令進(jìn)行Babel轉(zhuǎn)換:

npm run build

如果沒(méi)有報(bào)錯(cuò)的化,那module目錄下應(yīng)該生成了dist子目錄,并且生成了index.js和math.js文件(先不要在意文件的內(nèi)容)。
然后在執(zhí)行命令:

node dist/index.js

看看輸出結(jié)果是否OK:

3.14
3

如果導(dǎo)出多個(gè)變量,可以采用簡(jiǎn)寫格式(調(diào)整math.js內(nèi)容):

var PI = 3.14;
var add = function (x, y) { 
    return x + y;
}
export { PI, add }; // 簡(jiǎn)寫格式,統(tǒng)一列出需要輸出的變量

重復(fù)上述步驟中執(zhí)行npm和Node命令查看看輸出結(jié)果是否OK。
并且該簡(jiǎn)寫格式還可以對(duì)輸出的變量重命名,之前的都是模塊里聲明的變量名作為模塊導(dǎo)出的變量的名
再次修改math.js

var PI = 3.14;

var add = function (x, y) { 
    return x + y;
}

export { PI, add as Add}; // 把輸出變量add重命名為Add(注意不用雙引號(hào))

通過(guò)關(guān)鍵字as把輸出變量add重命名為Add,注意Add是個(gè)字面量,不是字符串不需要引號(hào)。同樣在導(dǎo)入math.js模塊的index.js模塊也要修改下:

import * as Math from "./math.js";

console.log(Math.PI);
console.log(Math.Add(1, 2)); // Add方法名稱改動(dòng)了。

命名導(dǎo)出需要同時(shí)制定導(dǎo)出的變量名稱和變量值,所以export語(yǔ)句后面跟的一般是變量輸出聲明語(yǔ)句塊,變量定義語(yǔ)句,不可以是表達(dá)式,因?yàn)楸磉_(dá)式只有值,沒(méi)有名字。

2. 默認(rèn)導(dǎo)出

通過(guò)關(guān)鍵字default修飾export可以指定一個(gè)模塊的默認(rèn)輸出變量值(在導(dǎo)入模塊的默認(rèn)輸出時(shí),不需要指定導(dǎo)出變量名稱,這個(gè)后面再說(shuō))。

// Case 3 常量
export default 25; 

// Case 4 變量
var PI = 3.14;
export default PI 

// Case 5 函數(shù)
export default function add2( x, y) {
    return x + y;
}

注意

一個(gè)模塊最多只能有一個(gè)默認(rèn)導(dǎo)出;

默認(rèn)輸出可以視為名字是"default"的模塊輸出變量;

默認(rèn)導(dǎo)出后面可以是表達(dá)式,因?yàn)樗恍枰担?/p>

export語(yǔ)句必須在模塊作用域的最頂層,即export不可以出現(xiàn)在任意花括號(hào)內(nèi),如函數(shù)語(yǔ)句里,子代碼塊里(控制語(yǔ)句)。

四、模塊導(dǎo)入

通過(guò)import語(yǔ)句導(dǎo)入外部模塊。對(duì)應(yīng)export語(yǔ)句的兩種導(dǎo)出方式(命名模塊導(dǎo)出和默認(rèn)模塊導(dǎo)出),import也分別存在兩種不同的模塊導(dǎo)入語(yǔ)法格式。

1. 導(dǎo)入模塊的命名輸出變量

修改index.js:

import { PI, Add} from "./math.js";
console.log(PI);
console.log(Add(1, 2));

表示:導(dǎo)入math.js模塊里輸出的變量PI, Add,注意名稱必須要和math.js模塊的輸出變量一一對(duì)應(yīng),否則就是undefined。
重新執(zhí)行npm和node命令看看輸出是否OK。
該格式還支持對(duì)導(dǎo)入的變量重命名:

import { PI as pi, Add as add} from "./math.js";

如果導(dǎo)入一個(gè)模塊所有命名輸出,可采用通配符"*:
修改index.js:

import * as Math from "./math.js"; // 此時(shí)必須通過(guò)as指定個(gè)別名
console.log(Math.PI);
console.log(Math.Add(1, 2));

表示導(dǎo)入模塊math.js所有命名輸出變量,并通過(guò)Math變量引用。

2. 導(dǎo)入模塊的默認(rèn)輸出

修改math.js:

var PI = 3.14;

var add = function (x, y) { 
    return x + y;
}

export { PI, add as Add}; // 簡(jiǎn)寫格式,統(tǒng)一列出需要輸出的變量

export default function say() { // 默認(rèn)輸出
    console.log("I am default export");
}

修改index.js:

import say  from "./math.js"; // 
say();

表示導(dǎo)入模塊math.js的默認(rèn)輸出,此時(shí)不可以用as重命名哦(因?yàn)槊挚梢匀我舛x)。

執(zhí)行命令查看輸出是否OK。

導(dǎo)入模塊默認(rèn)輸出的名字可以任意命名。

import say2  from "./math.js"; // 
say2();

如果同時(shí)導(dǎo)入模塊的命名輸出和默認(rèn)輸出,可采用格式:

import say, * as Math from "./math.js"; 
// OR
import say, { PI, Add } from "./math.js"; 

有個(gè)限制條件默認(rèn)導(dǎo)入一定放在命名導(dǎo)入前面,即不能寫成:

import * as Math, say from "./math.js"; 
// OR
import { PI, Add }, say from "./math.js"; 

同樣import語(yǔ)句也必須在模塊的最頂層作用域里,即import不可以出現(xiàn)在任意花括號(hào)內(nèi),如函數(shù)語(yǔ)句里,子代碼塊里(控制語(yǔ)句)。

3. 只導(dǎo)入

如果只導(dǎo)入一個(gè)模塊,但不引用模塊的輸出變量,可以簡(jiǎn)寫為:

import "./math.js"

此時(shí)只會(huì)出發(fā)模塊math.js的執(zhí)行。

五、修改導(dǎo)入/導(dǎo)出的變量值 1. 修改導(dǎo)入的變量值

模塊可以導(dǎo)出任何類型變量(引用變量和值變量),如果在模塊index.js里修改了模塊math.js導(dǎo)出的引用變量或者值變量,那會(huì)影響模塊math.js里的值么?
修改math.js:

var PI = 3.14;
var Person = {
    name: "Bob"
}

export { PI, Person}; 
export default function say() {
    console.log(`Person:${JSON.stringify(Person)}, PI:${PI}`)
}

修改index.js:

import say, * as Math from "./math.js"; 

say(); // 修改前
Math.Person = 12;
Math.PI = 0;
say(); // 修改后

執(zhí)行npm和node查看輸出:

從輸出可以看出雖然我們?cè)趇ndex.js模塊里修改了math.js模塊的導(dǎo)出變量,但并不會(huì)影響math.js里的值。

2. 修改導(dǎo)出的變量值

反過(guò)來(lái)想想,如果模塊math.js修改了其導(dǎo)出的引用變量或者值變量在,那會(huì)影響模塊index.js里的取值么?
修改math.js:

var Count = 0;
var increase =  function() {
    Count++;
}
var Person = {
    name: "Bob"
}
var changeName = function() {
    Person.name = "John";
}

export { Count, Person, increase, changeName}; 

修改index.js:

import say, * as Math from "./math.js"; 

console.log(`Person:${JSON.stringify(Math.Person)}, Count:${Math.Count}`);// 修改前
Math.increase();
Math.changeName();
console.log(`Person:${JSON.stringify(Math.Person)}, Count:${Math.Count}`);//  修改后

輸出:

從輸出可以看出只要math.js修改了導(dǎo)出值就會(huì)影響index.js的取值。

3. 小結(jié)

模塊的輸出變量(引用類型或者值類型)對(duì)其他引用模塊來(lái)說(shuō)都是只讀的

模塊修改了其輸出變量的值會(huì)影響其他引入模塊的取值。

六、再看export語(yǔ)句

了解了export和import的用法后,我們?cè)倏纯磂xport語(yǔ)句另一個(gè)語(yǔ)法規(guī)則:導(dǎo)出引入的模塊的變量。上面的例子里export語(yǔ)句都是導(dǎo)出模塊自身定義的變量,export還可以導(dǎo)模塊引入模塊的輸出。
在src目錄添加文件log.js:

export var Log = function(msg) {
    console.log(msg);
}
export default "I am log.js";

修改math.js:

var Count = 0;
var increase =  function() {
    Count++;
}
var Person = {
    name: "Bob"
}

var changeName = function() {
    Person.name = "John";
}

export { Count, Person, increase, changeName}; 
export default function say() {
    console.log(`Person:${JSON.stringify(Person)}, Count:${Count}`)
}
export * from "./log.js"; // 

修改index.js:

import say, * as Math from "./math.js"; 

Math.Log("hello"); // 該方法來(lái)之log.js模塊

查看下輸出是否OK。

其中“export * from "./log.js";”表示導(dǎo)出模塊log.js所有的命名輸出。等價(jià)于:

export { Log } from "./log.js";

注意:這種語(yǔ)法格式“export * from "./log.js";”不可以定義別名,而花括號(hào)的語(yǔ)法格式“export { Log } from "./log.js"”可以定義別名,即:

export { Log as log} from "./log.js"

怎么在math.js模塊里導(dǎo)出模塊log.js的默認(rèn)輸出呢?只能采用先導(dǎo)入,再導(dǎo)出方式:

import logName from "./log.js";
export { logName }
參考

MDN export

MDN import

Babel 入門教程

Babel Learn ES2015

An Introduction To JavaScript ES6 Modules

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/90086.html

相關(guān)文章

  • [譯]ES6 模塊化入門

    摘要:當(dāng)我們學(xué)習(xí)的模塊化,就會(huì)發(fā)現(xiàn)它的發(fā)展深受的影響。嚴(yán)格模式在模塊系統(tǒng)中,嚴(yán)格模式是默認(rèn)開啟的。同樣的,模塊內(nèi)部的聲明只在模塊內(nèi)部有效。在中,我們使用導(dǎo)入內(nèi)容在模塊中,我們只需要為導(dǎo)入的綁定起一個(gè)名字我們也可以導(dǎo)入具名導(dǎo)出的內(nèi)容。 ES6 模塊系統(tǒng) 在 ES6 之前,我們已經(jīng)知道了 RequireJS,AngularJS 的依賴注入,以及 CommonJS,具體可以看筆者的上一篇文章《JS...

    shmily 評(píng)論0 收藏0
  • ES6腳丫系列】模塊Module

    摘要:命令用于規(guī)定本模塊的對(duì)外接口??崭衲K名字符串。其他模塊加載該模塊時(shí),命令可以為該匿名函數(shù)指定任意名字。寫法函數(shù)聲明命令用在非匿名函數(shù)前,也是可以的。加載的時(shí)候,視同匿名函數(shù)加載。 本文字符數(shù)8200+,閱讀時(shí)間約16分鐘。 『ES6知識(shí)點(diǎn)總結(jié)』模塊Module 第一節(jié):Module基本概念 【01】過(guò)去使用CommonJS和AMD,前者用于服務(wù)器,后者用于瀏覽器。 Module可以取...

    gotham 評(píng)論0 收藏0
  • require,import區(qū)別

    摘要:,區(qū)別遵循的模塊化規(guī)范不一樣模塊化規(guī)范即為提供一種模塊編寫模塊依賴和模塊運(yùn)行的方案。出現(xiàn)的時(shí)間不同相關(guān)的規(guī)范由于野生性質(zhì),在年前后出生。作為的規(guī)范,一直沿用至今。這其實(shí)要感謝原來(lái)項(xiàng)目名叫做,后更名為這個(gè)神一般的項(xiàng)目。 require,import區(qū)別 遵循的模塊化規(guī)范不一樣 模塊化規(guī)范:即為 JavaScript 提供一種模塊編寫、模塊依賴和模塊運(yùn)行的方案。誰(shuí)讓最初的 JavaScri...

    Rango 評(píng)論0 收藏0
  • ES6 的模塊系統(tǒng)

    摘要:的模塊系統(tǒng)被設(shè)計(jì)成讓你可以一次性引入多個(gè)變量。動(dòng)態(tài)靜態(tài),或者說(shuō)規(guī)矩和如何打破規(guī)矩作為一門動(dòng)態(tài)編程語(yǔ)言,令人驚訝地?fù)碛幸粋€(gè)靜態(tài)的模塊系統(tǒng)。只要你的需求都是靜態(tài)的話,這個(gè)模塊系統(tǒng)還是很的。 此文為翻譯,原文地址在這兒:https://hacks.mozilla.org/2015/08/es6-in-depth-modules/ ES6 是 ECMAScript 第 6 版本的簡(jiǎn)稱,這是新一...

    MudOnTire 評(píng)論0 收藏0
  • 前端模塊化詳解

    摘要:提倡依賴前置,在定義模塊的時(shí)候就要聲明其依賴的模塊。適用場(chǎng)景按需加載條件加載動(dòng)態(tài)的模塊路徑注關(guān)于模塊化,詳細(xì)見阮一峰的入門模塊與模塊化區(qū)別模塊化的規(guī)范和兩種。 模塊化開發(fā)方便代碼的管理,提高代碼復(fù)用性,降低代碼耦合,每個(gè)模塊都會(huì)有自己的作用域。當(dāng)前流行的模塊化規(guī)范有CommonJS,AMD,CMD,ES6的import/export CommonJS的主要實(shí)踐者就是nodejs,一般...

    zhangfaliang 評(píng)論0 收藏0
  • 深入 CommonJs 與 ES6 Module

    摘要:目前主流的模塊規(guī)范模塊通用模塊如果你在文件頭部看到這樣的代碼,那么這個(gè)文件使用的就是規(guī)范實(shí)際上就是全局變量這三種風(fēng)格的結(jié)合這段代碼就是對(duì)當(dāng)前運(yùn)行環(huán)境的判斷,如果是環(huán)境就是使用規(guī)范,如果不是就判斷是否為環(huán)境,最后導(dǎo)出全局變量有了后我們的代碼和 目前主流的模塊規(guī)范 UMD CommonJs es6 module umd 模塊(通用模塊) (function (global, facto...

    sanyang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<