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 这三个属性,分别代表包的名字、版本号、包的入口。