成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

有同學開發了一個組件庫,可被模塊化給坑死了......

開發 前端
我們知道,庫的打包一般推薦使用 ?rollup。不過 rollup 使用起來可并不簡單,特別是?打包格式的問題!。庫的打包格式劃分要比項目復雜的多,涉及到?IIFE、UMD、ESM、CJS?等多種格式方案。

Hello,大家好,我是 Sunday。

最近有同學開發了一套自己的組件庫,目前組件已經儲備了 30 多個。但是,在 打包的時候 可遇到了不少的坑。

我們知道,庫的打包一般推薦使用  rollup。不過 rollup 使用起來可并不簡單,特別是 打包格式的問題!。庫的打包格式劃分要比項目復雜的多,涉及到 IIFE、UMD、ESM、CJS 等多種格式方案。

那么這些打包格式到底要怎么使用?每一個又代表的是什么意思呢?

今天咱們就針對這個問題,來統一為大家解釋一下!

為什么要關注打包格式?

打包格式本質上決定了我們打包后的代碼該如何在不同的環境下運行。

比如,你可能會打包一個工具庫,希望它既能在瀏覽器環境下以 <script> 引入,也能在 Node.js 中通過 require 引入,還能通過 import 在現代的模塊化項目中使用。不同的場景需要不同的打包格式支持,那么想要達成這樣的目的,我們就必須要了解打包格式!

目前常見的打包格式主要有 4 種,分別為:IIFE、UMD、ESM、CJS。

1. IIFE (Immediately Invoked Function Expression)

IIFE(立即執行函數表達式)是一種將代碼包裹在立即執行的函數中的打包格式。這種格式可以直接在瀏覽器中運行,因為所有代碼都被封裝在一個函數里,所以不會污染全局作用域。

使用場景

適合直接用 <script> 標簽引入的場景,在這種情況下,你只需要加載文件,就可以立即運行。

代碼示例

// Rollup 配置
export default {
  input: 'src/index.js',
  output: {
    file: 'dist/bundle.iife.js',
    format: 'iife', // IIFE 格式
    name: 'MyLibrary', // 全局變量名
  }
};

上面的配置會生成一個 IIFE 格式的文件。假設你的庫名為 MyLibrary,在瀏覽器中引入這個打包文件后,就可以通過 window.MyLibrary 訪問你的庫。

打包結果示例

(function () {
  'use strict';

  function sayHello() {
    console.log('Hello, World!');
  }

  window.MyLibrary = { sayHello };

})();

這里可以看到所有代碼被包裹在一個立即執行函數中。因為我們指定了 name: 'MyLibrary',最終結果會掛載到 window.MyLibrary 下。

2. UMD (Universal Module Definition)

UMD(通用模塊定義)是一個兼容性極強的格式,它同時支持 AMD(異步模塊定義)和 CommonJS 模塊規范。也就是說,不管你是在瀏覽器、Node.js,還是其他模塊加載器環境中,UMD 格式都能適用。

使用場景

適合需要兼容性強的庫,既希望支持 require 引入,也希望能在瀏覽器中通過 <script> 引入的場景。

代碼示例

// Rollup 配置
export default {
  input: 'src/index.js',
  output: {
    file: 'dist/bundle.umd.js',
    format: 'umd', // UMD 格式
    name: 'MyLibrary'
  }
};

打包結果示例

(function (global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
  typeof define === 'function' && define.amd ? define(factory) :
  (global.MyLibrary = factory());
}(this, (function () {
  'use strict';

  function sayHello() {
    console.log('Hello, World!');
  }

  return { sayHello };

})));

UMD 格式的代碼根據不同的環境,選擇不同的導出方式:

  • 如果檢測到 module.exports 存在,則導出為 CommonJS;
  • 如果 define.amd 存在,則支持 AMD。
  • 否則,將庫掛載到全局對象(在瀏覽器環境中通常是 window)。

3. ESM (ES Module)

ESM(ES 模塊)是 ES6 規范下的模塊化格式。

ESM 格式支持 import 和 export,在現代瀏覽器以及支持模塊化的環境(比如 Node.js >=12)中,ESM 是首選格式,因為它在加載效率、按需加載方面都有天然優勢。

使用場景

適合現代的模塊化項目,通過 import 和 export 語法進行模塊導入導出。

代碼示例

// Rollup 配置
export default {
  input: 'src/index.js',
  output: {
    file: 'dist/bundle.esm.js',
    format: 'es' // ESM 格式
  }
};

打包結果示例

// bundle.esm.js
function sayHello() {
  console.log('Hello, World!');
}

export { sayHello };

這里我們直接使用了 export,ESM 格式生成的代碼可以直接被其他模塊通過 import 引入,而不需要任何額外的包裝。

4. CJS (CommonJS)

CJS(CommonJS)是 Node.js 的模塊規范。

在 CommonJS 中,使用 module.exports 和 require 來導出和導入模塊。CJS 格式在 Node.js 環境中非常常見。

使用場景

適合在 Node.js 環境中使用的庫,適合需要使用 require 的場景。

代碼示例

// Rollup 配置
export default {
  input: 'src/index.js',
  output: {
    file: 'dist/bundle.cjs.js',
    format: 'cjs' // CJS 格式
  }
};

打包結果示例

'use strict';

function sayHello() {
  console.log('Hello, World!');
}

module.exports = { sayHello };

在 CJS 格式下,我們通過 module.exports 導出函數或對象,這樣其他文件就可以使用 require 導入該模塊。

如何選擇正確的格式

在使用 Rollup 打包時,我們應該根據使用場景選擇合適的格式:

  • IIFE:適合直接在瀏覽器中以 <script> 方式引入,不需要模塊化的支持。
  • UMD:適合需要支持多種加載方式的庫,兼容性最好。
  • ESM:首選的現代模塊格式,適合現代模塊化項目。
  • CJS:適合在 Node.js 環境中使用的模塊。

多格式輸出的組合

為了兼容不同的使用場景,很多庫會選擇同時輸出多種格式。即:我們可以通過一種統一的配置,一次性完成多種格式的輸出:

// Rollup 配置
export default {
  input: 'src/index.js',
  output: [
    { file: 'dist/bundle.iife.js', format: 'iife', name: 'MyLibrary' },
    { file: 'dist/bundle.umd.js', format: 'umd', name: 'MyLibrary' },
    { file: 'dist/bundle.esm.js', format: 'es' },
    { file: 'dist/bundle.cjs.js', format: 'cjs' }
  ]
};

這樣配置后,Rollup 會生成四種不同格式的文件,我們可以根據需要,選擇合適的文件進行引入。

責任編輯:武曉燕 來源: 程序員Sunday
相關推薦

2017-02-13 18:46:38

Android模塊化組件化

2023-02-13 00:18:22

前端庫框架集合

2017-07-11 11:02:03

APP模塊化架構

2020-07-17 09:58:31

Python開發工具

2018-09-07 23:06:18

量子計算機架構開發

2014-04-27 10:16:31

QCon北京2014Andrew Bett

2019-02-11 14:35:59

Linux硬件監控工具命令

2021-10-25 05:49:25

模塊化UPS電源

2019-08-28 16:18:39

JavaScriptJS前端

2016-07-25 18:09:29

2019-01-30 14:04:57

Fedora存儲庫

2010-08-02 09:10:36

Flex模塊化

2011-01-11 13:40:44

webcssdiv

2023-01-06 08:59:07

模塊化基礎設施框架

2021-10-11 09:51:37

模塊化UPS架構

2022-11-10 09:28:40

框架開發

2023-03-29 08:13:57

Windows 12微軟

2024-04-01 11:52:46

2021-02-06 23:26:25

聊天室開發WebSocket

2023-01-04 18:10:26

服務模塊化jre
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一级片 | 欧美日韩三区 | 亚洲一区在线日韩在线深爱 | 国产乱码精品一区二区三区五月婷 | 久久久久亚洲精品 | 国产精品日本一区二区在线播放 | 亚洲高清视频在线 | 亚洲精品短视频 | 欧美一区二区三区四区视频 | 久久午夜视频 | 国产一区二区三区在线视频 | 日本三级全黄三级a | 色视频在线播放 | 国产一区二区欧美 | 中文字幕乱码亚洲精品一区 | 国产精品视频yy9299一区 | 中文字幕亚洲视频 | 亚洲丝袜天堂 | 国产视频久久久 | 亚洲国产精品一区 | 日韩午夜电影在线观看 | 伊人免费视频二 | 成人在线看片 | 欧美日产国产成人免费图片 | 九九热免费在线观看 | 97精品超碰一区二区三区 | 激情国产在线 | 国产精品国产精品国产专区不片 | 久久久久久久国产 | 亚洲精品久久久久久一区二区 | 国产精品高潮呻吟久久 | 免费在线成人 | 亚洲国产高清高潮精品美女 | 精品日韩| 久久天天躁狠狠躁夜夜躁2014 | 亚洲一区二区三区免费视频 | 日韩精品 | 九九精品影院 | 国产9999精品 | 国产一区二区在线免费播放 | 韩日在线|