前端模块化CommonJS和ES Module模块化

136 阅读2分钟

前端模块化,将一个大型的应用拆分成一个个独立,可复用的模块,每个模块都有自己的功能和接口
前端模块化是为了提高代码的复用性和可维护性
在传统开发中,所有代码都写在一个文件中,代码越来越多可维护性差

  1. 传统开发中,使用全局function,将功能封装成不同函数,挂在window下,会污染全局命名空间,容易引起命名冲突
  2. 全局namespace,通过对象来封装模块let myModel={handleData(){}}。减少了全局变量,解决命名冲突的问题,但是外部可以直接修改模块内部的数据

模块化规范CommonJS

CommonJS是一个JS模块化规范,定义了模块的基本结构、模块的加载方式以及模块的导入和导出方式等内容。是NodeJS的默认模块规范

  1. 模块的导入和导出。导出,一个模块可以通过module.exportsexports对象来导出内容,module.exports是真正的导出对象,而exports对象只是对module.exports的一个引用;导入,通过require函数来引入其他模块,并方位其导出的内容
  2. 特点
  • CommonJS模块由JS运行时实现
  • CommonJS模块输出的是值的拷贝,本质上导出的是exports属性
  • CommonJS模块可以动态加载,对每一个加载都存在缓存,可以有效的解决循环引用问题
  • CommonJS模块同步加载并执行模块文件

ESModule模块化

ESModule模块化规范是一种静态的模块化方案,将代码分割成小的、独立的模块,每个模块都有自己的作用域。每个文件都是一个独立的模块

ESModule的模块解析规则是基于URL解析规则。 当我们使用 import 语句导入一个模块时,模块加载器会根据 import 语句中指定的路径解析出对应的 URL,并将其作为唯一标识符来加载对应的模块文件。

  • 在浏览器中,URL 解析规则是基于当前页面的 URL 进行解析;
  • 在 Node.js 中,URL 解析规则是基于当前运行脚本的路径进行解析。
  1. 模块的导入和导出,使用export关键字将变量或函数导出,使用import关键字导入其他模块。默认导出使用export default
  2. 特点
  • ES6 Module静态的,不能放在块级作用域内,代码发生在编译时
  • ES6模块输出的是值的引用,如果一个模块修改了另一个模块导出的值,那么这个修改会影响到原始模块
  • ES6 可以导出多个属性和方法,可以单个导入导出,混合导入导出
  • ES6 模块提前加载并执行模块文件