一分鐘搞懂模塊化的esm, cjs, amd, umd

在前端開(kāi)發(fā)中耙旦,有多種模塊化規(guī)范和方案脱羡。下面是常見(jiàn)的幾種模塊化規(guī)范的使用與構(gòu)建示例。

模塊化

1. ES Modules (ESM):

ES Modules 是 ECMAScript 標(biāo)準(zhǔn)中定義的模塊化規(guī)范母廷,它是現(xiàn)代 JavaScript 開(kāi)發(fā)中推薦的模塊化方案轻黑。ES Modules 使用 importexport 關(guān)鍵字來(lái)導(dǎo)入和導(dǎo)出模塊。

// moduleA.js
export const message = 'Hello, ES Modules!';

// moduleB.js
import { message } from './moduleA';
console.log(message); // 輸出:Hello, ES Modules!

構(gòu)建示例:

// gulpfile.js
const gulp = require('gulp');
const ts = require('gulp-typescript');
const babel = require('gulp-babel');

gulp.task('build:esm', function () {
  return gulp.src('src/**/*.ts')
    .pipe(ts())
    .pipe(gulp.dest('dist/esm'));
});

2. CommonJS (CJS):

CommonJS 是 Node.js 中使用的模塊化規(guī)范琴昆,也可以在其他環(huán)境中使用氓鄙,如使用 Browserify、Webpack 等工具進(jìn)行打包业舍。CommonJS 使用 requiremodule.exports 來(lái)導(dǎo)入和導(dǎo)出模塊抖拦。

// moduleA.js
const message = 'Hello, CommonJS!';
module.exports = message;

// moduleB.js
const message = require('./moduleA');
console.log(message); // 輸出:Hello, CommonJS!

構(gòu)建示例:

// gulpfile.js
const gulp = require('gulp');
const ts = require('gulp-typescript');
const babel = require('gulp-babel');
const rename = require('gulp-rename');

gulp.task('build:cjs', function () {
  return gulp.src('src/**/*.ts')
    .pipe(ts({ module: 'commonjs' }))
    .pipe(gulp.dest('dist/cjs'));
});

3. AMD (Asynchronous Module Definition):

AMD 是一種異步模塊定義規(guī)范,主要用于瀏覽器環(huán)境中舷暮。它使用 define 函數(shù)來(lái)定義模塊态罪,并使用 require 函數(shù)來(lái)異步加載依賴(lài)模塊。

// moduleA.js
define([], function () {
  return 'Hello, AMD!';
});

// moduleB.js
require(['moduleA'], function (moduleA) {
  console.log(moduleA); // 輸出:Hello, AMD!
});

4. UMD (Universal Module Definition):

UMD 是一種通用的模塊化規(guī)范下面,可以在多種環(huán)境中使用复颈,包括瀏覽器環(huán)境和服務(wù)器端。UMD 模塊既可以通過(guò) require 導(dǎo)入沥割,也可以通過(guò)全局變量訪(fǎng)問(wèn)耗啦。

(function (root, factory) {
  if (typeof define === 'function' && define.amd) {
    define([], factory);
  } else if (typeof module === 'object' && module.exports) {
    module.exports = factory();
  } else {
    root.moduleA = factory();
  }
}(typeof self !== 'undefined' ? self : this, function () {
  return 'Hello, UMD!';
}));

在這個(gè)自執(zhí)行函數(shù)中,首先通過(guò) typeof self !== 'undefined' 來(lái)判斷 self 對(duì)象是否定義机杜。self 對(duì)象代表了當(dāng)前的全局對(duì)象帜讲,它在瀏覽器環(huán)境中指向 window 對(duì)象。如果 self 對(duì)象未定義椒拗,那么說(shuō)明代碼運(yùn)行的環(huán)境不是瀏覽器環(huán)境似将。

接下來(lái),根據(jù)不同的判斷分支執(zhí)行相應(yīng)的操作:

  • 如果 define 函數(shù)存在并且 typeof define === 'function' && define.amd 成立蚀苛,說(shuō)明代碼運(yùn)行在支持 AMD 規(guī)范的環(huán)境在验,這時(shí)使用 define() 函數(shù)定義模塊。
  • 如果 module 對(duì)象存在并且 typeof module === 'object' && module.exports 成立堵未,說(shuō)明代碼運(yùn)行在支持 CommonJS 規(guī)范的環(huán)境译红,這時(shí)使用 module.exports 導(dǎo)出模塊。
  • 如果以上條件都不滿(mǎn)足兴溜,說(shuō)明代碼運(yùn)行在其他環(huán)境侦厚,將模塊定義在全局對(duì)象下耻陕,即 root.moduleA = factory()。

通過(guò)這種方式刨沦,UMD 示例中的代碼可以在不同的環(huán)境中靈活地進(jìn)行模塊定義和導(dǎo)出诗宣。

構(gòu)建示例

// webpack.config.js
const path = require('path');

module.exports = {
  entry: './src/main.ts',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
    libraryTarget: 'umd',
  },
  module: {
    rules: [
      {
        test: /\.ts$/,
        exclude: /node_modules/,
        use: [
          'babel-loader',
          'ts-loader',
        ],
      },
    ],
  },
  resolve: {
    extensions: ['.ts', '.js'],
  },
};

以上是常見(jiàn)的幾種模塊化規(guī)范和方案的代碼示例,保持學(xué)習(xí)想诅,共勉~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末召庞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子来破,更是在濱河造成了極大的恐慌篮灼,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件徘禁,死亡現(xiàn)場(chǎng)離奇詭異诅诱,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)送朱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)娘荡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人驶沼,你說(shuō)我怎么就攤上這事炮沐。” “怎么了回怜?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵大年,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我玉雾,道長(zhǎng)鲜戒,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任抹凳,我火速辦了婚禮,結(jié)果婚禮上伦腐,老公的妹妹穿的比我還像新娘赢底。我一直安慰自己,他們只是感情好柏蘑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布幸冻。 她就那樣靜靜地躺著,像睡著了一般咳焚。 火紅的嫁衣襯著肌膚如雪洽损。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天革半,我揣著相機(jī)與錄音碑定,去河邊找鬼流码。 笑死,一個(gè)胖子當(dāng)著我的面吹牛延刘,可吹牛的內(nèi)容都是我干的漫试。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼碘赖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼驾荣!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起普泡,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤播掷,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后撼班,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體歧匈,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年权烧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了眯亦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡般码,死狀恐怖妻率,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情板祝,我是刑警寧澤宫静,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站券时,受9級(jí)特大地震影響孤里,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜橘洞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一捌袜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧炸枣,春花似錦虏等、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至侯养,卻和暖如春敦跌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逛揩。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工柠傍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留麸俘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓携兵,卻偏偏與公主長(zhǎng)得像疾掰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子徐紧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355