ES6之module

来源:http://www.cnblogs.com/giggle/archive/2016/06/14/5572118.html
-Advertisement-
Play Games

JavaScript一直沒有模塊體系,但是伴隨著ES6的到來,module隨之而來。ES6module提倡一個js文件就是一個模塊的概念,主要包括兩個命令:export和import,用於模塊向外提供介面(export)和引入其他模塊介面(import)。該隨筆分為四部分:1、ES6module概述... ...


一、module概述

JavaScript一直沒有模塊體系,但是伴隨著ES6的到來,module隨之而來。

ES6module的設計思想是儘量的靜態化,使得編譯時就能確定模塊的依賴關係,以及輸入、輸出變數。簡而言之就是‘編譯時載入’。

ES6module相對來說實現得還是比較簡單,易上手。

ES6module提倡一個js文件就是一個模塊的概念,主要包括兩個命令:export和import,用於模塊向外提供介面(export)和引入其他模塊介面(import)。

好了,下麵就說下我說理解的export命令和import命令。

註:學習ES6之module需要有個轉換器,因為現在好多還沒有支持ES6的module。見“ES6轉換ES5

二、export命令

export命令說白了就是用於模塊對外提供的介面。

語法如下:

var f = 1;
export {f};

或者

export var f = 1;

但是不能是下麵這個樣子:

var f = 1;
export f;

為什麼呢?

需要註意ES6module是向外拋的值的引用,是引用(這和CommonJS模塊不一樣,CommonJS是向外拋的值的拷貝)

所以,你像上面這樣肯定不對嘛,因為export f就是向外拋的值了,不是引用咯。

並且,還需要註意的是,export不是最後處理的哦,什麼意思?

比如test1:

export {name};
var name = 'Monkey';

如上,這樣其實向外拋的是空,如果用ES6module的import(import在下麵會詳情說到)引用它,會輸出undefined。

如下(利用import)test2:

import {name} from './test';
console.log(name);

將test1和test2,利用babel轉換成ES5後的代碼如下:

test1:

test2:

在node環境下運行test2,得下:

所以,export在ES6module中,和代碼一樣依行執行。而不像ES6module中的import那樣會將其提升到模塊頂部,首先執行。

三、import命令

import命令說白了,就是引用export對外提供的介面。對,是引用,而不是賦值。

import的用法如下:

/*
    name為test.js文件中export往外拋的引用名,名字必須一一對應
    from後面的'./test'為你所引入模塊的相對路徑
*/
import {name} from './test';

其中,如果你想改變引用名,可以用as,如下:

import {name as ourName} from './test';

如果你想引入模塊中的所有變數,可以利用通配符*,然後利用as自定義名稱,如下:

//引入test模塊的所有拋出的引用,並將其存放在allVar中
import * as allVar from './test';
//隨後,如果test模塊中有one方法,我們可以這麼使用
allVar.one();

像上面這些例子中,我們用import都需要明確指定模塊中對應的引用名稱,或者使用*全部引用。其實,我們還可以在export中設置default,這樣import引用模塊時,就不需要指定使用名啦。

什麼意思?

如下:

//test模塊
function getName(){
    console.log('Monkey');
};
//default其實就相當於ES6module為我們設定的一個名字,對應getName的值
export default getName;

//使用test模塊,one是我隨便起的名字,它就對應default,而不需要{}了
import one from './test';
四、升華

ES6module輸出的值是值的引用。我們可以通過一個demo,更透徹地認識這點。

如下:

//模塊sample
var i = 0;
export {i};
//模塊test1,引入sample模塊
import {i} from './sample';
i++;
//模塊test2,引入sample模塊
import {i} from './sample';
console.log(i);
//模塊main,引入test1和test2模塊
import './test1';
import './test2';

利用bable轉換:

報錯了!!在模塊test1中的i++是只讀的。(’i’ is read-only).

原因就是:由於ES6輸入的模塊變數,只是一個”符號連接“,所以這個變數是只讀的,對它進行重新賦值會報錯。(摘自‘阮一峰—ECMAScript6入門’)。

我們再修改下上面的代碼,

如下:

利用bable轉換如上代碼後,利用cmd,運行main.js,得如下結果:

 

我們在main.js中是利用import引入test1和test2模塊,但是,從上面的結果可以看出,他們是引用的同一份sample。

所以,ES6module輸出的值是值的引用。且,因為ES6module輸出的值是值的引用。所以當出現迴圈引用模塊時,它和CommonJS是不一樣的。

如下,CommonJS’s Demo:

註:CommonJS是值的拷貝,不是引用。

main.js

var y = require('./test');
exports.b = 'dorie';
setTimeout(function(){
    console.log(y.y);
},2000); 

test.js

var b = require('./main');
var y;
setTimeout(function(){
    y = 'monkey' + b.b;
},1000);  
exports.y = y;  

運行main.js,得下結果:

 

Why?

因為CommonJS是值的拷貝,當執行main.js時,引入test模塊,將y的值賦值給main.js里的y變數,此時y是undefined,且已經賦值了,但test模塊在1秒後運行setTimeout里的匿名函數後,y變為’monkey’ + b.b,可是對main.js里的y已經無影響,因為是值拷貝嘛。

我們將上述代碼換成ES6module的形式,如下:

main.js

import {y} from './test';
export var b = 'dorie';
setTimeout(function(){
    console.log(y);
},2000);  

test.js

import {b} from './main';
var y;
setTimeout(function(){
    y = 'monkey' + b;
},1000);  
export {y}; 

利用Bable將ES6module轉換成ES5後,在node環境下運行轉換後的main.js,得如下結果:

 

其實邏輯與上述CommonJS是一樣的,但是結果卻不一樣,原因就是ES6module是值的引用!!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.先奉上整理的14圖。 2.其次奉上整理的圖之間的6種關係 ...
  • 函數調用方法 在談論JavaScript中apply、call和bind這三兄弟之前,我想先說下,函數的調用方式有哪些: 作為函數 作為方法 作為構造函數 通過它們的call()和apply()方法間接調用 前面的三種調用方法,我們都知道且不在這篇文章的討論範圍內,就不說了。 下麵我們來說說這第四種 ...
  • 1、塊級元素 一般用來搭建網站架構、佈局、承載內容……它包括以下這些標簽: address、blockquote、center、dir、div、dl、dt、dd、fieldset、form、h1~h6、hr、isindex、menu、noframes、noscript、ol、p、pre、table、 ...
  • 目前主流瀏覽器的相容性做的都比較好了,本文主要針對IE6,7的不相容問題進行解決。 1.有浮動存在時,計算一定要精確,不要讓內容的寬高超出我們所設置的寬高,IE6下,內容會撐開設置好的高度。 解決方法:給對應的父級加overflow:hidden;但是會有部分被隱藏掉,最好是精確計算寬高再設定 eg ...
  • 前言: 1.HTML5的發展非常迅速,可以說已經是前端開發人員的標配,在電商類型的APP中更是運用廣泛,這個系列的文章是本人自己整理,儘量將開發中不常用到的剔除,將經常使用的拿出來,使需要的朋友能夠真正快速入門,如果有哪些不清楚的地方或者錯誤,歡迎聯繫我 2.更新時間沒有規律,一般會在3天左右更新一 ...
  • 一丶 流 什麼是流? 比如 react 中的單項數據流,Node.js 中的流,或者本文中的 DOM 事件流,都是流的具體體現。專業地講,流是程式輸入或輸出的一個連續的位元組序列;通俗地講,流是有方向的數據。 二丶 事件流 什麼是事件流? 假想一下,現在有一組同心圓,你把手指在最裡面的圓心上,與此同時 ...
  • 1:視頻播放器2:地理定位 我們的支持html5 的瀏覽器給我們提供一個介面(api),可以用來獲取你當前的位置. 主要是通過geolocation(地理位置),對象 ,去訪問硬體,來獲取到經緯度.. 我們獲取到的是一個經緯度。我們調用地圖。我們調用百度地圖.(街景地圖) 3: 拖拽 html5 里 ...
  • 1.prototype和__proto__ 所有對象的__proto__都指向其構造器的prototype,即constructor的原型 2.變數作用域的問題 通常認為在當前作用域中找不到變數值時會到其父作用域中去尋找,這種說法是不准確的,應該是會到創建這個函數的作用域中去找 3.settimeo ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...