Skip to content

javascript 发展初期,没有模块化的概念。代码都通过<Script>标签引入,随着项目规模变大,全局变量污染,函数命名冲突、依赖关系处理等问题都难以解决。

逐渐的出现了前端模块化解决方案,AMD、CMD、Common.js以及ES6的模块化规范。

规范就是规范,就像编程语言的语法

AMD规范 与CMD规范

AMD规范主要实现为 Require.js

CMD规范主要sea.js

这两个规范目前已经是明日黄花,不推荐再去学习。


Common.js

node.js 是commom.js 规范的主要实践者。common.js规范规定,每个模块可以有两个变量使用:require和module:

  • require 用来加载模块
  • module 代表当前模块,exports 是 module 上的一个属性,保存了当前模块要导出的接口或者变量
javascript
// common.js 规范
// module.js 模块导出 通过module.export
const a = 'commonjs'
module.export = { // 模块导出
    a : a	
}

// b.js 引入模块 通过require
const b = require('./a.js')

ES6 module

前边提到的几种规范是社区开发者制定的,ES6 module是javascript 语言层面实现的模块化,而且实现的相当简单,完全可以替代AMD、CMD、common.js,成为通用的模块化解决方案。

Node.js 13.2版本,也已经默认支持了ES6 module规范。

javascript
// ES6 module 基本语法
// a.js 模块导出
export const a = 'es6 module'

// b.js 模块导入
import { a } from 'a.js'

import语句、import()、require() 用法和区别

import语句和import()属于ES6语法,而require()属于node中的。

  • import语句命令能够接受什么参数,import()函数就能接受什么参数,两者区别主要是后者为动态加载。
  • import是静态加载资源,编译时放到代码块最顶层。
  • import()函数则是动态按需加载返回Promise 对象。import()函数可以用在任何地方,不仅仅是模块,非模块的脚本也可以使用。
  • import()函数它是运行时执行,也就是说,什么时候运行到这一句,就会加载指定的模块。
  • import()函数与所加载的模块没有静态连接关系,这点也是与import语句不相同。import()类似于 Node 的require方法,区别主要是前者是异步加载,后者是同步加载。

题外话: npm包的规范

npm 包管理 是有一套规范,遵循npm包规范进行定义,才能使用npm进行管理。和具体的包里面的内容使用的是Common.js还是ES6 module规范无关

规范的包结构,必须符合

  • 包必须以单独的目录而存在
  • 包的顶级目录下要必须包含 package.json这个包管理配置文件
  • package.json 中必须包含 name,version,main 这三个属性,分别代表包的名字、版本号、包的入口。

参考

前端模块化:CommonJS,AMD,CMD,ES6

[前端科普系列-CommonJS:不是前端]