Common.js 和 ES6 Module 中模块引入的区别

CommonJS和ES6 Module

CommonJS是一种模块规范,最初被应用于Nodejs,成为Nodejs的模块规范。运行在浏览器端的javaScript由于也缺少类似的规范,在ES6出来之前,前端也实现了一套相同的模块规范(例如:AMD),用来对前端模块进行管理。

自ES6起,引入了一套新的ES6 Module规范,在语言标准层面实现了模块功能,而且实现得相当简单,有望成为浏览器和服务器通用的模块解决方案。但目前浏览器对ES6 Module兼容还不够友好,我们平时在Webpack中使用export和import,会经过Babel转换为CommonJS规范。

差异

1、语法差异

CommonJS: 使用require语句引入模块,使用module.exports导出模块。

// 引入模块
const moduleA = require('./moduleA');// 导出模块
module.exports = someFunction;

ES6: 使用import语句引入模块,使用export语句导出模块。

// 引入模块
import moduleA from './moduleA';// 导出模块
export default someFunction;

2、动态导入

CommonJS: 是同步加载的,无法在运行时根据条件动态加载模块。

// CommonJS 中的同步加载
const moduleA = require('./moduleA');

ES6: 支持动态导入,可以在运行时根据条件异步加载模块。

// ES6 中的动态导入
import('./moduleA').then(moduleA => {// 处理 moduleA
});

3、静态分析

  • CommonJS: 运行时加载,无法在静态阶段进行优化。
  • ES6: 可以在静态分析阶段进行优化,提高性能。

4、运行环境

  • CommonJS: 适用于服务器端开发和Node.js环境。
  • ES6: 是ECMAScript标准的一部分,适用于现代浏览器和一些构建工具(如Webpack、Rollup等)。

5、模块的默认导出

// CommonJS 中导出默认模块
module.exports = someFunction;
// ES6 中导出默认模块
export default someFunction;

6、CommonJs 是动态语法可以写在判断里,ES6 Module 静态语法只能写在顶层

在下面的例子中,require(‘./moduleA’)的执行是在运行时发生的,取决于someCondition的值。

// CommonJS 中的动态引入
if (someCondition) {const moduleA = require('./moduleA');// 使用 moduleA
}

相反,ES6模块系统采用静态语法,模块的导入和导出关系在代码解析阶段就已经确定。这就意味着你不能在代码的其他部分(如函数、条件语句内)中使用import语句。import语句必须位于模块的顶层。例如:

// ES6 中的导入,只能写在模块的顶层
import moduleA from './moduleA';// 这是不允许的,会导致语法错误
// if (someCondition) {
//   import moduleA from './moduleA';
// }

7、CommonJs 的 this 是当前模块,ES6 Module的 this 是 undefined

在CommonJS和ES6模块系统中,this的指向确实有一些差异,这涉及到模块中代码执行上下文的不同。

在CommonJS模块中,this指向当前模块的导出对象。也就是说,this在CommonJS模块中是指向模块本身的。

// CommonJS 模块
console.log(this === module.exports); // true
this.someValue = 42;
console.log(module.exports.someValue); // 42

在ES6模块中,this的值是undefined。这是因为ES6模块是在严格模式下执行的,而在严格模式下,全局对象的this值是undefined。、

// ES6 模块
console.log(this === undefined); // true
// 下面的代码会导致错误,因为不能在严格模式下给 undefined 赋值
// this.someValue = 42;

8、CommonJs 是单个值导出,ES6 Module可以导出多个

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/197911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac磁盘管理工具 DiskCatalogMaker中文 for Mac

磁盘管理工具功能介绍 制作光盘 将您的磁盘图标拖放到目录窗口。 通过Roxio Toast Titanium自动添加刻录光盘。更多 对多张光盘使用批量扫描模式。 您也可以使用生成缩略图图像选项。 并请将其快速编目引擎与其他编目人员比较! 下载:DiskCatalogM…

【华为OD题库-064】最小传输时延I-java

题目 某通信网络中有N个网络结点,用1到N进行标识。网络通过一个有向无环图.表示,其中图的边的值表示结点之间的消息传递时延。 现给定相连节点之间的时延列表times[]{u,v, w),其中u表示源结点,v表示目的结点&#xff0…

CSS-2

结构伪类选择器 作用:根据元素的结构关系查找元素 本例中以 p 标签 查找第一个 p 标签元素 p:first-child{background-color:red; }查找最后一个 p 标签元素 p:last-child{background-color:green; }查找第 666 个 p 标签元素 p:nth-child(666){background-co…

【Linux20.04-qt5.12.4软件安装与初步使用-qt在Linux使用-记录-笔记】

【Linux-qt软件安装与初步使用-qt在Linux使用-记录-笔记】 1、概述2、环境说明3、步骤总结1、了解并选择自己想要安装的版本2、访问 Qt 官方网站3、在 Qt 网站上找到下载部分(自己想下载)4、下载完成后,给安装程序文件赋予执行权限。5、自动配…

PTA 7-238 整数转换为字符串

将一个整数n转换成字符串。例如;输入483,应得到字符串"483"。其中,要求用一个递归函数实现把一个正整数转换为字符串。 输入格式: 首先输入测试组数T,然后输入T组测试数据。每组测试数据输入一个整数n(−231≤n≤231−…

关于svn如何上传一个完整的项目

注意:请一定要按照该步骤进行操作,请上传新项目时将项目名称进行规范命名 例如原始文件是arrange_v2 将此项目需要注入新的医院 则命名为 arrange_某医院名称_门诊或者医技或者药房_v2 重新命名文件夹名称快捷键 (F12) 一 &…

详解卷积神经网络(Convolutional Neural Networks, CNNs)

全连接神经网络基础 全连接神经网络(Fully Connected Neural Network 或 Multi-Layer Perceptron, MLP)是最简单的深度学习模型之一。一个典型的全连接网络由多个层组成,每一层包含多个神经元或节点。每个神经元与上一层的所有神经元相连&am…

论文阅读[2022sigcomm]GSO-Simulcast Global Stream Orchestration in Simulcast Video

GSO-Simulcast Global Stream Orchestration in Simulcast Video 作者: 1 背景 1视频会议成为全球数十亿人远程协作、学习和个人互动的核心,这些不断增长的虚拟连接需求推动视频会议服务的蓬勃发展 2当前用户越来越希望在低延迟下看到更高质量的视频…

Milvus 再上新!支持 Upsert、Kafka Connector、集成 Airbyte,助力高效数据流处理

Milvus 已支持 Upsert、 Kafka Connector、Airbyte! 在上周的文章中《登陆 Azure、发布新版本……Zilliz 昨夜今晨发生了什么?》,我们已经透露过 Milvus(Zilliz Cloud)为提高数据流处理效率, 先后支持了 Up…

C语言碎片知识

sizeof 1.sizeof是C语言中的一个操作符,同时也是关键字!!!! 2.sizeof的操作数可以是类型,变量或表达式 如图,第一个为什么是6?,因为先计算了3的大小,占4个字…

GAN:SNGAN-谱归一化GANs

论文:https://arxiv.org/pdf/1802.05957.pdf 代码:GitHub - pfnet-research/sngan_projection: GANs with spectral normalization and projection discriminator 发表:2018 ICLR 摘要 GANs的主要挑战是:训练的稳定性。本文作…

java 之 继承与多态的详细介绍

文章目录 类的继承1. 基本语法2. 继承的特点3. 方法的重写(方法的覆盖)super 关键字1. 调用父类的构造器2. 访问父类的成员变量3. 调用父类的方法4. 在构造器中调用父类方法封装性以及访问修饰符抽象方法1. 声明抽象类2. 抽象方法3. 继承抽象类4. 抽象类…

[传智杯 #4 初赛] 时效「月岩笠的诅咒」

题目背景 蓬莱之药,被诅咒的不死之药。 奉命将蓬莱之药投入富士山中销毁的月岩笠,最终打算把蓬莱之药改投入八岳销毁。在下山途中妹红将其踹下山,抢到了蓬莱之药。 那已经是千年前的事情了。 题目描述 时间节点上发生过的两件事情的时间…

智能指针及强相关知识经验总结 --- 移动语义、引用计数、循环引用、move()、自定义删除器等

目录 前言 一、shared_ptr 1. 基本用法和构造方法 2. 引用计数机制 3. weak_ptr 解决循环引用 二、unique_ptr 1. 基本用法和构造方法 2. 独占性 3. 所有权转移 1)unique_ptr :: release() 2)移动语义 和 move() 三、 对比 shared_ptr 和 un…

springboot项目无法写文件解决

报错信息 2023-12-04 15:19:30.382 INFO 3438235 --- [nio-9012-exec-1] c.i.cms.ueditor.upload.StorageManager : 保存文件:tmp:/tmp/30057024569865885 path:/home/wwwroot/cms/uploads/20231204/1701674370376033698.jpg java.nio.file.AccessDeniedException:…

Linux中项目部署步骤

安装jdk,tomcat 安装步骤 1,将压缩包,拷贝到虚拟机中。 通过工具,将文件直接拖到虚拟机的/home下 2,回到虚拟机中,查看/home下,有两个压缩文件 3,给压缩文件做解压缩操作 tar -z…

谷歌的最新人工智能实验,让你能够创造出受各种乐器启发的音乐

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

karate - 简易说明

Karate 导包 <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId…

Hive数据倾斜之:数据类型不一致导致的笛卡尔积

Hive数据倾斜之&#xff1a;数据类型不一致导致的笛卡尔积 目录 Hive数据倾斜之&#xff1a;数据类型不一致导致的笛卡尔积一、问题描述二、原因分析三、精度损失四、问题解决 一、问题描述 如果两张表的jion&#xff0c;关联键分布较均匀&#xff0c;没有明显的热点问题&…

掌握 Go 语言中的循环结构:从基础到高级

一、if else(分支结构) 1、if 条件判断基本写法 package main import ("fmt" ) func main() {score : 65if score > 90 {fmt.Println("A")} else if score > 75 {fmt.Println("B")} else {fmt.Println("C")} } 2、if 条件判断…