当然,世界上没有无缘无故的爱,也没有无缘无故的恨。美国司法部在微软公司内部发现的一个短语,拥抱、扩展再吞并(Embrace, extend, and extinguish,最后一个词也作 exterminate,或按 extinguish 译为扑灭),曾将这个巨头的真实企图暴露在公众面前:第一步,拥抱广泛使用的技术标准、开源平台;第二步,在其中植入自己的专利和基因;第三步,将其据为己有。
让我回过头来品,再细品:微软前脚收购 GitHub,引发了一波开源界的恐慌。这次,微软没有出面,而是让 GitHub 把 npm 收了。至此,最大的开源社区是微软的;最大的 js 包管理器,也是微软的。
微软一举成为开源代码托管平台和 JavaScript 两个领域的终极 boss!有内味了,是不是?
npm 和 Node.js 的前世今生
Node.js 是目前非常火热的 Web 服务端技术,但是它的诞生经历却很奇特。
浏览器技术日进千里,而微软错失良机
众所周知,在 Netscape 设计出 JavaScript 后的短短几个月,JavaScript 事实上已经是前端开发的唯一标准。
后来,微软通过 IE 击败了 Netscape 后一统桌面,结果几年时间,浏览器毫无进步。(2001 年推出的古老的 IE 6 到今天仍然有人在使用!)
微软认为 IE6 浏览器已经非常完善,几乎没有可改进之处,然后解散了 IE6 开发团队!而 Google 却认为支持现代 Web 应用的新一代浏览器才刚刚起步,尤其是浏览器负责运行 JavaScript 的引擎性能还可提升 10 倍。
先是 Mozilla 借助已壮烈牺牲的 Netscape 遗产在 2002 年推出了 Firefox 浏览器,紧接着 Apple 于 2003 年在开源的 KHTML 浏览器的基础上推出了 WebKit 内核的 Safari 浏览器,不过仅限于 Mac 平台。Google 也看中了 WebKit 内核,于是基于 WebKit 内核推出了 Chrome 浏览器。Google 认为要运行现代 Web 应用,浏览器必须有一个性能非常强劲的 JavaScript 引擎,于是 Google 自己开发了一个高性能 JavaScript 引擎,名字叫 V8,以 BSD 许可证开源。
C++太难用,Ryan Dahl 自己造了门语言 Node.js
话说有个叫 Ryan Dahl 的歪果仁,他的工作是用 C/C++写高性能 Web 服务。对于高性能,异步 IO、事件驱动是基本原则,但是用 C/C++写就太痛苦了。于是这位仁兄开始设想用高级语言开发 Web 服务。他评估了很多种高级语言,发现很多语言虽然同时提供了同步 IO 和异步 IO,但是开发人员一旦用了同步 IO,他们就再也懒得写异步 IO 了,所以,最终,Ryan 瞄向了 JavaScript。
因为 JavaScript 是单线程执行,根本不能进行同步 IO 操作,所以,JavaScript 的这一“缺陷”导致了它只能使用异步 IO。
于是在 2009 年,Ryan 正式推出了基于 JavaScript 语言和 V8 引擎的开源 Web 服务器项目,命名为 Node.js。虽然名字很土,但是,Node 第一次把 JavaScript 带入到后端服务器开发,加上世界上已经有无数的 JavaScript 开发人员,所以 Node 一下子就火了起来。
代码依赖管理混乱,我要写个包管理器
如果你开发了很多网站服务,依赖的代码越来越多,就会发现一件很麻烦的事情:去 jQuery 官网下载 jQuery;去 BootStrap 官网下载 BootStrap;去 Underscore 官网下载 Underscore……
于是有些程序员就受不鸟了,一个拥有三大美德(懒惰、急躁和傲慢)的程序员 Isaac Z. Schlueter 给出一个解决方案:用一个工具把这些代码集中到一起来管理吧!
开发者们写了大量的 Node.js 开源包,但是 Node.js 缺少一个包管理器,于是 Ryan Dahl 和 npm 的作者一拍即合、抱团取暖,最终 Node.js 内置了 npm。
随着 Node.js 的火爆,大家开始用 npm 来共享 JS 代码了,于是许多开源作者也将自己的包发布到 npm 了。把你需要的包写到 package.json 里,然后运行 npm install ,npm 就会自动帮你安装了。