javscript模块化发展
模块化发展的历程
- 直接定义依赖: 由于当时js文件非常简单,模块化方式非常简单粗暴 —— 通过全局方法定义、引用模块
- 闭包模块化模式:用闭包方式解决了变量污染问题,闭包内返回模块对象,只需对外暴露一个全局变量
- 模版依赖定义:后端模版语法,通过后端语法聚合 js 文件,从而实现依赖加载
- 注释依赖定义:通过lazyjs加载文件,同时读取文件注释,继续递归加载剩下的文件
- 外部依赖定义:这种定义方式在 cocos2d-js 开发中普遍使用,其核心思想是将依赖抽出单独文件定义
- 沙箱模式定义:将所有模块塞到一个sandbox变量中,硬伤是无法解决命名冲突问题
- 依赖注入:就是大家熟知的angular1.0
- CommonJS:真正解决模块化问题,从 node 端逐渐发力到前端,前端需要使用构建工具模拟
- Amd:这个方案主要解决前端动态加载依赖,相比 commonJs,体积更小,按需加载
- Umd:兼容了CommonJS与Amd,其核心思想是,如果在commonjs环境(存在module.exports,不存在define),将函数执行结果交给module.exports实现Commonjs,否则用Amd环境的define,实现Amd
- ES2015 Modules:模块功能主要由两个命令构成:export和import。export命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能
从语言层面到文件层面的模块化
在CommonJS引入之前,模块化的探索更多的都是基于语言层面的优化,
为什么模块化方案这么晚才成型?
有很大的原因是早期应用的复杂度都在后端,前端都是非常简单逻辑,直到ajax火了以后,客户端端渲染开始流行,前端的复杂度也呈指数级上涨,到今天几乎和后端接近一个量级。工程发展到一定阶段,要出现的必然会出现