首页 > 代码库 > 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/ 

wKioL1Pe8pLBUP0_AAB6_w6NXGc724.jpg

    运行后不会立即退出,而是一直等待,直到按下Ctrl+C。listen函数创建了事件监听器,使得Node.js不会退出事件循环。


使用supervisor--监视代码代码的改动,并自动重启Node.js,解决了开发中调试的问题。

$sudo npm install -g supervisor

wKiom1Pe8gbTyvdPAAIRkWHyLYE851.jpg



异步式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‘);

wKiom1Pe9quDLeauAABuYLE0msM768.jpg

同步读取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‘);

wKioL1Pe-MajDVn4AABzWNbZn5g310.jpg

    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