美文网首页
AMD CommonJS 和 UMD

AMD CommonJS 和 UMD

作者: 柏丘君 | 来源:发表于2018-10-08 14:46 被阅读0次

在 ESM 之前,前端常用的模块规范有 AMD,CommonJS 以及 UMD,其中 AMD 是浏览器端的 JavaScript 模块规范,以 requireJS 为代表,CommonJS 主要用在 Node 中,是服务端 JavaScript 模块规范。UMD 则对二者进行了一个整合。

使用 AMD 规范

通过 requireJS 这个库,可以在浏览器上使用 AMD 规范来管理依赖。这里有一个简单的例子。
首先是 HTML 代码,通过 script 标签引入了 requireJS 库文件,其中 script 标签上的 data-main 属性是告诉 requireJS,项目的主文件是 main.js,requireJS 将首先加载 main.js 文件。

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <script data-main="main" src="./require.js"></script>
  <title>Document</title>
</head>
<body>
  
</body>
</html>

接下来看 main.js 文件的内容:

// 对 requireJS 进行配置
require.config({
  paths:{
    lib:"./lib",
  }
})

// 使用 require 导入模块
require(["lib"],(lib) => {
  lib.print();
})

main.js 中依赖了 lib 模块,lib 模块在 lib.js 中定义,其中 lib 模块又依赖了 help 模块,在 help.js 中定义。下面是 lib.jshelp.js 的代码:

// 使用 define 定义模块
define(["help"],(help) => {
  return {
    print(){
      console.log("Module Lib")
      help.print();
    }
  }
})
// 使用 define 定义模块
define(() => {
  const text = "Module Help";
  return {
    print(){
      console.log(text)
    }
  }
})

下面是这个例子中的文件列表:

.
└── module
    ├── help.js
    ├── index.html
    ├── lib.js
    ├── main.js
    └── require.js

在浏览器中打开 HTML 文件,我们看到控制台有如下输出:

Module Lib
Module Help

以上,就是借助 requireJS 使用 AMD 规范的基本用法。

使用 CommonJS 规范

CommonJS 是服务端的 JavaScript 模块规范,在使用 Node 时使用的频率非常高,这里就不多介绍了。

使用 UMD 规范

UMD 规范也叫做通用模块规范(Universal Module Definition),同时兼容了 AMD 规范和CommonJS 规范。这意味着 UMD 规范可以同时在浏览器和服务端上使用。(CommonJS 规范也可以在浏览器上使用,可以参考这篇文章
下面我们使用 UMD 规范来定义前面提到的 lib 模块,新建一个 lib.umd.js 文件:

((root,factory) => {
  // 如果存在 define 全局函数,就使用 AMD 规范
  if(typeof define === "function"){
    define(["help"],factory)
  // 如果存在 exports 对象,就使用 CommonJS 规范
  }else if(typeof exports === "object"){
    module.exports = factory(require("./help"))
  // 上述条件都不满足,尝试使用全局的方式定义模块
  }else{
    root.returnExprots = factory(root.help)
  }
})(window,(help) => {
  return {
    print(){
      console.log("Module Lib(UMD)")
      help.print();
    }
  }
})

在使用 UMD 规范时,首先定义一个自执行函数,该函数接受一个 factory 工厂方法作为参数,和使用 requireJS 一样,factory 方法接受一系列的参数,这些参数就是模块所依赖的其他模块,factory 返回值就是我们要向外暴露出的模块。factory 方法会在其依赖的模块都被加载后调用。
在自执行函数的函数体中,对 AMD 规范 和 CommonJS 规范进行了兼容性的处理,根据所处的环境来使用不同的模块规范。
如果既没有采用 AMD 规范有没有采用 CommonJS 规范,将会尝试通过全局的方式定义模块。
接下来,修改 main.js 文件的配置项,将 lib 模块指向 lib.umd.js

// 对 requireJS 进行配置
require.config({
  paths:{
    lib:"./lib.umd",
  }
})

// 使用 require 导入模块
require(["lib"],(lib) => {
  lib.print();
})

在浏览器中重新打开 HTML 文件,控制台输出如下:

Module Lib(UMD)
Module Help

以上,我们就结合和 AMD 规范和 UMD 规范,实现了前端的模块化。使用 UMD 规范定义的 lib 库,既可以在浏览器使用(AMD),又可以在服务端使用(CommonJS)。

完。

相关文章

  • gulp-babel

    因amd和commonjs都是require转换时默认commonjs,如需AMD转换,也可以填写UMD

  • JS模块化

    模块化规范:CommonJS,AMD,CMD,UMD,ES6 Module CommonJS CommonJS是服...

  • AMD CommonJS 和 UMD

    在 ESM 之前,前端常用的模块规范有 AMD,CommonJS 以及 UMD,其中 AMD 是浏览器端的 Jav...

  • AMD、CommonJS、UMD

    要点总结: AMD:异步模块写法(define中可以用exports,exports其实就是导出的模块对象) Co...

  • JS的各种模块化规范

    AMD CMD CommonJs UMD ES6 一路演进 AMD 异步模块定义规范(Asynchron...

  • AMD, CMD, CommonJS和UMD

    原文链接:https://www.jianshu.com/p/bd4585b737d7 今天由于项目中引入的ech...

  • AMD, CMD, CommonJS和UMD

    我的Github(https://github.com/tonyzheng1990/tonyzheng1990.g...

  • AMD,CMD,CommonJS和UMD

    由于项目中引入的echarts的文件很大,requirejs通常会加载超时,因此必须单独加载才能加载echarts...

  • 什么是 AMD,CommonJS 和 UMD?

    (本文译自What Is AMD, CommonJS, and UMD?) 介绍 多年来,可供选择的JavaScr...

  • CommonJS AMD CMD UMD

    CommonJS CommonJS是服务器端模块的规范,Node.js采用了这个规范。 根据CommonJS规范,...

网友评论

      本文标题:AMD CommonJS 和 UMD

      本文链接:https://www.haomeiwen.com/subject/avidaftx.html