node历史

今天看cnode开源项目用了io.js,在查这个项目时发现这篇文章node历史,node.js和io.js关系
谈到Node.js的由来,不可避免要聊到它的创始人Ryan Dahl。在2009年时,服务端JavaScript迎来了它的拐点,因为Ryan Dahl带来了Node.js,在那之后Node.js将服务端JavaScript带入了新的境地,大量的JavaScript在GitHub上被贡献出来,大量的JavaScript模块出现,出现了真正的繁荣。Node.js创始人Ryan Dahl。
Ryan Dahl的经历比较奇特,他并非科班出身的开发者,在2004年的时候他还在纽约的罗彻斯特大学数学系读博士,期间有研究一些分形、分类以及p-adic分析,这些都跟开源和编程没啥关系。2006年,也许是厌倦了读博的无聊,他产生了『世界那么大,我想去看看』的念头,做出了退学的决定,然后一个人来到智利的Valparaiso小镇。那时候他尚不知道找一个什么样的工作来糊口,期间他曾熬夜做了一些不切实际的研究,如如何通过云进行通信。从那起,Ryan Dahl不知道是否因为生活的关系,他开始学习网站开发了,走上了码农的道路。那时候Ruby on Rails很火,他也不例外的学习了它。从那时候开始,Ryan Dahl的生活方式就是接项目,然后去客户的地方工作,在他眼中,拿工资和上班其实就是去那里旅行。此后他去过很多地方,如阿根廷的布宜诺斯艾利斯、德国的科隆、奥地利的维也纳。Ryan Dahl经过两年的工作后,成为了高性能Web服务器的专家,从接开发应用到变成专门帮客户解决性能问题的专家。期间他开始写一些开源项目帮助客户解决Web服务器的高并发性能问题,尝试过的语言有Ruby、C、Lua。当然这些尝试都最终失败了,只有其中通过C写的HTTP服务库libebb项目略有起色,基本上算作libuv的前身。这些失败各有各的原因,Ruby因为虚拟机性能太烂而无法解决根本问题,C代码的性能高,但是让业务通过C进行开发显然是不太现实的事情,Lua则是已有的同步I/O导致无法发挥性能优势。虽然经历了失败,但Ryan Dahl大致的感觉到了解决问题的关键是要通过事件驱动和异步I/O来达成目的。
在他快绝望的时候,V8引擎来了。V8满足他关于高性能Web服务器的想象:
1.没有历史包袱,没有同步I/O。不会出现一个同步I/O导致事件循环性能急剧降低的情况。
2.V8性能足够好,远远比Python、Ruby等其他脚本语言的引擎快。
3.JavaScript语言的闭包特性非常方便,比C中的回调函数好用。

于是在2009年的2月,按新的想法他提交了项目的第一行代码,这个项目的名字最终被定名为“node”。Node.js随着JSConf EU会议等形式的宣传下,一家位于硅谷的创业公司注意到了该项目。这家公司就是Joyent,主要从事云计算和数据分析等。Joyent意识到Node.js项目的价值,决定赞助这个项目。Ryan Dahl于2010年加入该公司,全职负责Node.js项目的开发。此时Node.js项目进入了它生命历程里的第二个阶段:从个人项目变成一个公司组织下的项目。
这个时期可以的组织架构和管理模式可以总结为“Gatekeeper + Joyent”模式。
Gatekeeper的身份类似于项目的技术负责人,对技术方向的把握是有绝对权威。历任的Gatekeeper为:Ryan Dahl、Isaac Z. Schlueter、Timothy J Fontaine,均是在Node.js社区具有很高威望的贡献者。项目的法律方面则由Joyent负责,Joyent注册了“Node.js”这个商标,使用其相关内容需要得到法律授权。
技术方面除了Gatekeeper外,还有部分core contributor。core contributor除了贡献重要feature外,帮助项目进行日常的patch提交处理,协助review代码和合并代码。项目中知名的core contributor有Ben Noordhuis,Bert Belder、Fedor Indutny、Trevor Norris、Nathan Rajlich等,这些人大多来自Joyent公司之外,他们有各自负责的重要模块。Gatekeeper除了要做core contributor的事情外,还要决定版本的发布等日常事情。

Mikeal Rogers的威望不是建立在他对Node.js项目代码的贡献上,他的威望主要来自于request模块和JSConf会议。其中JSConf是JavaScript社区最顶级的会议,他是主要发起人。
在2014年8月,以Mikeal Rogers为首,几个重要core contributor一起发起了一个叫做“Node forword”的组织。该组织致力于发起一个由社区自己驱动来提升Node、JavaScript和整个生态的项目。“Node forword”可以视作是io.js的前身。这些core contributor们在“Node forword”上工作了一段时间,后来因为可能涉及到Node这个商标问题,Fedor Indutny愤而fork了Node.js,改名为io.js,宣告了Node.js社区的正式分裂。
简单点来说这件事情主要在于社区贡献者们对于Joyent公司的不满,导致这些主要贡献者们想通过一个更开放的模式进行协作。复杂点来说这是公司开源项目管理模式的问题所在,当社区方向和公司方向一致时,必然对大家都有好处,形同蜜月期,但当两者步骤不一致时,分歧则会暴露出来。这点在Node.js项目的后期表现得极为明显,社区觉得项目进展缓慢,而Joyent公司的管理层则认为他稳定可靠。

io.js的开放管理模式主要体现在以下方面:

  • 不再有Gatekeeper。取而代之的是TC(Technical Committee),也就是技术委员会。技术委员会基本上是由那些有很多代码贡献的core contributor组成,他们来决定技术的方向、项目管理和流程、贡献的原则、管理附加的合作者等。当有分歧产生时(如引入feature),采用投票的方式来决定,遵循少数服从多数的简单原则。基本上原来由一个人担任的Gatekeeper现在由一个技术委员会来执行。如果要添加一个新成员为TC成员,需要由一位现任的TC成员提议。每个公司在TC中的成员不能超过总成员的1/3。
  • 引入Collaborators。代码仓库的维护不仅仅局限在几个core contributor手中,而是引入Collaborators,也就是合作者。可以理解为有了更多的core contributor。
  • TC会议。之前的的沟通方式主要是分布式的,大家通过GitHub的issue列表进行沟通。这种模式容易堆积问题,社区的意见被接受和得到处理取决于core contributor的情况。io.js会每周举行TC会议,会议的内容主要就issue讨论、解决问题、工作进展等。会议通过Google Hangout远程进行,由TC赞同的委任主席主持。会议视频会发布在YouTube上,会议记录会提交为文档放在代码仓库中。
  • 成立工作组。在项目中成立一些细分的工作组,工作组负责细分方向上的工作推进。
    io.js项目从fork之后,于2015-01-14发布了v1.0.0版本。自此io.js一发不可收拾,以周为单位发布新的版本,目前已经发布到2.0.2。io.js项目与Node.js的不同在行为上主要体现在以下方面:
  • 新功能的激进。io.js尽管在架构层面依然保持着Node.js的样子(由Ryan Dahl时确立),但是对于ECMAScript 6持拥抱态度。过去在Node.js中需要通过flag来启用的新功能,io.js中不再需要这些flag。当然不用flag的前提是V8觉得这个feature已经稳定的情况下。一旦最新的Chrome采用了新版本的V8,io.js保持很快的跟进速度。
  • 版本迭代。io.js保持了较高频率的迭代,以底层API改变作为大版本的划分,但对于小的改进,保持每周一个版本的频率。只要是改进,io.js项目的TC和Collaborators都非常欢迎,大到具体feature或bug,小到文档改进都可以被接受,并很快放出版本。
  • issue反馈。Node.js的重要的贡献者们都在io.js上工作,Node.js和io.js项目的问题反馈速度几乎一致,但是问题处理速度上面io.js以迅捷著称,基本在2-3天内必然有响应,而Node.js则需要1个礼拜才有回复。

最终的结论是Node.js项目和io.js项目都将加入Node.js基金会。Node.js基金会的模式与io.js较为相似,但是更为健全。Mikeal Rogers在他的一篇名为《Growing Up》的文章中提到io.js项目需要一个基金会的原因。io.js项目在技术方面的成熟度显然要比最初的Gatekeeper时代要更为先进,给予贡献者更多的管理权利。然而在市场和法律方面,还略显幼稚。最终无论是顾问委员会,还是io.js都选定以基金会的形式存在。这个基金会参考Linux基金会的形式,由董事会和技术委员会组成,董事会负责市场和法律方面的事务,技术委员会负责技术方向。

从io.js的分裂到Node.js基金会,从外人看起来似乎如一场闹剧一般,然而这个过程中可以看到一个开源项目自身的成长。尽管io.js将归于Node.js基金会,像一个离家出走的孩子又回家一般,它的出走可能要被人忘记,但从当初的出发点来说,这场战役,io.js其实是赢家。穷则思变、不破不立是对Joyent较为恰当的形容。如果Joyent能提前想到这些,则不会有社区分裂的事情发生。Node.js处于停滞状态的开发和io.js的活跃情况之间,目前免不了大量的Merge工作。作为和解的条件之一,Node.js基金会之后Node版本的发布将基于目前io.js的进展来进行。后续的合并工作示意如下:
now
(io.js) v2.0 : v2.x
| | : |
v0.10.x /--------------:-----------------\ Node.js 2.0
|/ : __|_
\ : /
--------------:-----------------/
| | : | |
(node.js) v0.12.x : v0.13.x v0.14.x

在未完成合并之前,io.js会继续保持发布。Node.js的下个大版本跨过1.0,直接到2.0。
io.js项目的TC将被邀请加入Node.js基金会的TC,毕竟两者在技术管理方面达成了一致。基金会将在黄金和白银会员中选举出董事、技术委员会成员中选举出技术委员主席。
对于成为Node.js基金会成员方面,企业可以通过赞助的方式注册成为会员。

npm

npm管理项目依赖

package.json

npm命令运行时会读取当前目录的 package.json 文件和解释这个文件,这个文件基于 Packages/1.1 规范。在这个文件里你可以定义你的应用名称( name )、应用描述( description )、关键字( keywords )、版本号( version )、应用的配置项( config )、主页( homepage )、作者( author )、资源仓库地址( repository )、bug的提交地址( bugs ),授权方式( licenses )、目录( directories )、应用入口文件( main )、命令行文件( bin )、应用依赖模块( dependencies )、开发环境依赖模块( devDependencies )、运行引擎( engines )和脚本( scripts )等。

npm配置

npm 拥有很多默认配置。你可以使用这些默认的配置,也可以修改这些默认的配置,甚至可以在环境变量或命令行下修改这些配置。配置的权重是如下顺序定义的:
1.命令行,使用—为前缀的参数。比如 —foo bar,设定变量 foo 的值为" bar “。—foo 后不带值的参数,设定 foo 的值为 true 。
2.环境变量,所有 npmconfig 为前缀的环境变量。比如 npm_config_foo = bar ,设定变量 foo 为 “ bar "。
3.用户定义。所有的变量存储在 HOME/.npmrc文件里的变量。4.全局。所有HOME/.npmrc 文件里的变量。
4.全局。所有 PREFIX/etc/npmrc 文件里的变量。$PREFIX 变量可通过 npm prefix -g 获取,一般默认是 /usr/local。
5.内置的配置。通过安装时运行 ./configure 所定义的变量。可通过命令curl http://npmjs.org/install.sh | env npm_config_foo=bar sh 设置。

使用配置能给我们带来很大的灵活性。比如我们使用 npm install 时,对默认的资源库地址 https://registry.npmjs.org/ 不是很满意,我们可以使用下面的命令来更改资源库地址。

npm --registry "an other registry" install express
#或者下面的命令
env npm_config_registry="an other registry" npm install express

npm link

可以很方便的使用安装在全局下面的模块依赖;

  • 在当前目录下npm link 将当前模块链接到全局模块库
  • 在当前目录下npm link [moduleName] 可以依赖全局模块,然后项目中代码就可以用require()调用了。

对公共依赖的处理方式如下:

npm install coffee-script -g # 全局模式下安装coffee-script
cd ~/work/node/test # 进入开发目录
npm link coffee-script # 把全局模式的coffee-script模块链接到本地的node_modules下
cd ../test-example # 进入另外的一个开发目录
npm link coffee-script # 把全局模式的coffee-script模块链接到本地
npm update coffee-script -g # 更新全局模式的coffee-script,所有link过去的项目同时更新了

cnpm

npm默认仓库在国外,下载比较忙,国内可采用淘宝的npm镜像。淘宝的 NPM 镜像是一个完整的npmjs.org镜像。你可以用此代替官方版本(只读),同步频率目前为 15分钟 一次以保证尽量与官方服务同步。

  1. 当前 registry.npm.taobao.org 是从 registry.npmjs.org 进行全量同步的.
  2. 当前 npm.taobao.org 运行版本是: cnpmjs.org@0.4.1
  3. 系统运行在 Node.js@v0.11.12 上.

可以通过定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm,支持 npm 除了 publish 之外的所有命令。
通过下面命令安装

npm install -g cnpm --registry=http://registry.npm.taobao.org

或者添加alias如下:

alias cnpm="npm --registry=http://registry.npm.taobao.org \
--cache=HOME/.npm/.cache/cnpm −−disturl=http://dist.cnpmjs.org −−userconfig=HOME/.npm/.cache/cnpm \
--disturl=http://dist.cnpmjs.org \
--userconfig=HOME/.cnpmrc"
#Or alias it in .bashrc or .zshrc
echo '\n#alias for cnpm\nalias cnpm="npm --registry=registry.npm.taobao.org \
  --cache= echo '\n#alias for cnpm\nalias cnpm="npm --registry=registry.npm.taobao.org \
  --cache=HOME/.npm/.cache/cnpm \
--disturl=http://dist.cnpmjs.org \
--userconfig=$HOME/.cnpmrc"' >> ~/.zshrc && source ~/.zshrc

2015第40周二Node学习的更多相关文章

  1. 2015第40周一Node学习

    node学习尝试 早上看了张丹大牛博客文章nodeJS学习路线图和node从零入门系列,感觉获益匪浅,尝试了里面几项内容,对node有了更深入的认识. npm npm是一个node包管理和分发工具,已 ...

  2. [学姿势]实验室搬砖+node学习

    这周开始进行收尾工作,我当然没有进行核心技术的开发,主要负责的是对web端进行展示上的修修补补,主要包括添加VLC播放器.rtsp视频流以及一些js细节. 1.VLC 全称为Video Lan Cli ...

  3. node 学习资料

    Node 学习资料: 资料名称 网址 Node.js 中文API文档 http://nodejs.cn/api/ Node 菜鸟教程 http://www.runoob.com/nodejs/node ...

  4. Node学习HTTP模块(HTTP 服务器与客户端)

    Node学习HTTP模块(HTTP 服务器与客户端) Node.js 标准库提供了 http 模块,其中封装了一个高效的 HTTP 服务器和一个简易的HTTP 客户端.http.Server 是一个基 ...

  5. node学习笔记第一天

    ES6---* JavaScript语言随着使用的人越来越多,ECMA语法规范:if/else* 为了让js语言更适应大型应用的开发.旨在消除一些怪异的行为 ### 包含内容(strict严格模式)- ...

  6. Node学习图文教程之express重写留言本案例

    写在前面 小伙伴们大家好,我是你们的pubdreamcc,接着前面的学习,这篇博文出至于我的GitHub仓库:Node学习教程资料,如果你觉得对你有帮助,欢迎star,你们的点赞是我持续更新的动力,谢 ...

  7. Node学习(二) --使用http和fs模块实现一个简单的服务器

    1.创建一个www目录,存储静态文件1.html.1.jpg. * html文件内容如下: 12345678910111213 <html lang="en">< ...

  8. node 学习笔记 - Modules 模块加载系统 (1)

    本文同步自我的个人博客:http://www.52cik.com/2015/12/11/learn-node-modules-path.html 用了这么久的 require,但却没有系统的学习过 n ...

  9. node 学习笔记 - path 处理

    本文同步自我的个人博客:http://www.52cik.com/2015/12/04/learn-node-path.html path 模块是 node 用于整理.转换.合并路径的神器,只要是路径 ...

随机推荐

  1. Java基础知识强化之集合框架笔记32:集合之可变参数的概述和使用

    1. 可变参数的概述和使用: (1)可变参数:定义方法的时候不知道该定义多少个参数(2)格式:     修饰符  返回值类型  方法名(数据类型… 变量名){   }  注意: 这里的变量其实是一个数 ...

  2. Java基础知识强化之集合框架笔记14:List集合存储字符串并遍历

    1. List集合存储学生对象并遍历: 需求:存储字符串并遍历 分析: (1)创建集合对象 (2)创建字符串对象 (3)添加字符串对象到集合中 (4)遍历集合 2. 代码示例: package cn. ...

  3. php 两个数组是否相同,并且输出全面的数据,相同的加一个字段标示

    方法一: $date是数组,数组中有字段id,name; $data1是数组,数组中有字段sort_id,name; 所以要通过$date[$i]['id']==$data1[$j]['sort_id ...

  4. React组件的生命周期各环节运作流程

    'use strict'; React.createClass({ //1.创建阶段 getDefaultProps:function(){ //在创建类的时候被调用 console.log('get ...

  5. Win10安卓模拟器Visual Studio Emulator for Android使用简介(转)

    Visual Studio Emulator for Android是微软官方发布的独立版本的安卓模拟器,这款软件可以让安卓应用开发者更加轻松的用Visual Studio编写Android应用,据说 ...

  6. 补充一下sql server(临时表)

    说明:(1).临时表其实是放在数据库tempdb里的一个用户表:(2).TempTableName必须带“#”,“#"可以是一个或者两个,以#(局部)或##(全局)开头的表,这种表在会话期间 ...

  7. 详解SQL Server 2005 Express下的事件探查器

    安装Visual Studio 2008会有附带的SQL Server 2005 Express版 我们开发一般都用那个都不单独安装SQL Server的 大家都知道express版的sql是没有 事 ...

  8. NSArray 跟 NSMutableArray 使用 区别

    NSArray 可变数组 一.NSArray是静态数组,创建后数组内容及长度不能再修改. 实例: //用arrayWithObjects初始化一个不可变的数组对象. //初始化的值之间使用逗号分开,以 ...

  9. spring-quartz普通任务与可传参任务

    两者区别与作用: 普通任务:总调度(SchedulerFactoryBean)--> 定时调度器(CronTriggerFactoryBean) --> 调度明细自定义执行方法bean(M ...

  10. Valid Phone Numbers

    Given a text file file.txt that contains list of phone numbers (one per line), write a one liner bas ...