一直以来,我都仅仅将JavaScript视为一种前端技术,由客户端的浏览器解释并执行,这种观念在心中已经根深蒂固。直到Node.js的出现,这种观念才被彻底地击碎。通过Node.js技术,JavaScript能实现服务器端应用。带着强烈的好奇心,我决定试图了解Node.js。说干就干,在Google上搜了一圈,发现了很多关于Node.js的资料,Node.js社区非常的活跃,最后找到了《Node入门》这本书。简单浏览了下,发现这本书挺适合像我这样的Node.js新手,所以我决定仔细把这本书读完(看完大概花了10小时,看的慢)。下面就是我做的读书笔记:
1,JavaScript从诞生至今,其存在形态经历了三个阶段:一是,上世纪90年代作为对DHTML进行增强的小工具;二是,jQuery这样严格意义上的前端技术;三是,由于Node.js的出现,作为服务端技术。
2,要实现在服务器端运行JavaScript代码,代码需要先被解释然后正确的执行。Node.js的原理正是如此,它使用了Google的V8虚拟机(即:Chrome浏览器使用的JavaScript运行环境),来解释和执行JavaScript代码。
3,Node.js事实上既是一个运行时环境,同时又是一个库。
4,我们还要对此(一个实际的使用Node.js的应用)进行抽象,来寻找一种适合构建更为复杂的Node.js应用的方式。
5,使用Node.js时,我们不仅仅在实现一个应用,同时还实现了整个HTTP服务器。
6,使用JavaScript编写的一个简单的HTTP服务器原型:
// Version 1 var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Hello World"); response.end(); }).listen(8888); console.log("Server has started."); // Version 2 var http = require("http"); function onRequest(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Hello World"); response.end(); } http.createServer(onRequest).listen(8888); console.log("Server has started.");
7,在JavaScript中,一个函数可以作为另一个函数的参数进行传递。我们可以先定义一个函数,然后传递,也可以在传递参数的地方直接定义函数。
8,用Node.js构建的HTTP服务器是单进程的,但请求任何时候都可能到达,所以需要对请求进行异步处理。
9,这个就是回调(Call Back)。我们给某个方法传递一个函数,这个方法在有相应事件发生时调用这个函数进行回调。
10,构建一个简单Node.js外部模块示例:
// Server模块 var http = require("http"); function start() { function onRequest(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Hello World"); response.end(); } http.createServer(onRequest).listen(8888); console.log("Server has started."); } exports.start = start;在主文件main.js中使用Server模块:
var server = require("./server"); server.start();
11,为了让服务器将不同的请求路由到相应的代码,我们需要为路由提供请求的URL和GET及POST参数。因此,我们需要查看HTTP请求,从中提取出请求的URL以及GET/POST参数。
12,就像这样,我们传递一个东西,然后服务器利用这个东西来完成一些事情。但是,服务器其实不需要这样的东西,它只需要把事情做完就行,为了把事情做完,你根本不需要东西,你需要的是动作。
13,Node.js在不新增额外线程的情况下,依然可以对任务进行并行处理。实际上,Node.js是单线程的,它通过事件回圈(event loop)来实现并行操作。因此,我们要充分利用这一点,尽可能的避免阻塞操作,而多使用非阻塞操作。要实现非阻塞操作,我们需要使用回调函数,通过将函数作为参数传递给其它需要花时间处理的函数。
不得不说,像这样通过构建一个不太难但却是真正的实际应用,一步一步分析其所运用技术及其具体细节,最后构建出应用的方式,非常适合初学者的入门。通过《Node入门》这本书,相信你能快速的进入Node的奇妙世界。
最后,贴上《Node入门》这本书的中文网上地址和书中源码在Github上地址。
中文地址:http://www.nodebeginner.org/index-zh-cn.html
Github地址:https://github.com/ManuelKiessling/NodeBeginnerBook/tree/master/code/application
(完)