从我大一接触第一门编程语言C开始,到现在工作三年陆续接触到了C、汇编、C++、C#、Java、JavaScript、PHP,还有一些HTML、CSS神马的,从来没有一门语言让我像对node.js一样的着迷。接触nodejs在我之前博客提到过在搞web socket在选择服务器的时候很多人推荐nodejs版的,无奈当时对nodejs没有任何概念,所以没看懂人家写的代码,但是感觉很熟悉,网上基本是以在服务器端运行的javascript来解释什么是nodejs,这就让我更疑惑了,javascript怎么可能做socket服务器,在用C#写出服务器后回头看了一下node.js,十分钟之后我就被完全吸引住了。

补记:由于写博客是对nodejs处于了解语法阶段,很多问题没有说清楚,点反对的人不少,关于一些原理性东西可以看看关于node.js的误会

什么是node.js

到底什么是node.js呢?看看官网对nodejs的描述:

Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.

我们可以对此总结出几点

  1. node.js是一个构建在Chrome JavaScript运行环境的平台,这是很重要的一点,node.js并不是一门语言,而是一个平台
  2. node.js致力于使构建速度快、稳定的网络程序更简单
  3. node.js具有事件驱动和非阻塞I/O的特色,使之轻量级并且高效率
  4. node.js非常适合在分布式设备运行数据密集型实时应用程序

服务器端运行的JavaScript?

Chrome JavaScript runtime也就是我们常说的 Chrome的V8 JavaScript Engine,也就是Goole开发的一个用于Chrome浏览器的底层JavaScript引擎,用于解析JavaScript语句创建其运行环境,保证我们写的语句在浏览器上的表现和我们预期的一致。

那么为什么说node.js是服务器端运行的JavaScript?好好地nodejs干嘛要和V8扯上关系?除了Google搞的V8解释JavaScript十分的快,十分重要的一个原因是V8 JavaScript 引擎并不仅限于在浏览器中运行,可以嵌入任何应用程序中运行。Node.js 和.net framework类似是一个平台(这里有些搞不明白,望大神们指点一二),但它没有像.net一样创造了一门语言——C#在这个平台上运行,而是很巧妙的借用了web开发人员已经非常熟悉的JavaScript语法,使用V8引擎来解析语句,并将其重建可在服务器上使用。所以严格上说node.js并不是服务器端运行的Javascript,而是可以在服务器端运行JavaScript语法的平台。

为什么要用node.js

搞了半天就是一个新瓶装旧酒的东西,看起来除了一个新鲜的可以使用JavaScript语法,node.js没什么长处,为什么要用它而不是同样可以在服务器端运行的Java或C#呢?这要从node.js事件驱动和非阻塞I/O的特色谈起。关于事件驱动熟悉JavaScript的同学应该很熟悉了,node.js采用一系列“非阻塞”库来支持事件循环的方式。本质上就是为文件系统、数据库之类的资源提供接口,比如一个数据库访问,采用事件机制,发起请求之后,立即将进程交出,当数据返回后触发事件,再继续处理数据。

在传统的阻塞I/O中其运行过程是这样的

int num=query('select * from ......');

print(num);

...................//无关语句

print方法必须等待query方法返回结果,如果数据库出现网络连接故障,那么print方法就要等到超时才能执行,然后后面一些无关语句才能一次执行,而在非阻塞I/O中是这样的

query('select * from...',callback(data){
.............//相关语句
print();
}); ..............//无关语句

跟我们使用ajax,在回调函数中处理结果,但是不影响下面语句执行。 怪不得node.js要借用JavaScript来做此事,JavaScript的几个特性使它很胜任这项工作

  1. 事件机制
  2. 函数式编程,支持匿名函数,函数参数
Node.js中代码是单进程、单线程执行的(我们写的代码是,但node.js本身不是有兴趣同学可以看看这个进一步了解),使用事件轮询机制和非阻塞I/O,在不新增额外线程的情况下对任务进行并行处理 。node.js解决了阻塞式编程浪费大量进程资源只是在等待,导致的大量内存和cpu的浪费问题,所以才敢宣称自己perfect for数据密集型的实时web 应用程序。

如何安装

nodejs的安装还是很简单的,尤其是现在安装包都把npm集成了进去,不用单独安装了,下载下安装包运行就可以了,另外想完整使用nodejs的话需要有C语言的编译环境、git和python,使用window的同学很能会稍微麻烦一些,需要搞定这些。对命令行情有独钟的同学可以看看How to Install Node.js

npm是什么

npm是node packaged modules的缩写,其实是一个nodejs的module的管理工具

什么是module

所谓module和java中的包的概念很类似,一些解决方案的集合,官方会提供核心的几个,第三方的很多

如何安装第三方module

因为nodejs的社区很活跃,有很多好用的第三方的包,我们可以在终端中使用npm的命令安装

  • npm install [-g] <name>:使用install指令可以把nodule下载安装的nodejs的全局的path处,不加的话会安装到当前路径
  • npm remove <name>:移除module
  • npm update <name>:更新 module

还有一些常用命令可以看看npm常用命令

第一个demo

这些都搞定后我们就可以写传说中的hello world了。在任意目录建一个test.js文件

console.log('Hello, World!');

简单的一句话就可以,然后使用node命令运行

这这这。。。太没技术含量了,看看官方给的demo,使用nodejs创建一个web server有多简单

var http=require('http');//引入http module
2 http.createServer(function(request,response){//创建一个web server
3 //回调函数,这样创建server方法就不会阻塞了
4 response.writeHead(200,{'contentType':'text/plain'});
5 response.end('Hello World!\n');
6 }).listen(8124);
7 console.log('Server running at http://127.0.0.1:8124/');

先运行一下服务器,按两次Ctrl+C退出

使用浏览器访问一下

就这么简单

如何学习

看到上面的demo是不是也对nodejs产生兴趣了呢,可是像我这样的懒人接触一门新语言的时候不知道该如何下手,难道又要去做个无聊的购物车神马的嘛,学习nodejs不用,nodejs为我们提供了一个小游戏一样的教程,就像个寻宝过程从零开始,没步都有一个任务和一下提示让你走的更远,上nodeschool下载然后开始寻宝吧,我就是被这小游戏迷住了,顺便秀一下我一天的战绩,每个任务都完成了

看看解释就知道怎么做了,不过建议最开始run和verify结合使用,verify告诉你执行结果和预期结果,run会告诉你有哪些错误

当然除了这些小游戏帮我们熟悉nodejs语法及使用,一些优秀的社区也可以帮我们很多

CNode

开源中国

常见问题

让我欲罢不能的node.js的更多相关文章

  1. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  2. 利用Node.js的Net模块实现一个命令行多人聊天室

    1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...

  3. Node.js:进程、子进程与cluster多核处理模块

    1.process对象 process对象就是处理与进程相关信息的全局对象,不需要require引用,且是EventEmitter的实例. 获取进程信息 process对象提供了很多的API来获取当前 ...

  4. Node.js:理解stream

    Stream在node.js中是一个抽象的接口,基于EventEmitter,也是一种Buffer的高级封装,用来处理流数据.流模块便是提供各种API让我们可以很简单的使用Stream. 流分为四种类 ...

  5. Node.js:Buffer浅谈

    Javascript在客户端对于unicode编码的数据操作支持非常友好,但是对二进制数据的处理就不尽人意.Node.js为了能够处理二进制数据或非unicode编码的数据,便设计了Buffer类,该 ...

  6. node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法

    1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...

  7. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

  8. Node.js入门(一)

    一.Node.js本质上是js的运行环境. 二.可以解析js代码(没有浏览器安全级的限制): 提供系统级的API:1.文件的读写 2.进程的管理 3.网络通信 三.可以关注的四个网站: 1.https ...

  9. Node.js学习笔记——Node.js开发Web后台服务

    一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.j ...

随机推荐

  1. 判断AngularJS渲染页面完成

    $scope.$on('$viewContentLoaded', function(){ }); // 或者 $scope.$watch('$viewContentLoaded', function( ...

  2. Server.mappath用法

    1.Server.MapPath ("/") 应用程序根目录所在的位置 如 C:\qq\qqroot\ 2.Server.MapPath ("./") 表示所在 ...

  3. C#语言基础— 输入与输出

    C#语言基础— 输入与输出 1.1函数的四要素:名称.输入.输出.加工 1.2主函数:输出语句.输入语句: Static viod Main(string[] stgs)//下划线部分可以自己指定 { ...

  4. HTML5所有标签汇总

    来自lampbrother兄弟连HTML5与CSS3教程.<xmp> 结构标签:(块状元素) 有意义的div<article>     标记定义一篇文章<header&g ...

  5. Ajax参数详解

    1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如 ...

  6. 【计算几何】bzoj1043 [HAOI2008]下落的圆盘

    n^2枚举圆盘,用两圆圆心的向量的极角+余弦定理求某个圆覆盖了该圆的哪一段区间(用弧度表示),最后求个区间并. 注意--精度--最好再累计区间的时候,把每个区间的长度减去EPS,防止最后覆盖的总区间超 ...

  7. isee - 创建项目 - 1

    1.在本地web目录下创建一个新项目 D:\web> composer create-project laravel/laravel isee --prefer-dist 2.在vhosts.c ...

  8. 关于webapp的一点思考

    早上上班路上碰到发传单推广app的小MM被上司训斥,忽然想起一个问题,现在的nativeapp推广成本到底多高?能不能用浏览器访问app的方式降低这个成本. 现在很多app采用壳+web内容的方式,但 ...

  9. 【转】IE劫持原理 BHO

    为什么"浏览器劫持"能够如此猖狂呢?放眼众多论坛的求助贴,我们不时可以看到诸如"我的IE被主页被改了,我用杀毒工具扫了一遍都没发现病毒,我把主页改回自己的地址,可是一重启 ...

  10. Python学习之路-Day2

    数据类型常用操作 不管是查整数还是查布尔或者是列表...要记住 dir(int)   查看某个类型的功能 help(int) 查看该类型的功能及文档说明 type(4)   查看某个字符或数字的类型- ...