首页 > 编程语言 >JavaScript之模块模式

JavaScript之模块模式

时间:2024-09-10 11:50:26浏览次数:15  
标签:CommonJS require JavaScript 模式 js 模块 math 加载

一 模块模式

JavaScript 模块模式有传统的立即调用函数表达式 (IIFE)CommonJSAMDES6 模块

立即调用函数表达式(IIFE)

立即调用函数表达式(IIFE)是一种设计模式,通过创建一个立即执行的函数来封装代码,避免全局命名空间污染。IIFE 结构如下:

(function() {
  // 你的代码
})();

它会立即执行,并且所有定义在这个函数内部的变量和函数都是私有的,不会泄露到全局作用域中。

CommonJS

CommonJS 是一种模块规范,主要用于服务器端 JavaScript 环境(如 Node.js)。它定义了如何导出和导入模块,使得 JavaScript 代码可以被组织成模块化的结构。CommonJS 的核心概念是 require 和 module.exports。
导出模块:
使用 module.exports 或 exports 对象来导出模块的内容,使其可以在其他模块中被导入。

// myModule.js
const myFunction = () => {
  console.log('Hello from myFunction');
};

module.exports = myFunction;

导入模块
使用 require 函数来引入其他模块。require 会同步地加载模块,并返回模块的导出对象。

// app.js
const myFunction = require('./myModule');
myFunction(); // 输出: Hello from myFunction

工作机制:

  1. 模块加载:CommonJS 模块是同步加载的。这意味着当你调用 require 时,Node.js 会阻塞代码的执行,直到模块被完全加载并执行完成。
    缓存机制:

  2. 加载的模块会被缓存。如果你多次 require 同一个模块,Node.js 会直接从缓存中返回模块,而不是重新加载和执行。这提高了效率并避免了重复加载。
    模块作用域:

  3. 每个模块都有自己的作用域。模块内部定义的变量和函数不会污染全局命名空间,只会对模块内部可见。

ES6

ES6 模块(ECMAScript 2015 模块)引入了原生模块化支持,允许使用 import 和 export 语法来组织代码。通过 export 关键字,可以导出函数、对象或变量,而使用 import 关键字,可以在其他模块中导入这些导出的元素
导出模块

// math.js
export function add(x, y) {
  return x + y;
}
export function subtract(x, y) {
  return x - y;
}

导入模块

// main.js
import { add, subtract } from './math.js';

console.log(add(5, 3));      // 8
console.log(subtract(5, 3)); // 2

CommonJS 与 ES6 模块的区别:

  1. 加载方式:CommonJS 使用同步加载(适用于服务器端),而 ES6 模块采用异步加载(适用于浏览器环境)。
  2. 导出与导入: CommonJS 使用 module.exports 和 require,而 ES6 模块使用 export 和 import。
  3. 静态 vs 动态:ES6 模块是静态的,可以在编译时确定依赖关系,支持更多的静态分析。CommonJS 模块是动态的,依赖关系在运行时确定。
  4. 模块解析:ES6 模块支持导入和导出重命名、批量导出等更丰富的语法,而 CommonJS 仅支持单一的 module.exports 和 exports 对象。

AMD(ES6已经它替代成为主流)

用于在浏览器端异步加载模块。它最初由 RequireJS 提出的,目的是解决早期 JavaScript 模块化方案中的一些问题,比如依赖管理和异步加载。
定义模块:
使用 define 函数定义一个模块,可以指定该模块的依赖项和模块本身的工厂函数

// math.js
define(['jquery'], function($) {
  return {
    add: function(a, b) {
      return a + b;
    },
    subtract: function(a, b) {
      return a - b;
    }
  };
});

加载模块:
使用 require 函数来加载模块及其依赖项。require 函数异步加载模块,并在模块加载完成后执行回调函数。

// app.js
require(['math'], function(math) {
  console.log(math.add(5, 3));      // 8
  console.log(math.subtract(5, 3)); // 2
});

配置
AMD 模块加载器如 RequireJS 允许进行配置,以控制模块的路径、依赖关系等。例如,可以使用 require.config 来设置模块的路径映射:

// main.js
require.config({
  paths: {
    'math': 'path/to/math',
    'jquery': 'path/to/jquery'
  }
});

// 加载模块
require(['math'], function(math) {
  console.log(math.add(5, 3));
});

缺点:

  • 复杂性:需要引入额外的库(如 RequireJS)来管理模块,这可能增加项目的复杂性。
  • 配置:可能需要进行额外的配置,尤其是在处理路径和依赖时。

标签:CommonJS,require,JavaScript,模式,js,模块,math,加载
From: https://blog.csdn.net/m0_73890048/article/details/142094520

相关文章

  • java常见的设计模式
    java常见的设计模式1.什么是设计模式?设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码......
  • 如何集成Android平台GB28181设备接入模块?
    技术优势大牛直播SDK的Android平台GB28181设备接入模块在适用场景、音视频能力、定位与通信、数据管理、安全性与稳定性、配置与扩展性以及集成与维护等方面均表现出显著的优势。这些优势使得该模块在视频监控、巡检抢修、远程指挥等多个领域具有广泛的应用前景和重要的应用价值。......
  • GB28181规范中broadcast和talk模式实际场景时间差别在哪里?
    好多开发者对GB28181规范里面,broadcast和talk模式区分不清,今天借此机会,针对GB28181标准中的Broadcast(广播)和Talk(对讲)是两种不同的通信模式,它们在视频监控系统中扮演着不同的角色,做个基础的扫盲,二者具有以下区别:1.功能和用途Broadcast(广播): 功能:主要用于平台侧向设备侧发送单向的通......
  • 几种并发模式的实现
    常见的几个需要并发的场景,具体的实现方式asyncio异步并发importasyncioasyncdeftask(id,delay):awaitasyncio.sleep(delay)returnf"Task{id}completed"asyncdefmain():tasks=[task(1,2),task(2,1),task(3,3)]done,pending=await......
  • STM32八种工作模式
    一:模式介绍1.1四种输入模式:1.2四种输出模式:二:模式框图三:模式解析3.1模拟输入模拟输入,即关闭施密特触发器,将电压信号传送到片上外设模块(不接上、下拉电阻)。通常是用于ADC采集电压输入通道,进行AD转换。3.2浮空输入浮空输入。浮空输入状态下,IO的电平状态是不确定的,完......
  • javascript-day02
    02-BOM-01-window的对话框<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Docu......
  • FreeBSD兼容模式linux账户指向FreeBSD账户造成的困扰
    发现FreeBSD兼容模式linux账户指向FreeBSD账户,这导致账户出现了紊乱。比如FreeBSD下账户guest的id是1001,linux兼容模式下的guest账户id是1004#FreeBSD下目录归属drwxr-xr-x71skywalkskywalk1089月613:59skywalk#Linux下mud归属drwxr-xr-x71linuxskywalk......
  • 树莓派通过串口驱动HC-08蓝牙模块
    树莓派通过串口驱动HC-08蓝牙模块文章目录树莓派通过串口驱动HC-08蓝牙模块一、HC-08蓝牙模块介绍二、树莓派与蓝牙模块硬件连接三、树莓派通过蓝牙控制设备一、HC-08蓝牙模块介绍蓝牙模块,是一种集成的蓝牙功能的PCB板,用于短距离无线通信,按照功能分为蓝牙数据模块......
  • ansible模块编写
    目录1.程序为什么能识别模块a.模块是独立的脚本b.模块的路径与目录结构2.模块的工作特性a.ansible模块执行任务,会ssh到远程主机b.ansible.module_utils.basicc.核心模块(CoreModules)与插件(Plugins)的区别3.构建简单模块a.模块功能b.模块文档c.验证模块功能1.程序为什......
  • JavaScript知识点轻量版(一)
                                   【学习重点】1.了解JavaScript基础知识2.熟悉常量和变量3.能够使用表达式和运算符4.正确使用语句5.能够掌握数据类型和转换的基本方法6.正确使用函数,对象,数组等核心知识......