JavaScript之无题之让人烦躁的模块化

我怎么记得我好像写过相关类型的文章,但是我找遍了我的博客没有~那就再写一遍吧 , 其实模块化的核心内容也算不上是复杂,只不过需要整理一下,规划一下罢了 。嘻嘻 。
开始写标题的时候我就在纠结一件事情,就是,先吃喜欢吃的,还是后吃喜欢吃的,翻译过来就是我应该先写CommonJS和ES6 Module,还是先写CMD和AMD 。嗯,我决定了,谁先做好了我就先吃谁 。
其实模块化的缘由很简单,就一句话,不对,就一个词,两个字,分类 。如果一定让我在加一点,那应该是“隔离” 。没了~~但是这么少不太好,我举个可能不那么恰当的例子吧 。
刚开始这个世界上只有三个人,起名字的时候会“刻意”的避开彼此已经叫过的名字 , 他们在一起生活,日子欣欣向荣,一片美好,对未来充满了期待 。
时间飞逝,三个人变成了三十人 , 他们勉强还是住在一起 , 扩建了房屋 , 起名字的时候虽然费事一点,但是也还能不重复,日子还是欣欣向荣,一片美好,对未来充满了期待 。
【JavaScript之无题之让人烦躁的模块化】时间又飞逝,三十人变成了三百人,那这不太好管理了,于是三位首领就说,你们有领导能力的几个人站出来,组成各自的部落 , 去吧,我相信你们可以的 。于是每个部落住在一起,部落与部落之间的人可以重名,叫名字的时候再加上一个部落的名称呗 , 嗯~又一片欣欣向荣 。
时间继续飞逝,三百人变成了三千人,这三千人住在几个大部落里也很不方便,你拿我的苹果,我偷了你得猪 , 这肯定不行,有碍于社会的稳定发展,于是三个创始者叫上部落的组长说,我们给每个人分一块地,盖一个房子,把三五个人分割成一个家庭,家庭之间由部落作为纽带,关联彼此,在形式上又相互独立,不可以随便拿别家的苹果 。很完美~
时间飞飞飞飞逝,三千人变成了三百万人……我们需要法律了 。
OK,上面的小例子 , 人,就是函数,部落就是命名空间,房子就是IIFE,法律就是后续发展的模块化规范 。那么我们依照上面的描述,如何转换成代码?
一、社会的起源与法律的雏形最开始的时候 , 浏览器只需要简单的图文展示就是可以了,没什么复杂的交互和逻辑的处理,所以,当我们只有三个人的时候,我们可以很自由,很随意:
function a(){}function b(){}随着Web的发展 , 交互的增多,项目的扩大,很容易有人也声明了同样名称的函数,于是纷争开始了,那咋解决纷争呢?嗯,命名空间也就是拆分部落 , 就像这样:
var zaking1 = {a:function(){},b:function(){}}var zaking2 = {a:function(){},b:function(){}}但是这样并不能真正的解决问题,因为虽然从形式上区分了部落,但是部落之间没有任何的隔离,部落内部也是混乱的,所以各个首领就制定了一个方案 , IIFE,利用闭包的特性,来实现数据的隔离 , 暴露出对外的入口:
var module = (function () {var name = "zaking";function getName() {console.log(name);}return { getName };})();module.getName();我们盖好了房子 , 还给房子建好了可以出入的门,但是我怎么邀请别人进来呢?
var module = (function (neighbor) {var name = "zaking";function getName() {console.log(name + "和邻居:" + neighbor);}return { getName };})("xiaowangba");module.getName();传个参数呗 , 这就是依赖注入 。在这个阶段,最有代表性的就是jQuery了,它的封闭性的核心实现,跟上面的代码几乎无异 , 我们可以看下jQuery的模块的实现:
(function (global, factory) {factory(global);})(typeof window !== "undefined" ? window : this, function (window, noGlobal) {if (typeof noGlobal === "undefined") {window.jQuery = window.$ = jQuery;}return jQuery;});当然我这里略了很多 , 你看它,无非就是一个闭包,传入了window和jQuery本身 , 然后再绑定到window上,这样 , 我们就只能访问到暴露出来的$以及$上的方法和属性,我们根本无法修改内部的数据 。
OK,到了这个阶段,其实算是一个转折点,我们有了初步的法律,还需要后续针对法律的完善,
二、法律的初现与CommonJs随着社会的发展,出现一种规则已成必然,于是commonJs统领举起模块化的大旗,让JavaScript迈向了另一个阶段 。commonJs最初由 JavaScript 社区中的 Mozilla 的工程师Kevin Dangoor在Google Groups中创建了一个ServerJs小组 。该组织的目标是为web服务器、桌面和命令行应用程序以及浏览器构建JavaScript生态系统 。嗯 , 它的野心很大~,后来,他就就把ServerJs改成了commonJs,毕竟ServerJs的范围有点?。?commonJs更符合他们的初衷 。

推荐阅读