js 模块化CommonJS AMD UMD CMD ES6规范详解

JS 模块化规范详解

JavaScript 的模块化是为了解决多个 JavaScript 文件之间变量、函数命名冲突问题以及提高文件管理便捷性,目前主要有以下几种规范:

  • CommonJS
  • AMD
  • UMD
  • CMD
  • ES6 Modules

接下来详细介绍每种规范的含义、特点及实现方式。

CommonJS

CommonJS 规范是 Node.js 平台中所采用的一种模块化规范,其对模块的定义及加载分别采用了 require 和 module.exports 两个关键字。

在 CommonJS 规范中,每个文件就是一个模块,有自己的作用域,使用 require 函数加载模块,可以使用 module.exports 暴露模块,其他模块通过 require 函数加载该模块进行使用。示例代码如下:

// moduleA.js
const moduleB = require('./moduleB')

function sayHello(name) {
  console.log(`Hello, ${name}!`)
}

module.exports = {
  sayHello,
  moduleB
}

// moduleB.js
function sayGoodbye(name) {
  console.log(`Goodbye, ${name}!`)
}

module.exports = {
  sayGoodbye
}

// main.js
const { sayHello, moduleB } = require('./moduleA')

sayHello('Alice')
moduleB.sayGoodbye('Bob')

AMD

AMD 即 Asynchronous Module Definition,也是一个模块化规范。引入时需要用到 require.js 这个工具库,主要用于浏览器中异步加载模块。

与 CommonJS 不同的是,AMD 规范中,定义模块时采用了 define 的方法,require 用来加载依赖的模块。

一般适用于浏览器端的异步加载模块场景,示例代码如下:

// module definition
define(['moduleB'], function(moduleB) {
  function sayHello(name) {
    console.log(`Hello, ${name}!`)
  }

  return {
    sayHello,
    moduleB
  }
})

// main.js
require(['moduleA'], function(moduleA) {
  moduleA.sayHello('Alice')
  moduleA.moduleB.sayGoodbye('Bob')
})

UMD

UMD 即 Universal Module Definition,是既支持 CommonJS 规范又支持 AMD 规范的一种通用模块化规范。

UMD 最常见的实现方式是将 CommonJS 和 AMD 规范的代码分别写一遍,并通过条件判断实现通用的模块定义。

示例代码如下:

(function(root, factory) {
  if (typeof define === 'function' && define.amd) {
    // AMD
    define(['moduleB'], factory)
  } else if (typeof module === 'object' && module.exports) {
    // CommonJS
    const moduleB = require('./moduleB')
    module.exports = factory(moduleB)
  } else {
    // Browser global
    root.ModuleA = factory(root.moduleB)
  }
})(this, function(moduleB) {
  function sayHello(name) {
    console.log(`Hello, ${name}!`)
  }

  return {
    sayHello,
    moduleB
  }
})

CMD

CMD 即 Common Module Definition,是另一种通用模块定义规范,接口类似 AMD。

CMD 的主要特点是依赖就近,需要使用时再引入,并允许进行动态引入。示例代码如下:

// module definition
define(function(require, exports, module) {
  const moduleB = require('./moduleB')

  function sayHello(name) {
    console.log(`Hello, ${name}!`)
  }

  exports.sayHello = sayHello
  exports.moduleB = moduleB
})

// main.js
const moduleA = require('./moduleA')
moduleA.sayHello('Alice')
moduleA.moduleB.sayGoodbye('Bob')

ES6 Modules

ES6 Modules 是自 ES6 开始加入 JS 标准中的原生模块化规范。

ES6 Modules 在编译时进行静态分析,可以在代码编写时进行智能提示,且可以进行 Tree Shaking 等优化。

因为 ES6 Modules 是原生支持的,所以不再需要使用库或者在不同环境中使用不同的语句,可以说是未来的主旋律。

示例代码如下:

// moduleA.js
import { sayGoodbye } from './moduleB.js'
export function sayHello(name) {
  console.log(`Hello, ${name}!`)
}

// moduleB.js
export function sayGoodbye(name) {
  console.log(`Goodbye, ${name}!`)
}

// main.js
import { sayHello } from './moduleA.js'
import { sayGoodbye } from './moduleB.js'
sayHello('Alice')
sayGoodbye('Bob')

以上便是 JS 模块化规范的详细介绍及示例,希望对你的学习有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js 模块化CommonJS AMD UMD CMD ES6规范详解 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 教你用几十行js实现很炫的canvas交互特效

    关于“教你用几十行js实现很炫的canvas交互特效”的完整攻略,我将从以下几个方面进行详细讲解: 准备工作 在实现交互特效之前,我们需要准备一些必要的工作:首先是引入Canvas标签;其次是编写Canvas绘制所需的HTML、CSS及JavaScript代码;最后还需要确定绘制的内容和样式。 创建画布并绘制基础图形 在Canvas中创建画布并绘制基础图形是…

    JavaScript 2023年6月10日
    00
  • JS内置对象和Math对象知识点详解

    JS内置对象和Math对象知识点详解 1. JS内置对象 JavaScript内置对象是指ecmaScript规范定义的对象,这些对象全局可用。JS内置对象不需要额外定义就可以直接使用,并且拥有丰富的API。 1.1. 常见的JS内置对象 以下是一些常见的JS内置对象: String 对象用于处理文本字符串 Number 对象用于处理数字 Object 对象…

    JavaScript 2023年5月28日
    00
  • 详谈表单格式化插件jquery.serializeJSON

    下面是关于详谈表单格式化插件jquery.serializeJSON的完整攻略。 什么是jquery.serializeJSON插件? jquery.serializeJSON插件是一个可以将表单数据转换为JSON格式的jQuery插件。在提交表单时,我们经常需要将表单数据打包成JSON格式进行传输。因此,这个插件可以帮助我们快速、便捷地实现这个功能。 插件…

    JavaScript 2023年5月27日
    00
  • JAVASCRIPT实现的WEB页面跳转以及页面间传值方法

    请看以下示范: JAVASCRIPT实现的WEB页面跳转以及页面间传值 页面跳转 在 JavaScript 中,可以通过修改 window.location 对象的属性来实现页面跳转。 直接跳转 // 直接跳转到目标 URL window.location = "https://www.example.com"; 重定向跳转 // 通过重…

    JavaScript 2023年6月11日
    00
  • Javascript作用域和作用域链原理解析

    Javascript作用域和作用域链是Javascript中重要的概念,理解它们可以帮助我们更好地编写代码和处理变量与函数之间的关系。 什么是Javascript作用域 Javascript作用域是指变量和函数的可访问范围。在Javascript中,有三种作用域: 全局作用域 函数作用域 块级作用域(ES6新增) 全局作用域中定义的变量和函数可以在整个应用程…

    JavaScript 2023年6月10日
    00
  • JS前后端实现身份证号验证代码解析

    下面是“JS前后端实现身份证号验证代码解析”的完整攻略。 前言 身份证号是人们最常用的个人身份证明,因此在各个业务场景中,我们经常需要对输入的身份证号进行格式验证。本文将介绍如何使用 JavaScript 在前后端实现身份证号验证,帮助开发者更好地应对业务需求。 方案概述 实现身份证号验证的主要过程如下: 在前端通过 JavaScript 判断用户输入的身份…

    JavaScript 2023年6月10日
    00
  • asp+jsp+JavaScript动态实现添加数据行

    为了实现添加数据行,我们需要使用以下技术: ASP:一种用于创建动态Web应用程序的服务器端脚本技术; JSP:一种用于创建动态Web应用程序的服务器端脚本技术; JavaScript:一种用于在网页中添加交互和动态效果的编程语言。 下面是实现添加数据行的详细攻略: 创建一个HTML页面。在页面中,添加一个表格元素,并为其添加表头和一个空的表体: <h…

    JavaScript 2023年6月10日
    00
  • javascript函数的call、apply和bind的原理及作用详解

    让我们来详细讲解一下”JavaScript函数的call、apply和bind的原理及作用详解”。 一、基本概念 在JavaScript中,函数也是一种对象,因此我们可以像其他对象一样,给函数绑定属性或方法,并可以改变函数在执行时的作用域和this的指向。其中,call、apply和bind就是改变函数执行时上下文的方法。 1. call方法 call是一个…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部