本文是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客戶端;
- 瀏覽器原生不支持,需要添加額外的庫;
- 不適合對源碼進行靜態分析。
推薦文章