ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ES6--CommonJs和es6的Module的区别

2020-12-15 23:31:18  阅读:152  来源: 互联网

标签:ES6 CommonJs nodejs -- commonjs module 模块 加载


历史上,js一直没有模块(module)体系,无法将一个项目拆分成多个模块文件。正对这一情况,社区出现了一些统一的规范:CommonJs和AMD,前者是针对服务端的js,也就是nodejs。后者是针对浏览器的。ES6在语言标准层面上,实现了模块功能,而且实现也比较简单。完全可以取代CommonJs和AMD。达成前后端js的模块风格统一。不过目前还未完全达到这一目的。nodejs目前主流还是采用CommonJS规范。不过在v13.2版本,nodejs已经实现了ES6模块语法,还未正式替换,在考察阶段。v13.2版本将js文件以 .mjs结尾,nodejs将它视为ES6模块。以 .cjs结尾则视为CommonJS模块。也可以在包的package.json文件中增加 “type”: "module"信息。nodejs则将整个包都视为ES6模块来加载运行。

commonjs与ES6的module还是有很大区别的:

  1. 两者的模块导入导出语法不同,commonjs是module.exports,exports导出,require导入;ES6则是export导出,import导入。
  2. commonjs是运行时加载模块,ES6是在静态编译期间就确定模块的依赖。
  3. ES6在编译期间会将所有import提升到顶部,commonjs不会提升require。
  4. commonjs导出的是一个值拷贝,会对加载结果进行缓存,一旦内部再修改这个值,则不会同步到外部。ES6是导出的一个引用,内部修改可以同步到外部。
  5. 两者的循环导入的实现原理不同,commonjs是当模块遇到循环加载时,返回的是当前已经执行的部分的值,而不是代码全部执行后的值,两者可能会有差异。所以,输入变量的时候,必须非常小心。ES6
    模块是动态引用,如果使用import从一个模块加载变量(即import foo from
    ‘foo’),那些变量不会被缓存,而是成为一个指向被加载模块的引用,需要开发者自己保证,真正取值的时候能够取到值。
  6. commonjs中顶层的this指向这个模块本身,而ES6中顶层this指向undefined。
  7. 然后就是commonjs中的一些顶层变量在ES6中不再存在:
arguments
require
module
exports
__filename
__dirname

标签:ES6,CommonJs,nodejs,--,commonjs,module,模块,加载
来源: https://blog.csdn.net/weixin_41682025/article/details/111242903

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有