Bootstrap

【NPM】工程化依赖包/库开发 之 基础知识2

补充知识点:模块规范 (及格式)
当下主流模块规范:CommonJSAMDUMDCMDESM

模块规范

1. CommonJS

维度内容
特点采用同步加载模块,适合在服务器端使用(如Node.js)。
使用require导入模块,使用module.exports导出模块。
场景主要用于Node.js环境,适合后端开发。
优点简单易懂,适合服务器端的模块化。
缺点不支持异步加载,不适合浏览器环境。
  • 示例:
// module.js - 定义模块
const hello = () => 'Hello, world!';
module.exports = hello;

// main.js - 加载模块
const hello = require('./module');
console.log(hello()); // 输出: Hello, world!

2. AMD

全称:Asynchronous Module Definition -> 异步模块定义

维度内容
特点异步加载模块,适合浏览器环境
使用define定义模块,使用require加载模块。
场景适用于需要异步加载浏览器项目
优点支持异步加载,提高性能。
缺点语法较复杂,配置较多。
  • 示例:
// module.js - 定义模块
define([], function() {
  return function() {
    console.log('Hello from AMD!');
  };
});

// main.js - 加载模块
require(['module'], function(myModule) {
  myModule();
});

3. UMD

全称:Universal Module Definition -> 通用模块定义

维度内容
特点结合了CommonJSAMD,支持多种环境(浏览器Node.js)。
使用(function (root, factory) {...})(this, factory)模式。
场景用于框架,可以在多种环境中使用。
优点灵活,兼容性强。
缺点代码较冗长,增加了复杂性。
  • 示例:
// myLibrary.js
(function (root, factory) {
  if (typeof define === 'function' && define.amd) {
    define([], factory);
  } else if (typeof exports === 'object') {
    module.exports = factory();
  } else {
    root.myLibrary = factory();
  }
}(this, function () {
  return function() {
    console.log('Hello from UMD!');
  };
}));

// 使用
const myLibrary = require('./myLibrary');
myLibrary();

4. CMD

全称:Common Module Definition -> 公共模块定义

维度内容
特点异步加载,灵感来自AMD,但更注重依赖的执行顺序。
使用define定义模块,采用惰性加载
场景主要用于Sea.js框架的项目。
优点支持惰性加载,依赖处理更灵活。
缺点生态相对较小,社区支持有限。
  • 示例:
// module.js
define(function(require, exports, module) {
  module.exports = function() {
    console.log('Hello from CMD!');
  };
});

// main.js
define(function(require) {
  var myModule = require('./module');
  myModule();
});

5. ESM (ES Modules)

ES6 moduleES Modules 实际上是指同一种模块化机制

  • ES6 Module: 是对 ECMAScript 2015(也称为 ES6)中引入的模块系统的简称。它包含了importexport语法,用于实现模块化。
  • ES Modules: 是对 ES6 Module正式称呼,通常用于指代现代 JavaScript 中的模块系统。它代表的是一组与模块相关的规范和功能。
维度内容
特点原生支持模块化,使用importexport语法。
支持异步加载,浏览器原生支持
场景现代JavaScript项目,浏览器Node.js都支持。
优点语法简洁,支持静态分析,性能优越。
缺点需要较新版本的浏览器Node.js旧环境不支持
  • 示例:
// module.js
export function greet() {
  console.log('Hello from ES Modules!');
}

// main.js
import { greet } from './module.js';
greet();
;