博客
关于我
ES6模块化与commonJS的对比
阅读量:379 次
发布时间:2019-03-05

本文共 1415 字,大约阅读时间需要 4 分钟。

模块化技术是JavaScript语言发展的重要里程碑,它彻底解决了依赖混乱和全局变量污染问题,为构建大型应用奠定了基础。

依赖混乱的表现

在传统的JavaScript开发中,文件之间的依赖关系总是像一团乱麻。假设有几十个JavaScript文件,彼此之间存在复杂的依赖关系,例如:

  • f1依赖f2和f3
  • f3依赖f4和f5
  • f5又依赖f1和f6

这种情况下,正确引入文件的顺序变得异常复杂,手动管理这些依赖关系容易出错,影响项目的开发效率。

全局变量污染的后果

全局变量污染的主要问题在于变量名冲突。当多个JavaScript文件在同一个页面上运行时,各文件中的变量可能会互相覆盖,导致难以调试和维护。例如:

  • a.js定义了一个变量myName = 1
  • b.js也定义了myName = 2
  • c.js进一步定义了一个函数myName = {}

最终,myName变量会被最后引入的c.js覆盖,导致前面文件的工作全部丢失。

模块化技术的出现

随着JavaScript在浏览器和Node.js环境中的应用,模块化技术变得迫切需要。社区提出了多种方案,最终形成了CommonJS和ES6模块化标准。CommonJS主要用于Node.js,而ES6模块化则为浏览器和Node.js提供了统一标准。

模块化技术的优势

  • 清晰的依赖管理

    模块化技术通过明确的导入和导出机制,记录模块之间的依赖关系。只需引入一个入口文件,其他模块按需加载,彻底解决了依赖混乱问题。

  • 本地变量保护

    模块在运行前会被封装到立即执行函数中执行。这样,所有变量都局限于模块内部,避免了全局变量污染问题。

  • ES6与CommonJS的对比

    导入导出方式

    • ES6

      • 导出:export const/a = 1export { b }
      • 导入:import { a, b } from './module.js'
      • 特点:基于内置的语法,浏览器和Node.js兼容。
    • CommonJS

      • 导出:exports.a = 1module.exports = { a: 1, b: 2 }
      • 导入:const obj = require('./module.js')
      • 特点:基于社区标准,Node.js主要使用。

    区别点

  • 导入时机

    ES6在编译时完成导入,而CommonJS在运行时通过require完成,影响性能和加载方式。

  • this值

    ES6模块中的thisundefined,CommonJS模块中的this为空对象。

  • 输出方式

    ES6输出为引用,CommonJS输出为实际值的引用。

  • 示例对比

    // CommonJS// a.jslet a = 1;function count() {    a++;}module.exports = { a, count };// b.jslet obj = require('./a.js');obj.count();console.log(a); // 1// ES6// a.jslet a = 1;function count() {    a++;}export { a, count };// b.jsimport { a, count } from './a.js';count();console.log(a); // 2

    通过以上对比可以看出,两种模块化方式在使用场景和特性上各有优劣,选择时需根据项目需求进行权衡。

    转载地址:http://qkhwz.baihongyu.com/

    你可能感兴趣的文章
    Oracle删除主表数据
    查看>>
    js中两种定时器,setTimeout和setInterval实现验证码发送
    查看>>
    Oracle常用SQL
    查看>>
    未授权异常:FATAL ERROR in native method: Unauthorized
    查看>>
    JDK安装与环境变量配置(详细基础篇)
    查看>>
    golang内存及GC分析简易方法
    查看>>
    技术美术面试问题整理
    查看>>
    Redis分布式锁原理
    查看>>
    学习SSM中ajax如何与后台传数据
    查看>>
    【备份】求极限笔记
    查看>>
    【备份】概率论笔记备份
    查看>>
    ES6模块化与commonJS的对比
    查看>>
    C++学习记录 四、基于多态的企业职工系统
    查看>>
    C++学习记录 五、C++提高编程(2)
    查看>>
    面试问道nginx优化怎么做的
    查看>>
    自学linux毕业shell面试题
    查看>>
    4 Java 访问控制符号的范围
    查看>>
    第9章 - 有没有替代原因(检验证据)
    查看>>
    VUE3(八)setup与ref函数
    查看>>
    Vue之Element标签页保留用户操作缓存。
    查看>>