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日

相关文章

  • 关于COOKIE个数与大小的问题

    关于 COOKIE 个数与大小的问题,需要注意以下几点: 1. COOKIE 个数 每个网站可以存储的 COOKIE 数量是有限制的,不同的浏览器有不同的限制。以下是一些常见浏览器的 COOKIE 个数限制: IE 6/7: 20 IE 8/9/10/11:50 Firefox:50 Chrome:180 Safari:150 如果网站设置了超过这些限制的 …

    JavaScript 2023年6月11日
    00
  • Javascript中的delete介绍

    当我们在JavaScript中创建一个对象或者函数时,它们都会被存储在内存中,而使用 delete 关键字可以删除对象的某个属性或者函数。本文将详细讲解 delete 的用法,以及可能会遇到的问题。 语法 delete object.propertyName delete object[expression] delete object.functionNa…

    JavaScript 2023年6月10日
    00
  • 收藏Javascript中常用的55个经典技巧

    收藏Javascript中常用的55个经典技巧 介绍 本文收集了Javascript中常用的55个经典技巧,每个技巧都包含简短的代码示例和详细的解释。这些技巧旨在帮助Javascript开发者提高他们的编程技能。 主要内容 以下是本文中包含的55个Javascript技巧: 数组去重 javascriptconst arr = [1, 2, 3, 3, 4,…

    JavaScript 2023年5月18日
    00
  • javascript实现图片左右滚动效果【可自动滚动,有左右按钮】

    下面是详细讲解“javascript实现图片左右滚动效果【可自动滚动,有左右按钮】”的完整攻略: 1. 确定HTML结构 首先需要确定HTML结构,一般来说,我们可以使用 ul 和 li 标签来实现一个图片轮播图。如下所示: <div class="container"> <ul class="img-list…

    JavaScript 2023年6月11日
    00
  • 微信小程序模板(template)使用详解

    微信小程序模板(template)使用详解 什么是微信小程序模板(template) 微信小程序模板是一种快速开发小程序的方式,类似于其他web开发中的样板(boilerplate)或模板(template)等概念。使用小程序模板,可以减少从零开始开发的代码量,加快小程序开发的速度。 如何使用微信小程序模板 在小程序开发工具中,选择“新建小程序”或“创建项目…

    JavaScript 2023年6月11日
    00
  • onkeypress字符按键兼容所有浏览器使用介绍

    下面是关于“onkeypress字符按键兼容所有浏览器使用介绍”的完整攻略。 什么是 onkeypress 事件 onkeypress 事件在用户按下并松开任意字符键时触发。该事件只能在可编辑区域或文本框中触发。 如何确保 onkeypress 兼容所有浏览器 不同的浏览器实现 onkeypress 事件的方式有所不同,为了确保事件的兼容性,我们可以使用如下…

    JavaScript 2023年6月11日
    00
  • JavaScript中URL编码函数代码

    下面是关于JavaScript中URL编码函数代码的详细讲解: 1. URL编码函数代码含义 URL编码是将URL中一些特殊字符转义为十六进制字符的过程。在JavaScript中可以使用encodeURI和encodeURIComponent两个函数实现URL编码。 encodeURI函数是对整个URL进行编码,除了以下字符:字母、数字、半角字符(非全角字符…

    JavaScript 2023年5月20日
    00
  • JavaScript计算器网页版实现代码分享

    JavaScript计算器是一个常见的前端项目,本攻略旨在分享JavaScript计算器的网页版实现代码,以下是详细步骤: 步骤1:创建基本的网页结构 首先,我们需要创建一个基本的HTML网页结构,添加一些基本的元素,如标题、输入框和按钮。通过以下代码实现: <!DOCTYPE html> <html> <head> &l…

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