将不同的功能拆分成独立的文件,可以开放部分接口给外部
模块无论加载多少次,只会在第一次时执行
:::
模块默认是在最后解析
使用模块时默认是严格模式
每一个模块都是一个独立的作用域
:::
文件划分方式:完全依靠约定,每个文件就是一个独立的模块,使用模块时通过script标签引入,然后在代码中直接调用模块中的全局成员,成员有可能是变量,也有可能是一个函数
污染全局作用域:模块中的所有成员都可以在模块外部被任意访问或修改
命名冲突问题:模块一旦多了就容易产生命名冲突
无法管理模块依赖方式
命名空间方式:每个模块只暴露一个全局的对象,所有的模块成员都挂载在这个对象下
IIFE:使用立即执行函数的方式为模块提供私有空间
具体做法就是将模块中的每一个私有成员都放在一个函数提供的私有作用域当中,对于需要暴露给外部的成员,可以通过挂载到全局对象上去实现,这种方式实现了私有成员的概念,确保了私有变量的安全
常用的模块化打包工具
将程序文件依据一定规则拆分成多个文件,这种编码方式就是模块化的编码方式。
拆分出来的每个文件就是一个模块,模块中的数据都是私有的,模块之间互相隔离。
同时也能通过一些手段,可以把模块内的指定数据「交出去」,供其他模块使用。
随着应用的复杂度越来越高,其代码量和文件数量都会急剧增加,会逐渐引发以下问题:
模块化的核心思想就是:模块之间是隔离的,通过导入和导出进行数据和功能的共享。
在 CommonJS 标准中,导出数据有两种方式:
第一种方式:module.exports = value
第二种方式:exports.name = value
注意点:
每个模块内部的:this
、exports
、module.exports
在初始化时,都指向同一个空对象,该空对象就是当前模块导出的数据。

无论如何修改导出对象,最终导出的都是 module.exports
的值