webpack與模塊化

模塊化

把復(fù)雜的問(wèn)題分解成相對(duì)獨(dú)立的模塊,降低程序復(fù)雜性埋虹,提高代碼的重用堪遂。

  • commonJS
  • AMD
  • CMD
  • UMD
  • ESM

模塊化的核心

  • 獨(dú)立的作用域(一個(gè)文件就是模塊秩冈,擁有獨(dú)立的作用域,且導(dǎo)出的模塊都自動(dòng)處于 嚴(yán)格模式下沃测,即'use strict'
  • 如何導(dǎo)出模塊內(nèi)部數(shù)據(jù)
  • 如何導(dǎo)入外部模塊數(shù)據(jù)

導(dǎo)出模塊

// 導(dǎo)出單個(gè)
export let name1,name2, ..., nameN;
export let name1 = ...,name2 = ..., nameN;
export function funName() { ... }
export class className { ... }

// 導(dǎo)出列表
export { name1, name2, ..., nameN };

// 重命令導(dǎo)出
export { variable1 as name1, variable2 as name2, ..., nameN };

// 默認(rèn)導(dǎo)出
export default function(...) {...}
export default expression;
export default function name(...) { ... }
export { name1 as default, ... }

// 模塊重定向?qū)С?export *  from  ...;
export { name1,name2 } from ...;
export { import1 as name1, import2 as name2 } from ...;
export { default } from ...;

導(dǎo)入模塊

靜態(tài)導(dǎo)入
在瀏覽器缭黔,import語(yǔ)句只能在聲明了type="module"的 script 的標(biāo)簽中使用

import defaultExport from "module-name";
import * as name from "module-name";
import { export } from "module-name";
import { export as alias } from "module-name";
import { export1 , export2 } from "module-name";
import { foo , bar } from "module-name/path/to/specific/un-exported/file";
import { export1 , export2 as alias2 , [...] } from "module-name";
import defaultExport, { export [ , [...] ] } from "module-name";
import defaultExport, * as name from "module-name";
import "module-name";

靜態(tài)導(dǎo)入方式不支持延遲加載,import 必須這模塊的最開(kāi)始

document.onclick = function () {
    // import 必須放置在當(dāng)前模塊最開(kāi)始加載
    import m1 from './m1.js'
    console.log(m1);
}

動(dòng)態(tài)導(dǎo)入

此外蒂破,還有一個(gè)類似函數(shù)的動(dòng)態(tài) import()馏谨,它不需要依賴 type="module" 的 script 標(biāo)簽。

關(guān)鍵字 import 可以像調(diào)用函數(shù)一樣來(lái)動(dòng)態(tài)的導(dǎo)入模塊。以這種方式調(diào)用,將返回一個(gè) promise鱼的。

import('./m.js')
  .then(m => {
    //...
});
// 也支持 await
let m = await import('./m.js');

通過(guò) import() 方法導(dǎo)入返回的數(shù)據(jù)會(huì)被包裝在一個(gè)對(duì)象中,即使是 default 也是如此

CommonJS

在早起前端對(duì)于模塊化并沒(méi)有什么規(guī)范喊儡,反而是偏向服務(wù)端的應(yīng)用有更強(qiáng)烈的需求,CommonJS 規(guī)范就是一套偏向服務(wù)端的模塊化規(guī)范稻据,NodeJS 就采用了這個(gè)規(guī)范管宵。

獨(dú)立模塊作用域

一個(gè)文件就是模塊,擁有獨(dú)立的作用域

導(dǎo)出模塊內(nèi)部數(shù)據(jù)

通過(guò) module.exportsexports 對(duì)象導(dǎo)出模塊內(nèi)部數(shù)據(jù)

// a.js
let a = 1;
let b = 2;

module.exports = {
  x: a,
  y: b
}
// or
exports.x = a;
exports.y = b;

導(dǎo)入外部模塊數(shù)據(jù)

通過(guò) require 函數(shù)導(dǎo)入外部模塊數(shù)據(jù)

// b.js
let a = require('./a');
a.x;
a.y;

AMD

因?yàn)?CommonJS 規(guī)范一些特性(基于文件系統(tǒng),同步加載)箩朴,它并不適用于瀏覽器端岗喉,所以另外定義了適用于瀏覽器端的規(guī)范

AMD(Asynchronous Module Definition)

https://github.com/amdjs/amdjs-api/wiki/AMD

瀏覽器并沒(méi)有具體實(shí)現(xiàn)該規(guī)范的代碼,我們可以通過(guò)一些第三方庫(kù)來(lái)解決

requireJS

https://requirejs.org/

// 1.html
<script data-main="scripts/main" src="https://cdn.bootcss.com/require.js/2.3.6/require.min.js"></script>

獨(dú)立模塊作用域

通過(guò)一個(gè) define 方法來(lái)定義一個(gè)模塊炸庞,并通過(guò)該方法的第二個(gè)回調(diào)函數(shù)參數(shù)來(lái)產(chǎn)生獨(dú)立作用域

// scripts/Cart.js
define(function() {
  // 模塊內(nèi)部代碼
})

導(dǎo)出模塊內(nèi)部數(shù)據(jù)

通過(guò) return 導(dǎo)出模塊內(nèi)部數(shù)據(jù)

// scripts/Cart.js
define(function() {
  return class Cart {
    add(item) {
      console.log(`添加商品:${item}`)
    }
  }
})

導(dǎo)入外部模塊數(shù)據(jù)

通過(guò)前置依賴列表導(dǎo)入外部模塊數(shù)據(jù)

// scripts/main.js
// 定義一個(gè)模塊钱床,并導(dǎo)入 ./Cart 模塊
define(['./Cart'], function(Cart) {
  let cart = new Cart()
  cart.add({name: 'iphoneXX', price: 1000000})
})

requireJS 的 CommonJS 風(fēng)格

require.js 也支持 CommonJS 風(fēng)格的語(yǔ)法

導(dǎo)出模塊內(nèi)部數(shù)據(jù)

// scripts/Cart.js
define(['require', 'exports', 'module'], function(require, exports, module) {
  class Cart {
    add(item) {
      console.log(`添加商品:${item}`)
    }
  }
  exports.Cart = Cart;
})
// 忽略不需要的依賴導(dǎo)入
define(['exports'], function(exports) {
  class Cart {
    add(item) {
      console.log(`添加商品:${item}`)
    }
  }
  exports.Cart = Cart;
})
// 如果是依賴的導(dǎo)入為:require, exports, module,也可以省略依賴導(dǎo)入聲明
define(function(require, exports, module) {
  class Cart {
    add(item) {
      console.log(`添加商品:${item}`)
    }
  }
  exports.Cart = Cart;
})

導(dǎo)入外部模塊數(shù)據(jù)

// scripts/main.js
define(['./Cart'], function(Cart) {
  let cart = new Cart()
  cart.add({name: 'iphoneXX', price: 1000000})
})

UMD

嚴(yán)格來(lái)說(shuō)埠居,UMD 并不屬于一套模塊規(guī)范查牌,它主要用來(lái)處理 CommonJSAMD滥壕、CMD 的差異兼容纸颜,是模塊代碼能在前面不同的模塊環(huán)境下都能正常運(yùn)行

(function (root, factory) {
    if (typeof module === "object" && typeof module.exports === "object") {
        // Node, CommonJS-like
        module.exports = factory(require('jquery'));
    }
    else if (typeof define === "function" && define.amd) {
        // AMD 模塊環(huán)境下
        define(['jquery'], factory);
    }
}(this, function ($) { // $ 要導(dǎo)入的外部依賴模塊
    $('div')
    // ...
    function b(){}
    function c(){}

    // 模塊導(dǎo)出數(shù)據(jù)
    return {
        b: b,
        c: c
    }
}));
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市绎橘,隨后出現(xiàn)的幾起案子胁孙,更是在濱河造成了極大的恐慌,老刑警劉巖称鳞,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涮较,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡冈止,警方通過(guò)查閱死者的電腦和手機(jī)狂票,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)熙暴,“玉大人闺属,你說(shuō)我怎么就攤上這事≈苊梗” “怎么了掂器?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)诗眨。 經(jīng)常有香客問(wèn)我,道長(zhǎng)孕讳,這世上最難降的妖魔是什么匠楚? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮厂财,結(jié)果婚禮上芋簿,老公的妹妹穿的比我還像新娘。我一直安慰自己璃饱,他們只是感情好与斤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般撩穿。 火紅的嫁衣襯著肌膚如雪磷支。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天食寡,我揣著相機(jī)與錄音雾狈,去河邊找鬼。 笑死抵皱,一個(gè)胖子當(dāng)著我的面吹牛善榛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呻畸,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼移盆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了伤为?” 一聲冷哼從身側(cè)響起咒循,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钮呀,沒(méi)想到半個(gè)月后剑鞍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爽醋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年蚁署,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚂四。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡光戈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出遂赠,到底是詐尸還是另有隱情久妆,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布跷睦,位于F島的核電站筷弦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏抑诸。R本人自食惡果不足惜烂琴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜕乡。 院中可真熱鬧奸绷,春花似錦、人聲如沸层玲。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至畔派,卻和暖如春铅碍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背父虑。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工该酗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人士嚎。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓呜魄,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親莱衩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子爵嗅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • webpack與模塊化 模塊化已經(jīng)是現(xiàn)代前端開(kāi)發(fā)中不可或缺的一部分了 把復(fù)雜的問(wèn)題分解成相對(duì)獨(dú)立的模塊,這樣的設(shè)計(jì)...
    kino2046閱讀 443評(píng)論 0 0
  • 1 Webpack 1.1 概念簡(jiǎn)介 1.1.1 WebPack是什么 1笨蚁、一個(gè)打包工具 2睹晒、一個(gè)模塊加載工具 3...
    Kevin_Junbaozi閱讀 6,673評(píng)論 0 16
  • 因?yàn)閮?nèi)容太多,沒(méi)有大綱不方便閱讀括细,所以也可以跳轉(zhuǎn) 前端各種模塊化方案總結(jié) 附帶大綱[https://tenloy....
    Tenloy閱讀 4,308評(píng)論 0 6
  • 模塊化概述 傳統(tǒng)開(kāi)發(fā)模式的主要問(wèn)題① 命名沖突② 文件依賴通過(guò)模塊化解決上述問(wèn)題 模塊化就是把單獨(dú)的一個(gè)功能封裝到...
    東邪_黃藥師閱讀 226評(píng)論 0 0
  • 當(dāng)前主流 JS 模塊化方案 CommonJS 規(guī)范伪很,nodejs 實(shí)現(xiàn)的規(guī)范 AMD 規(guī)范,requirejs 實(shí)...
    那少婦閱讀 389評(píng)論 0 0