面试之《commonjs,requirejs和es6 Module的区别》

embedded/2025/3/13 13:12:27/

设计理念

  • CommonJS:是为服务器端环境设计的模块化规范,以同步加载模块为核心思想。服务器端读取文件速度快,同步加载不会造成明显性能问题,方便开发者在代码执行前就确定模块间的依赖关系,便于管理和维护。
  • RequireJS(AMD):为浏览器环境量身打造,遵循异步模块定义(AMD)规范。考虑到浏览器中网络请求的异步性,采用异步加载模块的方式,避免同步加载导致的页面阻塞,提升页面响应性能。
  • ES6 Module:是 JavaScript 官方推出的标准化模块系统,旨在统一服务器端和浏览器端的模块化开发。它既考虑了代码的静态分析,又支持动态导入,为 JavaScript 提供了更规范、更强大的模块化方案。

语法格式

  • CommonJS:使用 require() 函数引入模块,module.exportsexports 导出模块。
// 导出模块,math.js
const add = (a, b) => a + b;
module.exports = {add
};// 引入模块,main.js
const math = require('./math');
console.log(math.add(1, 2)); 
  • RequireJS(AMD):用 define() 函数定义模块,require() 函数加载模块。
// 定义模块,math.js
define([], function () {const add = (a, b) => a + b;return {add};
});// 加载模块,main.js
require(['math'], function (math) {console.log(math.add(1, 2)); 
});
  • ES6 Module:使用 import 关键字引入模块,export 关键字导出模块,有默认导出和命名导出两种方式。
// 导出模块,math.js
export const add = (a, b) => a + b;
export default {add
};// 引入模块,main.js
import { add } from './math.js';
import math from './math.js';
console.log(add(1, 2)); 
console.log(math.add(1, 2)); 

加载方式

  • CommonJS:同步加载模块。执行 require() 函数时,会立即加载并执行被引入的模块,后续代码在模块加载完成前会被阻塞。
// 同步加载模块
const fs = require('fs'); 
const data = fs.readFileSync('file.txt', 'utf8');
  • RequireJS(AMD):异步加载模块。require() 函数发起异步请求加载模块,不阻塞后续代码执行,模块加载完成后执行回调函数并传入模块。
// 异步加载模块
require(['jquery'], function ($) {$('body').css('background-color', 'red');
});
  • ES6 Module:静态加载模块(在编译阶段就确定模块依赖关系),默认是异步加载资源。在浏览器中,模块通过 <script type="module"> 标签引入,会在后台异步加载;在 Node.js 中,使用 .mjs 文件扩展名或在 package.json 中设置 "type": "module" 来启用。同时,ES6 还支持动态导入(import()),实现异步按需加载。
// 静态导入
import { add } from './math.js';
// 动态导入
import('./math.js').then((math) => {console.log(math.add(1, 2));
});

应用场景

  • CommonJS:主要用于服务器端开发,如 Node.js 应用。服务器端文件系统读取速度快,同步加载不会成为性能瓶颈,便于管理模块依赖。
  • RequireJS(AMD):适用于浏览器端复杂 Web 应用,尤其是需要加载大量 JavaScript 文件的场景。通过异步加载避免页面阻塞,提升用户体验。
  • ES6 Module:既适用于服务器端(Node.js 从版本 13.2.0 开始默认支持 ES Modules),也适用于浏览器端开发。随着现代浏览器对 ES6 支持的不断完善,越来越多的前端项目直接使用 ES6 Modules 进行模块化开发。

模块类型支持

  • CommonJS:侧重于服务器端模块类型,如文件系统操作、数据库连接等,模块可直接访问服务器端资源和环境变量。
  • RequireJS(AMD):主要关注浏览器端模块,如 DOM 操作、AJAX 请求等,方便处理浏览器环境中的异步操作和资源加载。
  • ES6 Module:具有更广泛的适用性,可用于各种类型的 JavaScript 应用,无论是服务器端还是浏览器端的模块都能很好地支持。

兼容性

  • CommonJS:在 Node.js 环境中得到了广泛支持,但在浏览器环境中需要借助打包工具(如 Webpack)才能使用。
  • RequireJS(AMD):在旧版本浏览器和需要异步加载模块的场景中仍有一定应用,但随着 ES6 Modules 的普及,其使用场景逐渐减少。
  • ES6 Module:现代浏览器和较新的 Node.js 版本都对其提供了良好的支持,但在一些旧版本浏览器中需要进行转译处理。

http://www.ppmy.cn/embedded/172251.html

相关文章

docker搭建elk

文章目录 1.拉取镜像2.ES配置3.logstash配置4.kibana配置5.创建自定义网络6.docker-compose.yml文件7.springboot对接Logstash1.创建一个springboot项目引入主要依赖2.application.yml配置3.resources目录中新增logback-spring.xml4.启动项目&#xff0c;搞点日志5.进入kibana控…

批量将 CSV 按行拆分成多个文件

CSV 格式是我们工作当中经常会接触到的一种格式&#xff0c;虽然它也可以通过 Excel 的方式打开&#xff0c;但是它跟 Excel 文档还是有很大的区别的。它的体积要比 Excel 文档要小很多&#xff0c;也非常的灵活&#xff0c;非常的实用。前面我们介绍过如何拆分 Excel 文档。那…

Ubuntu 22.04 无法进入图形界面的解决方法

Ubuntu 22.04 无法进入图形界面&#xff0c;只能进入 tty&#xff0c;可能是由于图形界面相关的配置或驱动程序出现了问题。以下是一些常见的解决方法&#xff1a; 1. 检查图形界面服务状态 首先&#xff0c;检查图形界面服务&#xff08;通常是 gdm 或 lightdm&#xff09;的…

ORACLE EBS数据库RELINK方式搭建克隆环境

ORACLE EBS系统的数据库&#xff0c;一般都安装了很多特定功能的小补丁来解决特定的BUG&#xff1b;因此对于已经安装好的系统&#xff0c;想要克隆一套测试环境、搭建一个新的备机做测试等&#xff0c;如果按照生产环境标准&#xff0c;则需要安装大量补丁&#xff0c;带来很大…

MybatisPlus中的customSqlSegment动态拼接where条件

前言 在对于一些MybatisPlus提供的Api无法实现的SQL场景&#xff0c;我们需要去到xml文件中写SQL语句&#xff0c;where条件的编写让人十分头疼&#xff0c;那么有没有一种便捷的方式通过MybatisPlus提供的Api快捷拼接where条件呢&#xff1f;有的有的&#xff0c;这就是今天要…

自动同步多服务器下SQL脚本2.0

考虑到1.0的适用场景太过苛刻&#xff0c;一次只支持读取至多一个版本的脚本变化&#xff0c;想涉及多个脚本的连续读取就有困难&#xff0c;于是有了2.0。 该版本支持读取多个版本的sql脚本&#xff0c;并且如果某一脚本出现sql问题【如重复插入相同名称的字段】&#xff0c;…

Rust 之一 基本环境搭建、各组件工具的文档、源码、配置

概述 Rust 是一种强调性能、类型安全和并发性的通用编程语言。它强制执行内存安全&#xff0c;使用其特有的所有权机制&#xff0c;而无需传统的垃圾收集器。Rust 不强制执行编程范式&#xff0c;但受到函数式编程思想的影响。 最初是由 Mozilla 员工 Graydon Hoare 在 2006 年…

大数据面试之路 (三) mysql

技术选型通常也是被问道的问题&#xff0c; 一方面考察候选人对技术掌握程度&#xff0c;另一方面考察对项目的理解&#xff0c;以及项目总结能力。介绍项目是从数据链路介绍&#xff0c;是一个很好来的方式&#xff0c;会让人觉得思路清晰&#xff0c;项目理解透彻。 将Spark …