Node.js学习笔记(一)—— Node基础

欢迎转载,但请注明出处:http://blog.csdn.net/sysuzjz/article/details/43968787

Node.js扫盲

名字

Node.js有多种别称,Node,Nodejs,NodeJS。为了表示方便,文中会更频繁使用Node来表示。
为什么命名为Node呢?
一开始,创造者Ryan Dahl是称呼为web.js的,目的是构建一个web服务器。但后来项目发展越来越快,超出了单一的web服务器的想法,变成了构建网络应用的基础框架,在框架之上可以构建更多的东西,例如服务器、客户端、命令行工具等。它就像一个个节点,构成了各种网络应用,因此称为Node。

误区

作为最近最热潮的后台语言,Node频繁的进入我们的视线。但就像一直有人搞不清楚Java和JavaScript的关系一样,很多人对Node也存在很多误解。比如:
  • Node肯定是几个前端工程师在实验室里鼓捣出来的
  • 为了后端而后端,有意思吗?
  • 怎么又发明了一门新语言?
  • JavaScript承担的责任太重了
  • 直觉上,JavaScript不应该运行在后端
  • 前端工程师要逆袭了
实际上,JavaScript运行在后台并不是首例。在最开始诞生时,网景就开始尝试将它用在后端,微软也有样学样,这就是ASP中用的脚本语言。但当时JavaScript作为后端语言,性能无法与Java,PHP等相比,遂逐渐淡出众人视线。而现在,V8引擎、实时、高并发等优点让Node开始流行。

特点

异步I/O

IO是很消耗时间跟性能的,众所周知JavaScript是单线程的,如果因为IO造成阻塞,性能将大打折扣。于是异步I/O应运而生了。将IO独立于主线程之外,只在IO完成后执行回调,效果类似于ajax。例如:
var fs = require("js");
fs.readFile("/path", function(err, file) {
    console.log("读取完成");
});
console.log("发起读取");
执行的顺序依次是:开始读取文件,输出"发起读取”,读取完成,输出“读取完成”。
回调何时执行是不可知的,我们只知道执行完IO会执行回调即可。这就是典型的不关系过程只关心结果。

事件驱动

DOM事件相信每一个写过前端的人都清楚,绑定完事件之后,只要触发事件,就能执行回调函数。这种做法是很高效的,因为我们不需要空转等待,或者说,我们把空转等待交给了更底层去实现。我们可以采用以下例子来说明,这个例子一般用于处理表单提交数据
var http = require("http");
http.createServer(function(request, response) {
    var postData = "";
    request.on("data", function(trunk) {
        postData += trunk;
    })
    request.on("end", function() {
        response.end(postData);
    })
})
我们分别给request对象添加data事件和end事件,前者是因为表单提交是分多次的,每次一项。后者意味着提交结束,输出接收到的表单项。
事件驱动具有轻量级、松耦合、只关注事务点等优势。

单线程

JavaScript是单线程的,Node当然也是单线程的。在Node中,JavaScript与其他线程无法共享任何状态。单线程最大的好处是不用像多线程编程那样处处在意状态的同步问题,一般情况下也不会出现死锁,也没有线程上下文交换所带来的性能上的开销。弱电也是有的,有以下三个方面:

  • 无法利用多核CPU
  • 错误会引起整个应用退出,应用的健壮性值得考研
  • 大量计算占用CPU导致无法调用异步I/O
Node为解决这些问题采用了一个折中的办法:启用一个专门的并且完全独立的进程进行大量计算,计算完之后通过消息传递的方式传递运行结果。这就是child_process。工作思路和HTML5的Web Workers相同。

跨平台

一开始Node只能在Linux下运行,后来和微软达成一致,实现了Windows平台的兼容。现如今,绝大部分主流平台都能完美支持Node。

Node的安装和部署

windows下直接在官网下载并安装即可: 下载链接。windows下的node自带npm,可以用来安装各种模块
安装后检查node是否安装成功:
node -v
npm安装模块:以安装express为例:(-g表示全局安装)
npm install express -g

linux中,直接运行sudo apt-get install nodejs即可。

其他系统未测试,欢迎广大观众自行测试,并将结果以评论方式告知。

第一个Node程序

每一种编程语言的第一个程序都是hello world,我们这次也不要例外。
Node.js首先是JS其次才是Node,所以,我们先新建一个.js文件:server.js,在里面输入以下代码:
var http = require("http");

http.createServer(function(request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello World");
  response.end();
}).listen(8888);
第一行的require和python的import类似,都是引入新的模块,不同的是Node引入后返回一个对象。默认情况下,我们用模块名来命名模块对象,当然我们也可以换成其他名字,例如:
<pre name="code" class="javascript">var foo = require("http");

foo.createServer(function(request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello World");
  response.end();
}).listen(8888);
 
 
 这样也是没问题的,但这里还是推荐用第一种命名方法。 
创建服务器的方法是调用http模块的createServer方法,参数是一个函数,函数的参数分别为请求和响应。该方法返回结果仍然为对象,支持链式操作,后面是监听的端口号。
运行服务器时,我们先进入该js文件所在目录,运行node server.js,然后在浏览器中打开localhost:8888,我们会发现,浏览器中显示"Hello World",服务器开启成功。


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值