Require的用法及短语 require的用法

为什么有模块概念理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块 。
但是,Javascript不是一种模块化编程语言,在es6以前 , 它是不支持”类”(class),所以也就没有”模块”(module)了 。
首发文章,欢迎关注我的公众号:Web前端Talkrequire时代Javascript社区做了很多努力 , 在现有的运行环境中,实现”模块”的效果 。
原始写法
模块就是实现特定功能的一组方法 。
只要把不同的函数(以及记录状态的变量)简单地放在一起,就算是一个模块 。

Require的用法及短语 require的用法



上面的函数m1()和m2(),组成一个模块 。使用的时候,直接调用就行了 。
这种做法的缺点很明显:”污染”了全局变量,无法保证不与其他模块发生变量名冲突,而且模块成员之间看不出直接关系 。
对象写法
为了解决上面的缺点,可以把模块写成一个对象,所有的模块成员都放到这个对象里面

Require的用法及短语 require的用法



上面的函数m1()和m2(),都封装在module1对象里 。使用的时候,就是调用这个对象的属性

Require的用法及短语 require的用法



这样的写法会暴露所有模块成员,内部状态可以被外部改写 。比如 , 外部代码可以直接改变内部计数器的值 。

Require的用法及短语 require的用法



立即执行函数写法
使用”立即执行函数”(Immediately-Invoked Function Expression,IIFE),可以达到不暴露私有成员的目的

Require的用法及短语 require的用法



使用上面的写法,外部代码无法读取内部的_count变量 。

Require的用法及短语 require的用法



module就是Javascript模块的基本写法 。
主流模块规范在es6以前,还没有提出一套官方的规范,从社区和框架推广程度而言,目前通行的javascript模块规范有两种:CommonJS 和 AMD
CommonJS规范

Require的用法及短语 require的用法



2009年 , 美国程序员Ryan Dahl创造了node.js项目,将javascript语言用于服务器端编程 。
这标志”Javascript模块化编程”正式诞生 。前端的复杂程度有限,没有模块也是可以的,但是在服务器端,一定要有模块 , 与操作系统和其他应用程序互动,否则根本没法编程 。
node编程中最重要的思想之一就是模块,而正是这个思想,让JavaScript的大规模工程成为可能 。模块化编程在js界流行,也是基于此 , 随后在浏览器端,requirejs和seajs之类的工具包也出现了,可以说在对应规范下 , require统治了ES6之前的所有模块化编程,即使现在,在ES6 module被完全实现之前,还是这样 。
在CommonJS中,暴露模块使用module.exports和exports,很多人不明白暴露对象为什么会有两个,后面会介绍区别
在CommonJS中,有一个全局性方法require(),用于加载模块 。假定有一个数学模块math.js,就可以像下面这样加载 。

Require的用法及短语 require的用法



然后,就可以调用模块提供的方法:

Require的用法及短语 require的用法



正是由于CommonJS 使用的require方式的推动,才有了后面的AMD、CMD 也采用的require方式来引用模块的风格

推荐阅读