【JS基礎(chǔ)】JS模塊化雜記

參 照:
http://www.reibang.com/p/554454d951d9
http://blog.csdn.net/xcymorningsun/article/details/52709608
http://imweb.io/topic/582293894067ce9726778be9
https://juejin.im/entry/58aa60182f301e006c32bb97

最 新:
https://www.zybuluo.com/c-Ku/note/938733

最初的JS用來實現(xiàn)簡單的頁面邏輯尚粘,因而放在頁面中的 <script> 標簽內(nèi)贤徒,或是通過該標簽來進行調(diào)用蚂且。每一個通過 <script> 標簽調(diào)用的文件此時可被看成單個模塊齐帚,不同模塊的接口都暴露在全局作用域(window)下圾结,污染了全局作用域贵扰,文件只能按照script標簽書寫順序進行加載等浊,且在大型項目中冗雜堆積屯曹,可維護性差瓢喉。

為了在一定程度上避免問題宁赤,通常會采用 命名空間 的形式,比如:

var MYNAMESPACE = {
    PEOPLE: {
        person: function(name) {
            this.name = name;
            this.getName = function() {
                return this.name;
            }
        }
    },
    PET: {
        dog: function(petName) {
            this.petName = petName;
            this.getPetName = function() {
                return this.petName;
            }
        }
    }
};

var MYNAMESPACE = MYNAMESPACE || {};

后來有了AMD(國外)栓票,CMD(國內(nèi))决左,CommonJS(服務(wù)器端)等規(guī)范愕够,這些(野生)規(guī)范的核心是允許模塊通過 require方法 來同步加載所要依賴的其他模塊,然后通過 exportsmodule.export 來導(dǎo)出需要暴露的接口佛猛。

// 共生
(function (root, factory) {

    if (typeof define === 'function' && define.amd) {

        // AMD
        define(['jquery', 'underscore'], factory);

    } else if (typeof exports === 'object') {

        // Node, CommonJS之類的
        module.exports = factory(require('jquery'), require('underscore'));

    } else {

        // 瀏覽器全局變量(root 即 window)
        root.returnExports = factory(root.jQuery, root._);

    }

}(this, function ($, _) {

    // 方法
    function a(){}; // 私有方法惑芭,因為它沒被返回 (見下面)

    function b(){}; // 公共方法,因為被返回了

    function c(){}; // 公共方法继找,因為被返回了

    // 暴露公共方法
    return {
        b: b,
        c: c
    }
 
}));   

AMD要求在頭里引入依賴(依賴前置遂跟,提前執(zhí)行)
CMD可在編寫過程中引入依賴(依賴就近,延遲執(zhí)行)

var a = require('a');

// AMD
define(['./a', './b'], function(a, b) {  // 依賴必須一開始就寫好  
   a.doSomething()    
   // 此處略去 100 行    
   b.doSomething()
});

// CMD
define(function(require, exports, module) {
   var a = require('./a')   
   a.doSomething()   
   // 此處略去 100 行   
   var b = require('./b') 
   // 依賴可以就近書寫   
   b.doSomething()
});

ES6發(fā)布后婴渡,module成為標準
標準的使用以import引入模塊
以export導(dǎo)出接口

在Node.js中幻锁,使用CommonJS規(guī)范,
因而使用require引入模塊边臼,
使用module.exports導(dǎo)出接口


import

ES6中哄尔,import需放在文件頭部,且前面不允許有其他邏輯代碼柠并。

import $ from 'jquery';
import * as _ from '_';
import {a,b,c} from './a';
import {default as alias, a as a_a, b, c} from './a';

部分用法參見 解構(gòu)賦值

export

如下的語句中岭接,b 在 export 仍可被修改。

export default function() {}
export function a () {}

var b = 'xxx';
export { b }; // {b: b}
setTimeout(() => b = 'ooo', 1000);
export var c = 100;

as關(guān)鍵字

// a.js
var a = function() {};
export {a as fun};

// b.js
import {fun as a} from './a';
a();

// c.js
export function fun() {};

通過「取別名」的方式來解決不同接口重名的問題
在 import 和 export 中皆可使用堂鲤。

define

在 import 時寫這樣

import a from './d';

// 等效于亿傅,或者說就是下面這種寫法的簡寫,是同一個意思
import {default as a} from './d';

在 export 時寫這樣

// d.js
export default function() {}

// 等效于:
function a() {};
export {a as default};

*

這個符號用于繼承某一個模塊全部的接口
比如:

import * as _ from '_';

_.func()    // 調(diào)用

「require是賦值過程瘟栖,import是解構(gòu)過程」
至于「該用require還是import葵擎?」這個問題
目前而言,所有的引擎都還沒有實現(xiàn)import
node中是使用了babel將ES6轉(zhuǎn)碼為ES5再執(zhí)行
import語法會被轉(zhuǎn)碼為require半哟。

因而在模塊導(dǎo)出時使用module.exports
在引入時使用import仍然起效
本質(zhì)上酬滤,import會被轉(zhuǎn)碼為require去執(zhí)行。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寓涨,一起剝皮案震驚了整個濱河市盯串,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌戒良,老刑警劉巖体捏,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異糯崎,居然都是意外死亡几缭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門沃呢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來年栓,“玉大人,你說我怎么就攤上這事薄霜∧匙ィ” “怎么了纸兔?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長否副。 經(jīng)常有香客問我汉矿,道長,這世上最難降的妖魔是什么副编? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任负甸,我火速辦了婚禮流强,結(jié)果婚禮上痹届,老公的妹妹穿的比我還像新娘。我一直安慰自己打月,他們只是感情好队腐,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奏篙,像睡著了一般柴淘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秘通,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天为严,我揣著相機與錄音,去河邊找鬼肺稀。 笑死第股,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的话原。 我是一名探鬼主播夕吻,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼繁仁!你這毒婦竟也來了涉馅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤黄虱,失蹤者是張志新(化名)和其女友劉穎稚矿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捻浦,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡晤揣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了默勾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碉渡。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖母剥,靈堂內(nèi)的尸體忽然破棺而出滞诺,到底是詐尸還是另有隱情形导,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布习霹,位于F島的核電站朵耕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏淋叶。R本人自食惡果不足惜阎曹,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望煞檩。 院中可真熱鬧处嫌,春花似錦、人聲如沸斟湃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凝赛。三九已至注暗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間墓猎,已是汗流浹背捆昏。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留毙沾,地道東北人骗卜。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像搀军,于是被迫代替她去往敵國和親膨俐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

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