es6 Module和commonjs的区别

简介: es6 Module和commonjs的区别

common.js


  • 导入导出是值的引用,如果导出的是一个基本数据类型值,那么导出文件改变该值,然后导入文件该变量的值也不会变。


  • 他是通过require 函数来导入的,只有在执行js代码才会知道模块的依赖关系。


  • 代码是同步执行的。


  • 模块多次引入,只会加载一次。每个module内部会存在一个loaded来确定是否被加载过


网络异常,图片无法展示
|


  • 代码循环引入的时候,深度优先来加载模块。然后再广度优先。


下面一个例子执行顺序:main,aaa,ccc,ddd,eee,bbb(这个bbb加载是通过main模块加载的。)


网络异常,图片无法展示
|


下面这个例子主要是为了说明common.js导出的基本数据类型,导入导出文件修改,都不会相互影响。但是对于引用数据类型就会相互影响。


// foo.js
    let age = 'ppp';
    const obj = {
      name: 'llm'
    }
    setTimeout(() => {
      age = 10000;
    }, 1000)
    setTimeout(() => {
      console.log("导出文件obj.name", obj.name)//zh
    }, 2000)
    exports.age = age;
    exports.obj = obj;


// bar.js
    const bar = require("./foo.js")
    setTimeout(() => {
      console.log("导入的文件age", bar.age)// ppp, 不会输出10000
    }, 2000)
    setTimeout(() => {
      bar.obj.name = "zh"
    }, 1000)


es6 Module


  • 它是通过关键字来导入导出的。(import, export)


  • 异步加载,相当于加上了async属性。<script src="" type="module" async ></script>


  • 模块的相互依赖,在js代码编译的时候就知道了。


  • 导入文件和导出文件中的变量是实时绑定的。注意:下面这个例子需要在服务器端启动。不然会报错。


这个例子就是想说明导出的基本数据类型在导出文件中修改可以,并且是实时绑定到导入文件中的, 但是导入文件不能修改基本数据类型。


// foo.js
    let name = "zh";
    const obj = {
      name: 'llm'
    }
    setTimeout(() => {
      console.log("导出的obj.name", obj.name) // pppp
    }, 2000)
    setTimeout(() => {
      name = 'qqqq'
    })
    export {
      name,
      obj
    }


//bar.js
    import * as bar from './foo.js'
    console.log("bar执行")
    console.log(bar.name)
    // setTimeout(() => {
    //   bar.name = "pppp" //这里是不能修改导入的普通类型的变量的。因为在js内部,他自己通过const重新声明这个变量,做到实时绑定。
    // }, 1000)
    setTimeout(() => {
      bar.obj.name = "pppp" //但是可以修改导入的普通类型的变量的。
    }, 1000)
    setTimeout(() => {
      console.log("导出文件改变后的值", bar.name)// qqqq
    }, 2000)
    console.log("name=====", bar.name)
    console.log("obj.name======", bar.obj.name)


<script src="./bar.js" type="module"></script>


网络异常,图片无法展示
|


网络异常,图片无法展示
|


相关文章
|
3月前
|
存储 JavaScript 前端开发
[JS] ES Modules的运作原理
【9月更文挑战第16天】ES Modules(ECMAScript Modules)是 JavaScript 中的一种模块化开发规范,适用于浏览器和 Node.js 环境。它通过 `export` 和 `import` 关键字实现模块的导出与导入。模块定义清晰,便于维护和测试。JavaScript 引擎会在执行前进行静态分析,确保模块按需加载,并处理循环依赖。ES Modules 支持静态类型检查,现代浏览器已原生支持,还提供动态导入功能,增强了代码的灵活性和性能。这一规范显著提升了代码的组织和管理效率。
|
5月前
|
JavaScript
VUEX 使用学习六 : modules
VUEX 使用学习六 : modules
32 0
|
7月前
|
缓存 JavaScript 前端开发
JavaScript模块化:CommonJS与ES Modules的对比与使用
【4月更文挑战第22天】本文探讨了JavaScript模块化的两种规范——CommonJS和ES Modules。CommonJS适用于Node.js,通过`require`同步加载模块,而ES Modules(ES6模块)用于前端,支持异步加载和静态导入导出。CommonJS有缓存,ES Modules无缓存。在选择时,Node.js环境常用CommonJS,但趋势正转向ES Modules,前端项目推荐使用ES Modules以利用其优化性能的优势。
|
JSON Go API
保持 Modules 的兼容性(下)
保持 Modules 的兼容性(下)
46 0
|
SQL API Go
保持 Modules 的兼容性(上)
保持 Modules 的兼容性
34 0
|
JavaScript 前端开发
模块化开发:CommonJS、AMD 和 ES6 Modules 的区别与使用方式
在前端开发中,模块化开发是一种重要的编程方法,它可以帮助我们更好地组织和管理代码,提高代码的可维护性和复用性。在JavaScript中,有多种模块化开发的标准,包括CommonJS、AMD和ES6 Modules。让我们逐一了解它们的区别和使用方式:
214 0
|
JavaScript 前端开发 编译器
CommonJS与ES6 Module的本质区别
文章主要讨论了CommonJS和ES6 Module两种JavaScript模块系统的核心区别,包括动态与静态解决依赖方式,值拷贝与动态映射,以及如何处理循环依赖的问题。
245 0
|
JavaScript 前端开发 测试技术
CommonJS、AMD、CMD、ES6 Modules、ES Harmony
CommonJS、AMD、CMD、ES6 Modules、ES Harmony
167 0
CommonJS、AMD、CMD、ES6 Modules、ES Harmony
|
JavaScript 前端开发 API
【ES6】Module模块详解
【ES6】Module模块详解
233 0
|
JavaScript 开发者
exports和module.exports的区别|学习笔记
快速学习 exports 和 module.exports 的区别
exports和module.exports的区别|学习笔记