模塊化javascript

1.什么是模塊化

目前最普遍的JavaScript運行平臺便是瀏覽器,在瀏覽器中,所有的代碼都運行在同一個全局上下文中。這使得你即使更改應用中的很小一部分,你也要擔心可能會產生的命名沖突。

傳統的JavaScript應用被分離在多個文件中,并且在構建的時候連接在一起,這稍顯笨重。所以人們開始將每個文件內的代碼都包在一個自執行函數中:(function() { ... })();。這種方法創建了一個本地作用域,于是最初的模塊化的概念產生了。之后的CommonJS和AMD系統中所稱的模塊,也是由此實現的。

換句話說,現存的“模塊”系統是使用已有的語言特性所實現的。

2.閉包模塊(自執行函數)

(function(){
    //do something
})()

自執行函數可以有效的防止變量和函數名沖突(作用域的原因)

在舊版的javascript中,所有的函數都是global對象下的一個屬性(瀏覽器中的global是window)

3.commonJS

CommonJS API定義很多普通應用程序(主要指非瀏覽器的應用)使用的API,從而填補了這個空白。它的終極目標是提供一個類似Python,Ruby和Java標準庫。這樣的話,開發者可以使用CommonJS API編寫應用程序,然后這些應用可以運行在不同的JavaScript解釋器和不同的主機環境中

以上引用自百度百科- -

commonJS的API主要引入了2個東西:

  • require - 用來加載一個模塊
  • module.exports - 一個模塊導出的內容

其中,require與ES6中的import一樣,module.exports與ES6中的export一樣

練習使用babel來轉換pie.js時遇到的問題:babel報錯

G:\Learning\commonJS>babel-node
> import {pi,e} from "./constants";
SyntaxError: repl: Modules aren't supported in the REPL
> 1 | import {pi,e} from "./constants";
    | ^

> console.log('pie=',pi + e);

搜索stackoverflow解決
該錯誤消息說。
你不能在REPL使用ES6模塊的語法,它是不受支持。
如果你想測試他們,你應該做一個***.js文件,把你的代碼在那里,然后運行
解決辦法:

G:\Learning\commonJS>babel-node --presets es2015 pie.js
pie= 5.85987

stackOverflow問題鏈接

回答問題:如果 require 一個模塊三次,文件會被加載幾次?

文件只會被加載一次
Node.js在載入模塊時,如果之前該模塊已經加載過則不會有重復開銷,因為模塊加載有緩存機制

Node.js中相同模塊是否會被加載多次?

默認導出:
設定文件默認值:

export default 42;

這個值會被babel編譯為:

exports.default = 42;

Babel 將 ES6 模塊的默認導出值轉譯成了 CommonJS 模塊的 default 屬性。
導入的這個 default 屬性的方法被稱為命名導入(Named Import)。

import answer from "./constants.js";
console.log(answer);

這里這個answer可以隨意寫成其它名字。

image_1atoj90ocp8p1bssvq5134nfr9.png-28.1kB
image_1atoj90ocp8p1bssvq5134nfr9.png-28.1kB

我們可以看到 answer 被重寫成 _constants.default,這個 import 語法實際上訪問了 CommonJS 模塊的 default 屬性。

4 ES6和commonJS的兼容性

ES6 和 CommonJS 模塊之間最大的差別,就在于模塊的默認導出是如何工作的。

CommonJS 其實并沒有默認導出值這個概念。用 require 來加載一個模塊會返回這個模塊本身。

對比使用defaukt符導入的fs模塊和使用通配符導入的fs模塊

使用default導入的fs

//這里是使用default導入的fs
"use strict";

var _fs = require("fs");

var _fs2 = _interopRequireDefault(_fs);

function _interopRequireDefault(obj) {
    return obj && obj.__esModule ? obj : {default: obj};
}

// Same as: require("fs").default
_fs2.default.readFileSync("package.json", "utf8");

使用通配符導入的fs模塊

//這里是使用通配符導入的fs模塊
"use strict";

var _fs = require("fs");

var fs = _interopRequireWildcard(_fs);

function _interopRequireWildcard(obj) {
    if (obj && obj.__esModule) {
        return obj;
    } else {
        var newObj = {};
        if (obj != null) {
            for (var key in obj) {
                if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key];
            }
        }
        newObj.default = obj;
        return newObj;
    }
}

fs.readFileSync("package.json", "utf8");

5.使用webpack

使用webpack打包后的文件,可以在瀏覽器中運行

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,179評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,628評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,444評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,948評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,185評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,717評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,794評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,414評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,750評論 2 370

推薦閱讀更多精彩內容