要说Node.js的历史,就不得不说说V8历史。在此之前我们先一句话描述一下什么是Node.js:Node.js是一个基于Google Chrome V8 Javascript引擎之上的平台,用以创建轻量级、快速、可扩展、事件驱动和非阻塞I/O的应用。现在我们来说说Node.js的源头——V8 javascript引擎。

V8是Google主导的一个开源项目,它是Chrome浏览器的核心。它首次公开发布是在2008年9月2日,这天也是Chrome浏览器的首个版本发布。它是浏览器性能的一次飞跃,它将浏览器技术推向了一个全新的高度。它使用C++写成,它革命性的创举是将Javascript源码预编译为机器码,而不是像以前那样将Javascript翻译为字节码,然后在运行时使用JIT动态执行代码。

2009年左右,Ryan Dahl正努力解决一个棘手的问题——让浏览器知道完成剩余的上传进度所需要的时间。受到Ruby的Mongrel webserver和刚刚发布的Chrome和V8的启发,他决定试试javascript,很快这个小想法变成了Node.js。

Node.js项目开发得到Joyent资助,这也是Ryan工作的公司。今天他仍然在这家公司工作,但在2012年1月30日他将守护者的位置转交给了Issac Schlueter。

如果你想了解更多详情关于Ryan Dahl和他如何以及为什么决定发明Node.js,点击查看他本人的相关自述视频。

一直以来,Javascript所处的浏览器环境被限制为单进程/单线程,这使得它不能同时更新DOM和执行其他业务逻辑,V8也是如此。那么,为什么还有人会想要在服务器端使用如此受限和低性能的东西?

Javascript也许不是计算能力最好的语言,但是它事件驱动的非阻塞设计,让Node.js成为一个轻量级(在RaspberryPI运行毫无压力)且性能良好的web平台,变成老的JEE Java平台、PHP和Ruby的直接竞争对象。

从开发者的角度看,Node.js社区的创新数量令人称奇,其中作为Node.js开发者必须知道的三大工具之一的NPM贡献良多,但这就是另外一个故事了。

Node.js由Ryan Dahl在2009年进行研发,它的发展和维护得到Joyent公司资助。Dahl在看到Flickr的上传文件进度条时萌发了研发Node.js的想法。由于浏览器不知道已经上传了多少文件,所以不得不向服务器发起请求查询。Dahl想到了一个更简单的方法。Ruby的Mongrel web server是Dahl的一个灵感来源。

Node.js受到其他一些模式的影响,例如Ruby On Rails的Event Machine,Python的Twisted。在这些模式基础之上,Node.js提供的事件循环(event loop)使之不再像先前那些模式一样只是一个类库,而成为一种语言。与传统使用阻塞调用的模式不同,Node.js没有循环事件所使用的调用,而是本身执行完脚本直接进入循环。这也是javascript的运行方式。

最初Dahl经历了几个失败的项目,这几个项目分别由C、Lua和Haskell写成的,但当谷歌发布V8引擎后,Dahl开始尝试Javascript。

尽管他最初的想法是非阻塞,但是他在模块系统和一些其他地方并没有遵循非阻塞,因为非阻塞导致加载外部类库时有问题。

Node.js由Dahl在2011年发布,但只能在Linux运行。npm作为Node.js的包管理工具在同年发布。

在2011年6月,微软与Joyent合作帮助开发了原生的Windows版本的Node.js。同年7月,第一个Windows版本Node.js发布。

2012年1月30日,Dahl将守护者位置让给他的同事,也是npm创始人Issac Schlueter。Dahl在Google groups中写道:

  “现在,基于libuv的重写工作已大部分完成,我将把我的守护者位置让与Issac Schlueter。在接下来的数月里,我们的精力将转移到关于第三方模块系统体验(其中包括一个查阅所有第三方模块的网站),一个新的插件构建系统,在npm增加二进制安装包。Issac将担任维系内核与外部模块关系并使之具有良好体验的角色,也是唯一具有这种维系能力的角色。经过三年对Node的开发,这使我可以空出来做一些项目研究工作。我仍然为Joyent工作,并从旁提供建议,但我不再进行日复一日的Bug修复工作。Issac具有让Node发布新版本的话语权。他将直接负责新特性诉求、更改和bug修复。”

2014年1月15日,Schlueter宣布他将把npm作为他的工作重心,Timothy J Fontaine将成为项目负责人。Issac在Node.js博客中写道:
  “经过去年一年,TJ Fontaine已经变成Node.js项目的绝对核心。他一直从事构建新版本,管理测试工作,修复烦人的bug,始终关注使用者的需求并作出最后决定。……任何接触到项目的核心工作的人都知道他已经作为事实上负责项目有一段时间了,因此我们决定将它变成正式的。这个决定即时生效,TJ Fontaine成为Node.js项目负责人。我将仍是Node.js的核心开发者,并期待继续以这个角色为项目作出自己的贡献。无论如何,我工作重心将是npm。” 第二天,2014年1月16日,Timothy J Fontaine回帖简要说明了以后的发展道路,还有bug修复,性能平衡,与V8引擎保持同步更新以及工具。

Ref:

NODE.JS AND V8 HISTORY

Wiki Node.js

[NodeJS] Node.js 与 V8 的故事的更多相关文章

  1. Node.js timer的优化故事

    前几天nodejs发布了新版本4.0,其中涉及到一个更新比较多的模块,那就是下面要介绍的timer模块. timers: Improved timer performance from porting ...

  2. [NodeJS] Node.js 编码转换

    Node.js 自带的 toString() 方法不支持 gbk,因此中文转换的时候需要加载第三方库,推荐以下两个编码转换库,iconv-lite 和 encoding. iconv, iconv-l ...

  3. [Node.js] require背后的故事

    前言 熟悉Node.js的肯定对下面的代码熟悉 var http = require('http'); 这段代码很好理解,就是加载一个http模块.但是你有没有想过为什么要这么写?这其中的缘由是什么呢 ...

  4. 准备:新V8即将到来,Node.js的性能正在改变

    V8的Turbofan的性能特点将如何对我们优化的方式产生影响 审阅:来自V8团队的Franziska Hinkelmann和Benedikt Meurer. **更新:Node.js 8.3.0已经 ...

  5. Node.js学习系列1

    概述 最近在刷javascript的技能,觉着nodejs是个不错的入口,作为一个.Net平台的前端工程师学习使用js开发服务端,想想都有点小激动哈哈^_^^_^. 入门 之前开发过ionic,所以对 ...

  6. 编写Node.js原生扩展

    Node.js是一个强大的平台,理想状态下一切都都可以用javascript写成.然而,你可能还会用到许多遗留的库和系统,这样的话使用c++编写Node.JS扩展会是一个不错的注意. 以下所有例子的源 ...

  7. Node.js v7.4.0 Documentation Addons

    https://nodejs.org/docs/latest/api/addons.html Node.js Addons are dynamically-linked shared objects, ...

  8. 了解 node.js

    原文为: 我们为什么要使用NodeJS 写的好,就收藏于此,供学习之用. 科普文一则,说说我对NodeJS(一种服务端JavaScript实现)的一些认识,以及我为什么会向后端工程师推荐NodeJS. ...

  9. Node.js event loop 和 JS 浏览器环境下的事件循环的区别

    Node.js  event loop 和 JS 浏览器环境下的事件循环的区别: 1.线程与进程: JS 是单线程执行的,指的是一个进程里只有一个主线程,那到底什么是线程?什么是进程? 进程是 CPU ...

随机推荐

  1. Linux 文件编码格式转换

    如果需要在Linux 中操作windows下的文件,那么经常遇到文件编码转换的问题. Windows中默认的文件格式是GBK(gb2312),而Linux一般都是UTF-. 查看文件编码 在vim 中 ...

  2. mac下配置android环境变量

    下面我将一下mac环境下的配置步骤: 1.在本地目录(home directory)中创建文件.bash_profile2.在文件中写入以下内容:export PATH=${PATH}:/Users/ ...

  3. 【转】【VS Code】配置文件Launch及快捷键

     Ctrl+shift+p,然后输入launch,点击第一个选项即可配置. 之后选择More即可 具体配置可修改为: { "version": "0.2.0", ...

  4. (笔记)Mysql命令rename:修改表名

    rename命令用于修改表名. rename命令格式:rename table 原表名 to 新表名; 例如,在表MyClass名字更改为YouClass:    mysql> rename t ...

  5. TPshop隐藏index.php

    有些朋友提到关于TPshop 隐藏index.php 一问题, 可以修改 Application\Common\Conf\config.php 文件代码 'common', 'AUTH_CODE' = ...

  6. 监听输入框值变化的最佳方案 oninput 和 onpropertychange (实时监控文本框改变的最佳方案)

    公司有个文本框,当输入文字/粘贴/复制 或者是键盘猛按的时候,都希望这个文本框能统计出 输入了多少字   这种用 onchange   onkeyup  onkepress  都不怎么好使   最后在 ...

  7. 使用Spring.NET的IoC容器

    使用Spring.NET的IoC容器 0. 辅助类库 using System; using System.Collections.Generic; using System.Linq; using ...

  8. C# 批量生成邮箱地址代码

    如图,是我生成好的5万条邮箱数据, 其实,网上有大量批量生成邮箱的软件,多种多样的生成格式,各种设置,各种组合, 我不需要那么强大,只需要生成不重复的邮箱地址即可,所以,我懒得从网上下载了, 反正就几 ...

  9. 超酷 CSS3/HTML5 3D 飘带菜单实现教程

    今天我们来介绍一款很有创意的CSS3/HTML5菜单,首先菜单是飘带形状的,看起来很优雅,这种菜单在个人博客中用的比较多,不仅干净利落,而且很具有个性化.另外,这款菜单在鼠标滑过菜单项时,将会出现3D ...

  10. layui框架遇到时间控件在搜索之后再次点击出现异常的问题

    原因:使用jquery赋值html代码问题 解决方法:使用js代码处理即可,如: document.getElementsByTagName('tbody')[0].innerHTML = 自己的ht ...