天天看點

前端中commonjs、amd、system、umd、es2015、ESNEXT等子產品的差別

作者:NativeBase

這些都是關于子產品的不同規範。

下面是各自的解釋:

  • CommonJS: 一個JavaScript規範,用于在伺服器端和桌面應用程式中編寫JavaScript。主要是用于Node.js上。
  • AMD: 異步子產品定義,是一個在浏覽器環境中解決子產品化問題的JavaScript庫。主要優點是能夠異步加載子產品,進而提高頁面加載速度。
  • SystemJS: 是一個在浏覽器環境下的動态子產品加載器,支援各種子產品系統和加載器(包括AMD,CommonJS和ES2015)。
  • UMD: 通用子產品定義,是一種子產品化解決方案,能夠在 CommonJS 或 AMD 程式中運作。如果它們不可用,則使用全局變量注冊子產品,以便在多種環境中使用。
  • ES2015 或 ESNEXT: ECMAScript語言的新版本中加入了子產品化的引入方法。在 ES6 中引入了一種新的子產品加載系統,其簡潔性與可靠性使其成為開發人員的首選。這種子產品加載系統使用單個“export”和“import”語句,使代碼更容易編寫、調試和維護。

優缺點

CommonJS: 優點:

  1. 簡單、易于了解。
  2. 同步加載,代碼執行有序。
  3. 支援在浏覽器中使用Browserify等打包工具打包使用。

缺點:

  1. 跨伺服器載入負擔重。
  2. 同步加載耗時較多。
  3. 無法進行異步加載,阻塞頁面渲染。

AMD (異步子產品定義):

優點:

  1. 異步加載子產品,不會阻塞頁面渲染。
  2. 更适合浏覽器環境。
  3. 适用于大型項目,減小子產品數量,提高性能。

缺點:

  1. 定義子產品比較複雜。
  2. 需要使用requireJS等AMD标準的庫去實作AMD子產品。

SystemJS:

優點:

  1. 通用的動态加載器,在浏覽器和伺服器中均可使用。
  2. 簡化依賴注入,增加開發效率。

缺點:

  1. 加載時間有點長。

UMD (通用子產品定義):

優點:

  1. 可自适應地根據環境自動選擇加載子產品的方式。
  2. 兼具 AMD、CommonJS 這兩種子產品系統的優點。

缺點:

  1. 代碼量大。

ES2015 (ES6) 以及更新版本:

優點:

  1. 簡潔、易于管理,采用單個“export”和“import”語句。
  2. 與ES6文法更加契合,提高代碼的可讀性和可維護性。

缺點:

  1. 相容性問題,需要編譯或轉換器的支援。

總的來說,每種子產品類型都有其獨特的優缺點,開發人員應該根據自身項目的需要和特點來選擇合适的子產品類型。

用法

CommonJS: 用法

// 導出子產品
module.exports = myModule;

// 加載子產品
var myModule = require('myModule');           

AMD (異步子產品定義): 用法:

// 定義子產品
define(['dependency1', 'dependency2'], function(dependency1, dependency2) {
  return function() {
    // 子產品代碼
  };
});

// 加載子產品
require(['myModule'], function(myModule) {
  // 加載後的代碼
});           

SystemJS: 用法:

// 加載子產品
System.import('myModule.js').then(function(myModule) {
// 加載後的代碼
});           

UMD (通用子產品定義): 用法:

(function (root, factory) {
if (typeof exports === 'object' && typeof module === 'object') {
// CommonJS
module.exports = factory(require('jquery'));
} else if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else {
// Browser globals (root is window)
root.myModule = factory(root.jQuery);
}
}(this, function ($) {
// 子產品代碼
}));           

ES2015 (ES6) 以及更新版本: 用法:

// 導出子產品
export default myModule;

// 導入子產品
import myModule from 'myModule.js';
           

需要注意的是,目前不是所有浏覽器都支援 ES6 的導入導出文法,是以需要使用工具 Babel 等将 ES6 轉化為 ES5 方可使用。

總之,不同的子產品規範可以在不同的環境下使用。

例如,在伺服器端CommonJS是一種流行的規範。

而在浏覽器環境中,AMD和ES2015則更為流行。無論你選擇什麼樣的子產品規範,主要的目标是提高JavaScript代碼的可讀性和可維護性。

前端中commonjs、amd、system、umd、es2015、ESNEXT等子產品的差別

繼續閱讀