JavaScript的模塊系統詳解(二)

本文是JavaScript模塊系統系列的第二篇。

CommonJS

CommonJS旨在爲服務端JavaScript應用程序的模塊化開發提供規範。在NodeJS最初的幾個版本中,開發人員也是需要遵守CommonJS規範,由於各種原因NodeJS最終形成了自己的一套模塊系統實現,但仍然無法脫離CommonJS規範的影響:

// In circle.js
const PI = Math.PI;
exports.area = (r) => PI * r * r;
exports.circumference = (r) => 2 * PI * r;

// In some file
const circle = require('./circle.js');
console.log( `The area of a circle of radius 4 is ${circle.area(4)}`);

無論是CommonJS規範還是NodeJS,都會涉及兩個基本接口的調用,即require和exports。require接受模塊ID,將其它模塊導入到當前作用域供後續調用,NodeJS模塊通常存放在node_modules文件夾下。

exports用於暴露公共接口供require導入,與CommonJS規範不同的是,NodeJS的具體實現是module.exports,也有exports變量,但本質上是對module.exports的引用。如果將整個對象賦值給exports,將破壞exports對module.exports的綁定:

// This won't work, replacing exports entirely breaks the binding to
// modules.exports.
exports =  (width) => {
  return {
    area: () => width * width
  };
}

// This works as expected.
module.exports = (width) => {
  return {
    area: () => width * width
  };
}

由於CommonJS從一開始就是爲服務端開發服務的,只考慮同步化調用,且按照require在文件中的調用位置進行順序加載模塊,所以不適合Web客戶端。

特點

  • 使用簡單;
  • 支持依賴管理;
  • 可隨時調用require導入模塊;
  • 解決了模塊間的循環依賴問題。

缺點

  • 同步化方案不適合Web客戶端;
  • 瀏覽器原生不支持,需要添加額外的庫;
  • 不適合對源碼進行靜態分析。

推薦文章

JavaScript的模塊系統詳解(一)
世界編程語言排行榜
數據結構與算法之堆排序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章