CommonJS 和 ES6 module

news2024/11/25 2:25:56

本文主要自己觉得要记录的点记录下来,不耽误大家时间,会持续更新。

Module对象

Module {
  id: 'xxx/demo/1.js', //加载文件的绝对路径
  path: 'xxx/demo',// 加载文件所在目录的绝对路径
  exports: [Function (anonymous)],
  filename: 'xxx/demo/1.js',加载文件的绝对路径
  loaded: false,// 是否加载完成
  children: [],// 子模块
  paths: [
    '/xxx/xxx/xxx/xxx/xxx/src/pages/demo/node_modules',
    '/xxx/xxx/xxx/xxx/node_modules',
    '/xxx/xxx/xxx/node_modules',
    '/xxx/xxx/node_modules',
    '/xxx/node_modules',
    '/node_modules'
  ]
}

CommonJS加载一次之后会缓存文件

加载过程

(function(exports, require, module, __dirname, __filename){
	var load = function (exports, module) {
		const aa = require('./demo);
		const result = aa;
		module.exports.result = result;
	    return module.exports;
	};
	var exported = load(module.exports, module);
	save(module, exported);
})

CommonJS返回的是对象引用之后,在A地方修改后,会影响到B地址的加载结果。

CommonJS 模块同步加载并执行模块文件,ES6 模块提前加载并执行模块文件,ES6 模块在预处理阶段分析模块依赖,在执行阶段执行模块,两个阶段都采用深度优先遍历,执行顺序是子 -> 父。

CommonJS 父->子->父 (父加载 遇到引用了子,加载子,子加载完跳回父继续加载)

ES6 module 子->父 (父里面引用子,加载子,子里面引用子,加载子...加载完再一步一步返回上一级加载)

2 与 exports 相比,module.exports 有什么缺陷 ?

答:module.exports 当导出一些函数等非对象属性的时候,也有一些风险,就比如循环引用的情况下。对象会保留相同的内存地址,就算一些属性是后绑定的,也能间接通过异步形式访问到。但是如果 module.exports 为一个非对象其他属性类型,在循环引用的时候,就容易造成属性丢失的情况发生了。

这句话一直不理解直到看了下面这个例子:

a.js

const getMes = require('./b.js');
console.log('我是a文件');
// /**
//  * @description: 写法一
//  */
// exports.say = function () {
//   const message = getMes();
//   console.log(message);
// };
/**
 * @description: 写法二
 */
const say = function () {
  const message = getMes();
  console.log(message);
};
module.exports = say;

b.js

const say = require('./a');

const obj = {
  age: 10,
};

console.log('我是b文件', say);
setTimeout(() => {
  console.log('setTimeout...', say);
}, 10);
module.exports = function () {
  return obj;
};

main.js

require('./a.js');
require('./b.js');

写法1

b中第一次倒入的a模块对象say是一个空对象,然后a加载完毕exports(也就是b里面那个空对象的引用)赋值了一个属性say。所以setTimeout可以拿到属性say

写法2

 

b中第一次倒入的a模块对象say是一个空对象,然后a加载完毕module.exports重新赋值了一个新的对象,那之前的对象(也就是b中导入的那个对象)就应用是一个空对象。那么setTimeout里面自然也是一个空对象。如果在setTimeout重新导入a模块就能拿到改变之后的a模块。

//TODO。。。

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

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

相关文章

B/S和C/S详解(嵌入式学习)

B/S和C/S详解 1. C/S1.1 概念1.2 C/S架构的特点 2. B/S2.1 概念2.2 B/S架构的特点2.3 相对于传统的C/S架构的优势 3. B/S架构详解4. B/S架构怎么用(CGI、Lighttpd) 1. C/S 1.1 概念 C/S(Client/Server)是一种计算机网络架构模式…

【C++】 Qt-页面布局

文章目录 布局组件和布局按钮练习-用户信息页面布局准备工作设置性别设置年龄设置生日设置邮箱后缀 设置头像创建文件写入文件清空表单信息Buddy(伙伴)关系Tab顺序 布局组件和布局按钮 Qt的UI设计器中提供了丰富的布局管理功能,组件面板里有…

高效简单解决滑动验证码

前言 做爬虫总会遇到各种各样的反爬限制,其中移动验证码是很重要且常见的一环,今天总结下如何高效破解他的方法,例如下图: 解决思路与方法 首先先来分析下,核心问题其实是要怎么样找到目标缺口的位置,一…

Windows服务启动exe无界面终极解决方案

1、前言 我这个方案(C#操作)是彻底解决【从Windows服务启动程序exe,程序无界面】问题的终极解决方案,终极方案,绝对的终极方案,本来打算收钱的,还是算了,你们也不容易,关…

网络安全(自学笔记)

如果你真的想通过自学的方式入门web安全的话,那建议你看看下面这个学习路线图,具体到每个知识点学多久,怎么学,自学时间共计半年左右,亲测有效(文末有惊喜): 1、Web安全相关概念&am…

Redis 性能管理/优化 缓存雪崩/击穿/穿透

---------------------- Redis 性能管理 ---------------------------------------- ----- 查看Redis内存使用 ----- info memoryredis-cli -a abc123 info memory ----- 内存碎片率 ----- used_memory_rss:是Redis向操作系统申请的内存。used_memory:是…

缺失concrt140.dll下载,找不到concrt140.dll的解决方法

我们平时在打开 Adobe 应用程序、Halo、Forza Horizon 5 等时,可能会遇到找不到 concrt140.dll。因此,这不是特定于某个应用程序的问题。如果没有安装正确的 DLL,应用程序将无法正常工作,因为它们的代码依赖于这些库中编写的代码。…

井盖异动监测传感器:井盖的安全守护者

随着城市化进程的不断加速,城市道路、人行道上的井盖扮演着重要的角色。然而,由于各种因素,如车辆冲击、材料老化等,井盖常常会出现异动情况,井盖异动不仅对行车和行人的安全构成威胁,还给城市基础设施的维…

C#扩展——Visual Studio 代码提示/智能提示字体大小更改方法.

声明:本文为个人笔记,用于学习研究使用非商用,内容为个人研究及综合整理所得,若有违规,请联系,违规必改。 C#扩展——Visual Studio 代码提示/智能提示字体大小更改方法. 文章目录 C#扩展——Visual Studio…

【期末总复习】医学影像学(第2版)周翔平

【选择】 1、垂体腺瘤大小范围这么界定的&#xff1f; P66&#xff0c;肿瘤直径<1cm称为垂体微腺瘤&#xff0c;>1cm称为垂体大腺瘤&#xff0c;>4cm成为巨大腺瘤。 2、当一个车祸伤病人&#xff0c;怀疑长骨骨折首选什么检查方法&#xff1f; P387 X线平片 3、…

leetcode957. N 天后的牢房(java-14天周期优化)

N 天后的牢房 leetcode957. N 天后的牢房题目描述解题思路Java 代码演示 算法专题 leetcode957. N 天后的牢房 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/prison-cells-after-n-days 题目描述 监狱中 8 间牢房排成一…

力扣 106. 从中序与后序遍历序列构造二叉树

题目来源&#xff1a;https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/description/ C题解&#xff1a;中序遍历是左中右&#xff0c;后序遍历是左右中&#xff0c;所以拿到两个遍历数组&#xff0c;我们可以从后序遍历获取中间节点…

信号链噪声分析6

目录 概要 整体架构流程 技术名词解释 技术细节 公用时钟源相位噪声的消除 公用电源噪声的消除 小结 概要 提示&#xff1a;这里可以添加技术概要 放大器输出被发送到均衡混频器&#xff08;相位检测器&#xff09;。相位检测器将两 个信号混合&#xff0c;在其输出处产生和积…

Apollo无人驾驶平台中多传感器标定

传感器标定是无人车最基础也是最核心的模块之一。作为软件层提供的第一项服务,标定质量和准确度极大地影响着感知、定位地图、PNC等模块。在 Apollo 开源自动驾驶平台中,我们提供了丰富的多传感器标定服务,如激光雷达、惯导、摄像头、多普勒雷达等多种传感器之间的标定。算法…

pytorch 中 dim 的-1,0,1,2 的意义 详解

对于3维矩阵&#xff0c;dim为-1时 与 dim为2时 的效果是一样的。dim为0时 从0维度&#xff0c; 下图 是三维实例 图的目的是 可以由一个想象的空间。 下面代码 与上图关系不大 >>> ab torch.tensor([[[0,1,2,3],[1,2,3,4]],[[2,3,4,5],[4,5,6,7]],[[5,6,7,8],…

如何解决failed to load steamui.dll这个问题?

当你在玩steam的时候&#xff0c;电脑突然弹出一个failed to load steamui.dll的时候&#xff0c;相信你内心一定是非常的烦躁的&#xff0c;毕竟你的玩游戏体验直接中断了&#xff0c;今天小编就来给大家详细的讲解一下怎么解决failed to load steamui.dll这个问题。 目录 一…

leetcode消失的数字

题目描述 数组 nums 包含从 0 到 n 的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在 O ( n ) O(n) O(n) 时间内完成吗&#xff1f; 示例 1&#xff1a; 输入&#xff1a;[3,0,1] 输出&#xff1a;2 leetcode链接&#xff1a;消失的数字 ⭕…

举例说明什么是卷积神经网络

卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是一种深度学习模型&#xff0c;主要应用于计算机视觉任务&#xff0c;如图像分类、物体检测等。它通过卷积层、池化层和全连接层等组件来实现对图像的特征提取和分类。 现在我们以一个简单的图像分类任…

【算法题】动态规划中级阶段之跳跃游戏、最大子数组和、解码方法

动态规划中级阶段 前言一、最大子数组和1.1、思路1.2、代码实现 二、跳跃游戏2.1、思路2.2、代码实现 三、解码方法3.1、思路3.2、代码实现 总结 前言 动态规划&#xff08;Dynamic Programming&#xff0c;简称 DP&#xff09;是一种解决多阶段决策过程最优化问题的方法。它是…

计算机组成原理(期末或考研备考)- 存储器(RAM和ROM重点讲解)

存储器分类 主存储器&#xff1a;也称内存&#xff0c;存放正在运行程序和数据&#xff0c;CPU可以直接访问&#xff0c;容量存储较小&#xff0c;价格较贵。辅助存储器&#xff1a;也称外存&#xff08;绝大多数是磁盘&#xff09;&#xff0c;存放电脑的应用程序等&#xff0…