摘要:一模塊化前端模塊化的好處都已經被說爛了,歸納為兩點避免全局變量污染有效的處理依賴關系終于引入了模塊的概念,最近學習了下,順便記下筆記。命名導出命名導出就是明確導出的變量名稱和值。其中表示導出模塊所有的命名輸出。
一、模塊化
前端模塊化的好處都已經被說爛了,歸納為兩點:
避免全局變量污染
有效的處理依賴關系
ES2015終于引入了模塊的概念,最近學習了下,順便記下筆記。
二、準備工作借助Babel演示Demo。
創建個module目錄,并在該目錄里執行:
npm init -y
然后安裝各種依賴:
npm install --save-dev babel-cli babel-preset-env babel-preset-es2015
接著創建.babelrc文件:
{ "presets": [ "es2015", "env" ] }
修改package.json文件的"scripts"配置:
"scripts": { "build": "babel src --out-dir dist" }
最終的目錄結構如:
三、模塊導出一個文件定義一個模塊;
通過export語句導出該模塊輸出的變量。export語句有兩種語法格式:命名導出, 默認導出。
1.命名導出命名導出就是明確導出的變量名稱和值。
在src目錄下創建math.js,index.js文件。
math.js內容:
// Case 1: export后面跟變量輸出聲明語句 export var PI = 3.14; // Case 2: export后面直接跟變量定義語句 export var add = function (x, y) { // 導出函數print return x + y; }
這表示math.js模塊導出變量PI和add, 用NodeJS的模塊格式可表示為:
var PI = 3.14; var add = function (x, y) { // 導出函數print return x + y; } module.exports.PI = PI; module.exports.add = add;
index.js內容:
import * as Math from "./math.js"; // import是導入模塊,后面會說。 console.log(Math.PI); console.log(Math.add(1, 2));
然后執行下面的命令進行Babel轉換:
npm run build
如果沒有報錯的化,那module目錄下應該生成了dist子目錄,并且生成了index.js和math.js文件(先不要在意文件的內容)。
然后在執行命令:
node dist/index.js
看看輸出結果是否OK:
3.14 3
如果導出多個變量,可以采用簡寫格式(調整math.js內容):
var PI = 3.14; var add = function (x, y) { return x + y; } export { PI, add }; // 簡寫格式,統一列出需要輸出的變量
重復上述步驟中執行npm和Node命令查看看輸出結果是否OK。
并且該簡寫格式還可以對輸出的變量重命名,之前的都是模塊里聲明的變量名作為模塊導出的變量的名:
再次修改math.js
var PI = 3.14; var add = function (x, y) { return x + y; } export { PI, add as Add}; // 把輸出變量add重命名為Add(注意不用雙引號)
通過關鍵字as把輸出變量add重命名為Add,注意Add是個字面量,不是字符串不需要引號。同樣在導入math.js模塊的index.js模塊也要修改下:
import * as Math from "./math.js"; console.log(Math.PI); console.log(Math.Add(1, 2)); // Add方法名稱改動了。
命名導出需要同時制定導出的變量名稱和變量值,所以export語句后面跟的一般是變量輸出聲明語句塊,變量定義語句,不可以是表達式,因為表達式只有值,沒有名字。
2. 默認導出通過關鍵字default修飾export可以指定一個模塊的默認輸出變量值(在導入模塊的默認輸出時,不需要指定導出變量名稱,這個后面再說)。
// Case 3 常量 export default 25; // Case 4 變量 var PI = 3.14; export default PI // Case 5 函數 export default function add2( x, y) { return x + y; }
注意
一個模塊最多只能有一個默認導出;
默認輸出可以視為名字是"default"的模塊輸出變量;
默認導出后面可以是表達式,因為它只需要值;
export語句必須在模塊作用域的最頂層,即export不可以出現在任意花括號內,如函數語句里,子代碼塊里(控制語句)。
四、模塊導入通過import語句導入外部模塊。對應export語句的兩種導出方式(命名模塊導出和默認模塊導出),import也分別存在兩種不同的模塊導入語法格式。
1. 導入模塊的命名輸出變量修改index.js:
import { PI, Add} from "./math.js"; console.log(PI); console.log(Add(1, 2));
表示:導入math.js模塊里輸出的變量PI, Add,注意名稱必須要和math.js模塊的輸出變量一一對應,否則就是undefined。
重新執行npm和node命令看看輸出是否OK。
該格式還支持對導入的變量重命名:
import { PI as pi, Add as add} from "./math.js";
如果導入一個模塊所有命名輸出,可采用通配符"*:
修改index.js:
import * as Math from "./math.js"; // 此時必須通過as指定個別名 console.log(Math.PI); console.log(Math.Add(1, 2));
表示導入模塊math.js所有命名輸出變量,并通過Math變量引用。
2. 導入模塊的默認輸出修改math.js:
var PI = 3.14; var add = function (x, y) { return x + y; } export { PI, add as Add}; // 簡寫格式,統一列出需要輸出的變量 export default function say() { // 默認輸出 console.log("I am default export"); }
修改index.js:
import say from "./math.js"; // say();
表示導入模塊math.js的默認輸出,此時不可以用as重命名哦(因為名字可以任意定義)。
執行命令查看輸出是否OK。
導入模塊默認輸出的名字可以任意命名。
import say2 from "./math.js"; // say2();
如果同時導入模塊的命名輸出和默認輸出,可采用格式:
import say, * as Math from "./math.js"; // OR import say, { PI, Add } from "./math.js";
有個限制條件默認導入一定放在命名導入前面,即不能寫成:
import * as Math, say from "./math.js"; // OR import { PI, Add }, say from "./math.js";
同樣import語句也必須在模塊的最頂層作用域里,即import不可以出現在任意花括號內,如函數語句里,子代碼塊里(控制語句)。
3. 只導入如果只導入一個模塊,但不引用模塊的輸出變量,可以簡寫為:
import "./math.js"
此時只會出發模塊math.js的執行。
五、修改導入/導出的變量值 1. 修改導入的變量值模塊可以導出任何類型變量(引用變量和值變量),如果在模塊index.js里修改了模塊math.js導出的引用變量或者值變量,那會影響模塊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(); // 修改后
執行npm和node查看輸出:
從輸出可以看出雖然我們在index.js模塊里修改了math.js模塊的導出變量,但并不會影響math.js里的值。
2. 修改導出的變量值反過來想想,如果模塊math.js修改了其導出的引用變量或者值變量在,那會影響模塊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修改了導出值就會影響index.js的取值。
3. 小結模塊的輸出變量(引用類型或者值類型)對其他引用模塊來說都是只讀的
模塊修改了其輸出變量的值會影響其他引入模塊的取值。
六、再看export語句了解了export和import的用法后,我們再看看export語句另一個語法規則:導出引入的模塊的變量。上面的例子里export語句都是導出模塊自身定義的變量,export還可以導模塊引入模塊的輸出。
在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"); // 該方法來之log.js模塊
查看下輸出是否OK。
其中“export * from "./log.js";”表示導出模塊log.js所有的命名輸出。等價于:
export { Log } from "./log.js";
注意:這種語法格式“export * from "./log.js";”不可以定義別名,而花括號的語法格式“export { Log } from "./log.js"”可以定義別名,即:
export { Log as log} from "./log.js"
怎么在math.js模塊里導出模塊log.js的默認輸出呢?只能采用先導入,再導出方式:
import logName from "./log.js"; export { logName }參考
MDN export
MDN import
Babel 入門教程
Babel Learn ES2015
An Introduction To JavaScript ES6 Modules
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/90086.html
摘要:當我們學習的模塊化,就會發現它的發展深受的影響。嚴格模式在模塊系統中,嚴格模式是默認開啟的。同樣的,模塊內部的聲明只在模塊內部有效。在中,我們使用導入內容在模塊中,我們只需要為導入的綁定起一個名字我們也可以導入具名導出的內容。 ES6 模塊系統 在 ES6 之前,我們已經知道了 RequireJS,AngularJS 的依賴注入,以及 CommonJS,具體可以看筆者的上一篇文章《JS...
摘要:命令用于規定本模塊的對外接口。空格模塊名字符串。其他模塊加載該模塊時,命令可以為該匿名函數指定任意名字。寫法函數聲明命令用在非匿名函數前,也是可以的。加載的時候,視同匿名函數加載。 本文字符數8200+,閱讀時間約16分鐘。 『ES6知識點總結』模塊Module 第一節:Module基本概念 【01】過去使用CommonJS和AMD,前者用于服務器,后者用于瀏覽器。 Module可以取...
摘要:,區別遵循的模塊化規范不一樣模塊化規范即為提供一種模塊編寫模塊依賴和模塊運行的方案。出現的時間不同相關的規范由于野生性質,在年前后出生。作為的規范,一直沿用至今。這其實要感謝原來項目名叫做,后更名為這個神一般的項目。 require,import區別 遵循的模塊化規范不一樣 模塊化規范:即為 JavaScript 提供一種模塊編寫、模塊依賴和模塊運行的方案。誰讓最初的 JavaScri...
摘要:提倡依賴前置,在定義模塊的時候就要聲明其依賴的模塊。適用場景按需加載條件加載動態的模塊路徑注關于模塊化,詳細見阮一峰的入門模塊與模塊化區別模塊化的規范和兩種。 模塊化開發方便代碼的管理,提高代碼復用性,降低代碼耦合,每個模塊都會有自己的作用域。當前流行的模塊化規范有CommonJS,AMD,CMD,ES6的import/export CommonJS的主要實踐者就是nodejs,一般...
摘要:目前主流的模塊規范模塊通用模塊如果你在文件頭部看到這樣的代碼,那么這個文件使用的就是規范實際上就是全局變量這三種風格的結合這段代碼就是對當前運行環境的判斷,如果是環境就是使用規范,如果不是就判斷是否為環境,最后導出全局變量有了后我們的代碼和 目前主流的模塊規范 UMD CommonJs es6 module umd 模塊(通用模塊) (function (global, facto...
閱讀 2825·2023-04-25 20:06
閱讀 1446·2021-08-26 14:15
閱讀 2234·2021-08-12 13:27
閱讀 1772·2019-08-30 15:55
閱讀 3469·2019-08-30 13:20
閱讀 2825·2019-08-29 15:12
閱讀 3330·2019-08-29 15:06
閱讀 2858·2019-08-29 14:13