web前端面试-- 模块化的几种规范CMD、COMMONJS、AMD、ESM以及UMD模块化解决方案,export *的写法

本文主要是介绍web前端面试-- 模块化的几种规范CMD、COMMONJS、AMD、ESM以及UMD模块化解决方案,export *的写法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • CommonJS 模块规范 (跟CMD差不多)
  • AMD 模块规范
  • ESM 模块规范
    • 1. 默认操作
      • 1.1 默认导出(Default Export)
      • 1.2 默认导入(Default Import)
    • 2. 命名操作
      • 2.1 命名导出(Named Export)
      • 2.2 命名导入(Named Import)
      • 2.3 额外写法(export *)
  • UMD 模块方案
    • 1. 模块导出
    • 2. AMD环境导入
    • 3. COMMONJS环境导入
    • 4. 其他未知环境导入

前言

JavaScript 目前有四种模块规范:CMD、COMMONJS、AMD 和 ESM。

CMD 是 JavaScript 最早的模块规范,它使用 require 函数来导入模块。CMD 模块是 JavaScript 最早的模块规范,但它存在一些缺陷,比如模块的导入顺序不受控制,模块的依赖关系无法被管理,等等。

COMMONJS 是 JavaScript 模块的另一种,它使用 require 函数来导入模块。COMMONJS 模块在解决 CMD 模块的缺陷方面做了很多工作,比如它提供了模块的导入顺序控制、模块的依赖关系管理等功能。 不适合浏览器环境,读取模块是同步操作,适合nodejs环境。

AMD 是 JavaScript 模块的另一种,它使用 requirejs 库来导入模块。AMD 模块在解决 CMD 模块和 COMMONJS 模块的缺陷方面做了很多工作,比如它提供了模块的导入顺序控制、模块的依赖关系管理、模块的缓存等功能。可以异步导入模块,适合浏览器环境。

目前,ESM 是 JavaScript 模块的最新规范,它在解决 CMD 模块、COMMONJS 模块和 AMD 模块的缺陷方面做了很多工作,比如它提供了模块的导入顺序控制、模块的依赖关系管理、模块的缓存等功能。

以下是 ESM、CMD、COMMONJS 和 AMD 模块的对比表:

模块规范导入函数导入顺序依赖关系管理缓存
ESMimport可控制可管理可缓存
CMDrequire不可控制不可管理不可缓存
COMMONJSrequire可控制可管理不可缓存
AMDrequirejs可控制可管理可缓存

除了上述提到的四种模块规范(CMD、COMMONJS、AMD 和 ESM),还有一些其他的模块化方案,尽管它们在 JavaScript 社区中的使用较少或者不被广泛认可。

一些其他的模块化方案包括:

  1. SystemJS:SystemJS 是一个通用的模块加载器,它可以在浏览器中加载不同模块规范的模块,包括 AMD、COMMONJS、ESM 等。

  2. UMD:UMD(Universal Module Definition)是一种兼容多种模块规范的通用模块化方案,它可以在不同的环境中运行,包括浏览器和 Node.js。 判断浏览器环境用AMD模块规范,是nodejs环境用COMMONJS规范。

  3. IIFE:IIFE(Immediately Invoked Function Expression)是一种将模块封装在立即执行的函数表达式中的模式,通过这种方式,模块的作用域可以被限制在函数内部,避免了全局命名冲突。

需要注意的是,尽管有多种模块化方案可供选择,但在实际开发中,ESM(ES6 模块)已成为 JavaScript 模块化的主流标准,得到了广泛的支持和推广。


CommonJS 模块规范 (跟CMD差不多)

CommonJS 模块是 JavaScript 最早的模块规范,它使用 require 函数来导入模块。CommonJS 模块的导入和导出方式如下:
主要是用于后端nodejs开发,前端类似的vue项目也可以引入本地文件...

// 导入模块
const module = require('./module');// 导出模块方式1
module.exports = {value: 123,fn:()=>{console.log('fn...');}
};// 导出模块方式2
exports.value = 123;
exports.fn = function(){console.log('fn...');}

总结:exports是一个对象处理了。

AMD 模块规范

AMD 模块是 AMD 规范定义的模块,它使用 requirejs 库来导入模块。AMD 模块的导入和导出方式如下:

// 导入模块
requirejs(['./module'], function(module) {console.log(module.value);
});// 导出模块
define(['./module'], function(module) {return {value: 123};
});

ESM 模块规范

在 ECMAScript 模块中,有多种导出和引入的写法,下面是一些常见的写法:

1. 默认操作

1.1 默认导出(Default Export)

  • 导出单个默认值:
export default value;
  • 导出多个默认值(使用对象字面量):
export default {key1: value1,key2: value2
};

1.2 默认导入(Default Import)

  • 导入默认导出的模块:
import moduleName from './module';

2. 命名操作

2.1 命名导出(Named Export)

  • 导出单个变量、函数或常量:
export const variableName = value;
export function functionName() { ... }
export class ClassName { ... }
  • 导出多个变量、函数或常量(使用对象字面量):
export {variable1,variable2,functionName,ClassName
};

2.2 命名导入(Named Import)

  • 导入指定的变量、函数或常量:
import { variableName, functionName, ClassName } from './module';
  • 导入所有命名导出的模块(使用对象字面量):
import * as module from './module';

以上是一些常见的导出和引入写法,你可以根据需要选择适合的方式。

2.3 额外写法(export *)

一般模块的引用都是如上,不是导出自身模块的变量、函数或常量,就是引入别的模块的变量、函数或常量。
但是也有特殊的,比如导出别的模块

下方给出了vue源码中util 导出的写法。

// node_modules\vue\src\core\util\index.ts
export * from 'shared/util'
export * from './lang'
export * from './env'
export * from './options'
export * from './debug'
export * from './props'
export * from './error'
export * from './next-tick'
export { defineReactive } from '../observer/index'

UMD 模块方案

并不是模块规范,而是一个解决方案~

1. 模块导出

(function (root, factory) {  if (typeof define === 'function' && define.amd) {  // AMD  define(['dependency'], factory);  } else if (typeof exports === 'object') {  // Node, CommonJS-like  module.exports = factory(require('dependency'));  } else {  // Browser globals (root is window)  root.returnExports = factory(root.dependency);  }  
}(this, function (dependency) {  // The actual module  function MyModule() {  //...  }  return MyModule;  
}));

2. AMD环境导入

require(['myModule'], function(myModule) {  // 使用myModule  
});

3. COMMONJS环境导入

var myModule = require('myModule'); 

4. 其他未知环境导入

放在全局上,比如浏览器window对象上

window.myModule = {  // 模块内容  
};

这篇关于web前端面试-- 模块化的几种规范CMD、COMMONJS、AMD、ESM以及UMD模块化解决方案,export *的写法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/504084

相关文章

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter

Vue3视频播放组件 vue3-video-play使用方式

《Vue3视频播放组件vue3-video-play使用方式》vue3-video-play是Vue3的视频播放组件,基于原生video标签开发,支持MP4和HLS流,提供全局/局部引入方式,可监听... 目录一、安装二、全局引入三、局部引入四、基本使用五、事件监听六、播放 HLS 流七、更多功能总结在 v

java中判断json key是否存在的几种方法

《java中判断jsonkey是否存在的几种方法》在使用Java处理JSON数据时,如何判断某一个key是否存在?本文就来介绍三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目http://www.chinasem.cn录第一种方法是使用 jsONObject 的 has 方法

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

vue监听属性watch的用法及使用场景详解

《vue监听属性watch的用法及使用场景详解》watch是vue中常用的监听器,它主要用于侦听数据的变化,在数据发生变化的时候执行一些操作,:本文主要介绍vue监听属性watch的用法及使用场景... 目录1. 监听属性 watch2. 常规用法3. 监听对象和route变化4. 使用场景附Watch 的

前端导出Excel文件出现乱码或文件损坏问题的解决办法

《前端导出Excel文件出现乱码或文件损坏问题的解决办法》在现代网页应用程序中,前端有时需要与后端进行数据交互,包括下载文件,:本文主要介绍前端导出Excel文件出现乱码或文件损坏问题的解决办法,... 目录1. 检查后端返回的数据格式2. 前端正确处理二进制数据方案 1:直接下载(推荐)方案 2:手动构造