学习NodeJS第一天:node.js引言

简介: Node.JS 是资深 C 程序员 Ryan Dahl(http://four.livejournal.com/)的作品,依据 Google 著名的开源 JavaScript 引擎 V8 来进行二次开发的 Web I/O 服务器(http://nodejs.org/)。

Node.JS 是资深 C 程序员 Ryan Dahl(http://four.livejournal.com/)的作品,依据 Google 著名的开源 JavaScript 引擎 V8 来进行二次开发的 Web I/O 服务器(http://nodejs.org/)。V8 本身是非常快的 JavaScript 引擎,处理 JS 执行运行的速度非常高。相关测试表明,FireFox、Opera 和 IE 的 JS 引擎速度都不及 V8 来得快。而且,还可以说,只要浏览器之间的 JS 引擎大战一日不减,NodeJs 就可以从中受益。有竞争才有进步:)。

NodeJS 基本用法也是十分简单明了的,我们看看一下这一句,就是最简单的代码:
var sys = require('sys') ,http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.write('Hello World'); res.close(); }).listen(8006); sys.puts('Server running at http://127.0.0.1:8006/');

以上语句 var http = require('http');http.createServer(function (req, res) {…}); 就是创建一个 HTTP 服务器,侦听来自客户端的请求,匿名参数中的 req 和 res 分别代表请求对象和响应对象。NodeJS 把逻辑语句写在一个函数中,说明创建服务器 createServer() 连这一步骤都是异步的!而且除此之外,req 也有相关的异步操作:
http.createServer(function (req, res) { req.addListener("end",function(){ sys.puts("request end"); }); res.writeHead(200, {'Content-Type': 'text/plain'}); res.write('Hello World'); res.close(); }).listen(8006);

这样就对请求 req 登记了 end 的事件。在请求结束时通过 sys.puts 方法加入"request end"。在使用事件的过程中,实质也算是一个异步过程,非同步的。


从宏观层面看以上的演示,上面仅仅是一个比较底层的操作,都是低层次的控制,不足以提供更多 High Level 逻辑。要增强 NodeJS 这个平台功能,我们可以使用其他围绕 NodeJS 而开发模块,甚至是一个初具规模的“框架”,——其中一个就是 Express(http://github.com/visionmedia/express)。安装 Express 的前提是安装另一个依赖包:Kiwi(http://github.com/visionmedia/kiwi),然后键入kiwi -v install express 才可以正式安装 Express。安装好 Express 之后,立刻输入下面代码测试一下:
var sys = require("sys"), kiwi = require("kiwi"), express = kiwi.require('express'); get('/', function(){ this.redirect('/hello/world') }); get('/hello/world', function(){ return 'Hello World' }); get('/goodbye/world', function(){ return 'Goodbye World' }); run();
Express 运行的 URL 和端口是 http://localhost:3000,默认请求的规则都会被转移到 /hello/world 目录,返回 'Hello World' 的字符串。访问 /goodbye/world 目录就返回 'Goodbye World'。Express 之所以被称为一个“框架”,应该还有其他的功能在内,例如请求路由、渲染视图的其他高级功能。

Web服务器的事件编程其意义
我们知道并且十分清楚,JavaScript 是单线程的(就当前流行的 js v1.5而言),怎么避免 I/O 通道上的阻塞(block)呢?——基于事件驱动(Event-based)的编程或者或者是一种可行之道,为不少后台程序解决线程/阻塞之用。自从 Viusal Basic 流行起,基于事件驱动的编程模型在GUI之上早已为我们所熟悉,存在很长的一段时间了。若说上早期的开发,那时我们经常的一个做法,就是在main()方法写一个无限循环(while(true) loop),从而获得控制任何时刻程序的能力,亦算是一种朴素的“事件”模型。我们清楚,JavaScript天然是Function First Level的,对一个函数还可以送入一个函数的参数(即传入一个闭包closure),换言之,JS天生与事件驱动的编程是不谋而合,相得益彰的。鉴于此,Node.js的事件编程理念的确是一个亮点。

另外一点,高并发的 Web 服务器一直乃久经不衰的热点和话题,也许有很多的解决方案,性能达到一定的指标也没有问题,不过问题是,因而,在保证并满足性能达标的前提下,却很少见一个自然、适合编写业务逻辑的开发平台,以 JavaScript 为开发语言的 NodeJS 正好符合这一需求,一种符合大多数人需求的 DSL(估计 js 玩家数量可观得可以……)。例如,一个简单的计数器设计,我登录某个 url,就触发一个计数器的事件,十分自然。当然,更重要的是,还是 JS 的语言特征,即 Function、闭包、相似的 C 语法、精炼与简洁的风格等等,尤其 Function,简直为事件模型而生,轻松吻合 node.js 异步机制的理念,才是真正吸引玩家去乐此不疲的原因。


尽管 NodeJS 现在还非常的年轻,也没有久经世故,不过值得可喜的是,现在涌现了一大批围绕 NodeJS 的插件、增强包,有的是链接数据库,有的是用于 logging、Template模板、单元测试,有的还是服务于长链接下(long polling)轮询的……等等。我们可以参见 NodeJS 具体的模块列表,在http://wiki.github.com/ry/node/modules。

 

分享一个 Node.js 的专题网站,适合初学者:

http://howtonode.org/

nodejs与websocket的资源:

http://blog.new-bamboo.co.uk/2009/12/7/real-time-online-activity-monitor-example-with-node-js-and-websocket

http://blog.johngoulah.com/2010/03/nodejs-websockets-and-the-twitter-gardenhose/http://blog.andregoncalves.com/2009/12/29/Nodejs-twitter-streaming-with-html5-websockets.html

写node.js的插件(C++)

https://www.cloudkick.com/blog/2010/aug/23/writing-nodejs-native-extensions/

在win平台上跑node.js,借助虚拟机:

http://www.lazycoder.com/weblog/2010/03/18/getting-started-with-node-js-on-windows/

在win直接运行的可执行文件(已编译):

http://www.grati.org/?page_id=213 不错的node.js中文资源

目录
相关文章
|
4天前
|
JavaScript 前端开发 持续交付
【专栏】构建现代Web应用:Vue.js与Node.js的完美结合
【4月更文挑战第27天】本文探讨了Vue.js和Node.js如何结合构建现代Web应用。Vue.js作为轻量级前端框架,以其简洁易懂、组件化开发、双向数据绑定和虚拟DOM等特点受到青睐;而Node.js是高性能后端平台,具备事件驱动、非阻塞I/O、丰富生态系统和跨平台优势。两者结合实现前后端分离,高效通信,并支持热更新、持续集成、跨平台和多端适配,为开发高性能、易维护的Web应用提供强有力的支持。
|
4天前
|
存储 JavaScript 前端开发
❤Nodejs 第十四章(node中间件multer的认识安装使用)
【4月更文挑战第14天】Multer是Node.js用于处理multipart/form-data的中间件,专注于文件上传。。基本用法包括设置存储引擎,如磁盘存储(DiskStorage)或内存存储(MemoryStorage),并指定处理单个或多个文件的方法。例如,`multer.single('file')`处理单个文件上传。存储引擎DiskStorage适合永久保存,而MemoryStorage适合临时处理。可以通过`limits`选项限制文件大小,实现不同类型的文件有不同的大小限制。
14 0
|
23天前
报错/ ./node_modules/axios/lib/platform/index.js Module parse failed: Unexpected token (5:2)怎么解决?
报错/ ./node_modules/axios/lib/platform/index.js Module parse failed: Unexpected token (5:2)怎么解决?
|
2天前
|
JavaScript API 开发者
深入了解Node.js的文件系统:Node.js文件系统API的使用与探索
【4月更文挑战第30天】本文深入探讨了Node.js的文件系统API,介绍了如何引入`fs`模块进行文件操作。内容包括异步读取和写入文件、删除文件、创建目录以及使用文件流进行高效操作。此外,还提到了文件系统的监视功能,帮助开发者全面掌握在Node.js中处理文件和目录的方法。
|
2天前
|
存储 移动开发 JavaScript
学习javascript,前端知识精讲,助力你轻松掌握
学习javascript,前端知识精讲,助力你轻松掌握
|
8天前
|
Web App开发 JavaScript 前端开发
js开发:请解释什么是Node.js,以及它的应用场景。
Node.js是基于V8引擎的JavaScript运行时,用于服务器端编程。以其事件驱动、非阻塞I/O模型著称,适用于高并发和实时应用。常见用途包括:构建Web服务器、实时应用(如聊天)、API服务、微服务、工具和命令行应用,以及搭配Electron开发桌面软件。
17 1
|
9天前
|
JavaScript 前端开发 测试技术
学习JavaScript
【4月更文挑战第23天】学习JavaScript
13 1
|
17天前
|
JavaScript 前端开发 应用服务中间件
node.js之第一天学习
node.js之第一天学习
|
17天前
|
JavaScript 关系型数据库 MySQL
❤Nodejs 第二章(Node连接本地数据库)
【4月更文挑战第2天】本文介绍了如何使用Node.js连接本地MySQL数据库。首先,提到了在MySQL官网下载安装数据库和使用Navicat for MySQL进行数据库管理。接着,通过`yarn add mysql`在项目中安装数据库依赖。然后,创建`app.js`文件,设置数据库连接参数,并建立连接进行查询操作。遇到导入模块的错误后,修改导入方式为CommonJS语法。
35 1
|
20天前
|
小程序 开发工具 开发者
【微信小程序】微信开发者工具 引用 vant-weapp时“miniprogram/node_modules/@babel/runtime/index.js: 未找到npm包入口文件” 解决办法
【微信小程序】微信开发者工具 引用 vant-weapp时“miniprogram/node_modules/@babel/runtime/index.js: 未找到npm包入口文件” 解决办法
22 1