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

yizhihongxing

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日

相关文章

  • JavaScript中的Math.sin()方法使用详解

    当我们使用JavaScript编写数学计算程序时,可能需要计算三角函数值。Math.sin()方法正是用于计算正弦值的方法之一。以下是详细的使用说明。 Math.sin()方法简介 Math.sin(x)方法返回一个数值x弧度的正弦值。弧度是角度的单位,数学公式中表示为radian。通常的计算机以角度为单位,因此需要将角度转化为弧度后再进行计算。 Math.…

    JavaScript 2023年5月27日
    00
  • JS小数转换为整数的方法分析

    下面是详细讲解“JS小数转换为整数的方法分析”的攻略: 问题背景 在JavaScript中,我们有时需要将小数转换成整数。例如,将0.3转换成3,或者将0.6转换成6。本文将介绍几种方法来实现这种转换。 方法一:乘法转换 此方法很简单,只需将小数乘以10的n次幂,其中n是小数点右侧的位数。然后将乘积四舍五入取整。这样就可以得到整数值。 function to…

    JavaScript 2023年5月28日
    00
  • asp.net+js实现批量编码与解码的方法

    以下是“asp.net+js实现批量编码与解码的方法”的完整攻略。 一、背景 在一些网站开发中,可能会遇到需要对一些数据进行批量编码或者批量解码的需求。例如,对于一些包含特殊字符的字符串进行URL编码,或者将经过base64编码的数据进行解码等等。本篇攻略将介绍如何通过asp.net和javascript实现这些功能。 二、URL编码与解码 URL编码 在a…

    JavaScript 2023年5月19日
    00
  • 原生js制作日历控件实例分享

    下面我会给出详细的“原生js制作日历控件实例分享”的攻略: 一、准备工作 首先,我们需要定义一些全局变量和函数: var year = new Date().getFullYear(); // 获取当前年份 var month = new Date().getMonth() + 1; // 获取当前月份 var date = new Date().getDa…

    JavaScript 2023年6月10日
    00
  • jquery.validate使用时遇到的问题

    下面是详细讲解jquery.validate使用时遇到的问题的攻略: 问题描述 在使用jquery.validate进行表单验证时,可能会遇到以下几个问题:1. 表单重复提交;2. 校验失败时无法获取错误信息;3. 重置表单时无法清除样式。 解决方案 1. 表单重复提交 为了避免用户重复提交表单,我们需要在第一次提交之后就禁用提交按钮。可以通过以下代码实现:…

    JavaScript 2023年6月10日
    00
  • ajax实现简单实时验证功能

    下面是“ajax实现简单实时验证功能”的攻略: 什么是Ajax实时验证 Ajax是一种用于创建快速动态Web网页的技术,通过在不刷新页面的情况下向服务器发送请求并获取响应数据,可以实现实时验证表单数据的功能。 通常在前端验证数据的时候,我们会通过JavaScript来实现,但是客户端验证容易被用户绕过,所以我们还需要在后端进行验证。而利用Ajax可以在前端先…

    JavaScript 2023年6月10日
    00
  • js中的string.format函数代码

    下面是详细讲解 JavaScript 中的 string.format 函数的完整攻略。 string.format 函数简介 在 JavaScript 中,我们经常需要将一些变量的值格式化成字符串,这时我们可以使用 string.format 函数来进行格式化,以达到我们想要的结果。string.format 函数可以将一个 JavaScript 字符串模…

    JavaScript 2023年5月28日
    00
  • asp.net 用XML生成放便扩展的自定义树

    下面是详细的攻略。 1. 确定需求和技术栈 首先,需要明确的是我们要使用asp.net来开发一个生成可扩展自定义树的功能。而为了使树的结构灵活,我们还要使用XML来存储树的数据。 具体所需技术栈如下: asp.net XML 2. 准备数据 由于我们要使用XML来存储树的数据,因此需要准备一个XML文件,用来存储树的数据。下面是一个示例XML文件: <…

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