首页 > 代码库 > Nodejs学习
Nodejs学习
JavaScript入门教程:http://www.w3school.com.cn/js/
深入学习推荐阅读Mozilla JavaScript:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide
Node是一个可以让JavaScript运行在服务器端或者说运行在浏览器之外的平台。Node.js中所谓的JavaScript只是Core JavaScript,Node.js不运行在浏览器中,所以不存在JavaScript的浏览器兼容性问题,可以放心地使用JavaScript语言的所有特性。Node.js的JavaScript引擎是V8。Node.js是一个实时Web(Real-time Web)应用开发平台,充分考虑了在实时响应、超大规模数据要求下架构的可扩展性。它不同于传统平台依靠多线程来实现高并发的设计思路,而采用了单线程、异步I/O、事件驱动的程序设计模型。这些特性不仅带来了巨大的性能提升,还减少了多线程程序设计的复杂性,提高了开发效率。
Node.js可以作为服务器向用户提供服务,与PHP、Python、Ruby on Rails相比,它跳过了Apache、Nginx等HTTP服务器,直接面向前端开发。
使用Nodejs可以轻松开发:
具有复杂逻辑的网站;
给予社交网络的大规模Web应用;
Web Socket服务器;
TCP/UDP套接字应用程序;
命令行工具;
交互式终端程序;
带有图形用户界面的本地应用程序;
单元测试工具;
客户端JavaScript编译器;
Node.js内建HTTP服务器支持,这个服务器不仅可以用来调试代码,而且本身就可以部署到产品环境,可以轻易地实现一个网站和服务器的组合。
nodejs编译安装
$ node --help
Usage: node [options] [ -e script | script.js ] [arguments]
node debug script.js [arguments]
Options:
-v, --version print node‘s version
-e, --eval script evaluate script
-p, --print evaluate script and print result
-i, --interactive always enter the REPL even if stdin
does not appear to be a terminal
--no-deprecation silence deprecation warnings
--trace-deprecation show stack traces on deprecations
--v8-options print v8 command line options
--max-stack-size=val set max v8 stack size (bytes)
Environment variables:
NODE_PATH ‘:‘-separated list of directories
prefixed to the module search path.
NODE_MODULE_CONTEXTS Set to 1 to load modules in their own
global contexts.
NODE_DISABLE_COLORS Set to 1 to disable colors in the REPL
Documentation can be found at http://nodejs.org/
使用
$node script.js
$node -e "console.log(‘Hello world‘);" //要执行的语句作为node -e 的参数直接执行
node的REPL(Read-eval-print-loop)模式:输入-求值-输出-循环
REPL在应用开发时可以测试一个包能否正常使用,单独调用应用的某一个模块,执行简单计算等,带来很大便利。
$node //启动一个交互式shell
>
建立HTTP服务器
建立一个名为example.js的文件,内容为:
1 var http = require(‘http‘) 2 http.createServer(function(req, res) { 3 res.writeHead(200, {‘Content-Type‘: ‘Text/html‘}); 4 res.write(‘<h1>Node.js</h1>‘); 5 res.end(‘<p>Hello World!</p>‘); 6 }).listen(8124, "127.0.0.1"); 7 console.log(‘Server running at http://127.0.0.1:8124‘);
运行$node example.js,打开浏览器访问http://127.0.0.1:8124/
运行后不会立即退出,而是一直等待,直到按下Ctrl+C。listen函数创建了事件监听器,使得Node.js不会退出事件循环。
使用supervisor--监视代码代码的改动,并自动重启Node.js,解决了开发中调试的问题。
$sudo npm install -g supervisor
异步式I/O与事件驱动--Node.js最大特点,其异步机制是基于事件的,通过回调函数实现。
Nodejs使用单线程模型,对于所有I/O采用异步式的请求方式,避免频繁的上下文切换。Nodejs在执行过程中维护一个事件队列,程序在执行时进入事件循环等待下一个事件的到来,每个异步式I/O请求完成后会被推送到事件队列,等待程序进行处理。
网络通信、数据库查询-->事件循环<--客户端请求、磁盘I/O
单线程事件驱动的异步式I/O(非阻塞模式):减少了多线程的开销,但是依然保证CPU高利用率和高吞吐量。
异步读取文件readfile.js:
1 var fs = require(‘fs‘); 2 3 function callback(err, data) { 4 if(err) { 5 console.log(err); 6 } else { 7 console.log(data); 8 } 9 } 10 fs.readFile(‘file.txt‘, ‘utf-8‘, callback); 11 12 console.log(‘end.\n‘);
同步读取readfilesync.js:
1 var fs = require(‘fs‘); 2 var data = fs.readFileSync(‘file.txt‘, ‘utf-8‘); 3 console.log(data); 4 console.log(‘end.\n‘);
fs.readFile调用时只是将异步式I/O请求发给操作系统,然后立即返回执行后面的语句,执行完之后进入事件循环监听事件。当fs接收到I/O请求完成的事件时,事件循环主动调用回调函数完成后续工作。
Node.js中,并不是所有的API都提供同步和异步版本。Node.js不鼓励使用同步I/O.
事件
Node.js程序由事件循环开始,到事件循环结束,所有的逻辑都是事件的回调函数。
事件由EventEmitter对象提供,event对象注册事件some_event监听器,通过setTimeout在1000ms之后向event对象发送事件some_event,此时调用some_event监听器。
event.js
1 var EventEmitter = require(‘events‘).EventEmitter; 2 var event = new EventEmitter(); 3 event.on(‘some_event‘, function() { 4 console.log(‘Some event occured.‘); 5 }); 6 setTimeout(function() { 7 event.emit(‘some_event‘); 8 }, 1000);结果:
$ node event.js
Some event occured.
本文出自 “飒飒秋风” 博客,请务必保留此出处http://xjhznick.blog.51cto.com/3608584/1535179