CommonJS 和 ES6 module

这篇具有很好参考价值的文章主要介绍了CommonJS 和 ES6 module。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

CommonJS 和 ES6 module,前端,javascript,vue.js

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

写法2

CommonJS 和 ES6 module,前端,javascript,vue.js

 

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

//TODO。。。文章来源地址https://www.toymoban.com/news/detail-516921.html

到了这里,关于CommonJS 和 ES6 module的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ES6】CommonJS模块和ES6模块

    在JavaScript中,模块是一种将功能代码组织成逻辑单元的方式,以便在其他项目中重复使用。有两种主要的模块系统:CommonJS和ES6。 1、CommonJS 在CommonJS中,我们使用require来引入模块,使用module.exports来导出模块。 下面是一个简单的例子: 然后,在另一个文件中,我们可以使用

    2024年02月09日
    浏览(49)
  • es6与commonjs 的区别

    1、CommonJS输出的是一个值的拷贝,ES6输出的是值的引用; 2、CommonJS是运行时加载,ES6是编译时输出接口; 3、CommonJS的require是同步加载模块,ES6的import是异步加载,有独立模块依赖的解析阶段。 1.1CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用 commonjs的用法,

    2024年02月05日
    浏览(40)
  • es6和commonJs的区别

    一、export语句的区别: ES6 和 CommonJS 是两种不同的 JavaScript 模块化规范,它们的 export 语句有一些区别: export :在 ES6 中,使用 export 来导出模块中的变量、函数、类等;而在 CommonJS 中,使用 module.exports 来导出模块。 导出方式:ES6 的 export 语句可以直接导出变

    2023年04月16日
    浏览(34)
  • Vue报错 Cannot find module ‘../../modules/es6.symbol‘解决办法

    在进行webpack打包的时候,会出现Cannot find module \\\'XXX’的错误,找不到某个模块的错误,今天给出解决方法: 直接进行npm install重新打包; 如果npm install重新打包之后,仍然出现这个问题,可以进行删除node_modules文件夹,同时清除缓存,如下命令: 如果以上方法依然不奏效,那

    2024年01月18日
    浏览(65)
  • Commonjs 和 Es Module详解

    今天我们来深度分析一下 Commonjs 和 Es Module ,希望通过本文的学习,能够让大家彻底明白 Commonjs 和 Es Module 原理,能够一次性搞定面试中遇到的大部分有关 Commonjs 和 Es Module 的问题。 带上疑问开始今天的分析: 1 Commonjs 和 Es Module 有什么区别 ? 2 Commonjs 如何解决的循环引用问

    2024年02月22日
    浏览(38)
  • 了解一下ES module 和 Commonjs

    最近测试了几个 ES module 和 Commonjs 的例子,理解了之前不太理解的概念,记录一下。要是想多了解的可以去看看阮老师的 Module 那部分。会贴一小部分的代码,不会贴所有验证的代码。 Commonjs require 大概流程 本质上 Commonjs 一直是 node 在使用的规范,虽然其他平台也可以使用。

    2024年02月12日
    浏览(31)
  • 深入理解CommonJS和ES Module? 优缺点?什么时候用?

    在webpack中,我们可以使用多种模块化方式,如CommonJS和ES Module。 CommonJS是什么? CommonJS是一种模块化规范,它是Node.js采用的模块化规范,它的主要特点是同步加载模块,模块输出的是一个值的拷贝,而不是引用。CommonJS的优点是简单易用,可以在服务器端和客户端使用,缺点

    2024年02月03日
    浏览(42)
  • 后端程序员的前端必备【Vue】 - 07 ES6新语法

    使用let定义变量能更加精准的确定变量的作用域 使用const定义常量,常量一旦定义不可以改变 使用模板字符串可以避免大量的字符串拼接 类似于springmvc中接受参数拥有默认值 使用箭头函数可以简化复杂的代码结构(类似于java中lambda表达式) 箭头函数应用 定义:从一个大的数

    2024年02月04日
    浏览(49)
  • Vue2和vue3中双向数据绑定的原理,ES6的Proxy对象代理和JavaScript的Object.defineProperty,使用详细

    简介: Object.defineProperty大家都知道,是vue2中双向数据绑定的原理,它 是 JavaScript 中一个强大且常用的方法,用于定义对象属性,允许我们精确地控制属性的行为,包括读取、写入和删除等操作; 而Proxy是vue3中双向数据绑定的原理,是ES6中一种用于创建代理对象的特殊对象,

    2024年02月15日
    浏览(47)
  • ES6学习-module语法

    CommonJS模块 ES6模块 这种加载称为“编译时加载”或者静态加载 静态加载带来的各种好处 效率要比 CommonJS 模块的加载方式高。 能进一步拓宽 JavaScript 的语法,比如引入宏(macro)和类型检验(type system)这些只能靠静态分析实现的功能。 不再需要 UMD 模块格式了,将来服务器

    2024年02月13日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包