对于Nodejs,相信客官并不陌生,网上却已众说纷纭,有人说是一个平台,有人说是服务器JavaScript,有人说一个框架…

之前亦有过研究,多怀可远观而不可亵玩也。高效率,I/O操作,异步编程,以及高并发处理!!

于是乎,怀着这份忐忑与景仰yu好奇,之前有自学过一段时间,这些日子公司项目完测,遂整理了一些Nodejs学习笔记,这里纯属分享下自己的笔记(说不定以后还能奉承宝典咧,想想都有点鸡冻)也有从别处借鉴过来的知识,若有雷同,不胜荣幸,供客官参考,如有不足多多指教

推荐读书 朴灵《深入浅出nodeJs

推荐文章Darren_聂微东《node.js 初体验》

ok,不废话,手记摊开

旨在提供一种简单的构建可伸缩网络程序的方法

这是Nodejs官方的宣言

哈哈哈,这逼装的我要给103分,不解释

Node.js是啥?

Nodejs 不是一种独立的语言

Nodejs 是一个让JavaScript运行在服务端的开发的平台

服务器端的JavaScript
  允许开发人员使用JavaScript语言写服务器端代码的框架(其实Nodejs是对Commonjs规范的一种很好的实现)

其本身利用Google V8
JavaScript引擎,所以速度和性能非常好,而且Nodejs又对其进行了封装,同时还改进了其处理二进制数据的能力(Nodejs对引入过的模块都会进行缓存,且核心模块的缓存检查先于文件模块的缓存检查)
  Nodejs不是一个web服务器,只是计算机上执行代码的另一种方式,它是一个简单的JavaScript Runtime.

js是由客户端而产生,Nodejs为网络而生

Node能做什么?

具有复杂逻辑的网站

局域社交网站的大web的应用

Web Scoket服务器

TCP/UDP套接字应用程序

  命令行工具

交互式终端程序

这有啥拽的,从技术上说就是各种的封装,并没有新大陆呀??!!!!我大微软C#也能解决,给你个.Net自己体会去吧,后面跟着C/C++,路过…

说到这点,这儿有一位,绝壁的狠狠的喷了一把, SolidMango 《NODE.JS之我见

总之,各执其词,不好定论,正如SolidMango所说,坚守己见,不要盲从,看自己怎么理解吧。

 

Node的优点

1. 它是一个JavaScript运行环境 (Nodejs采用C++语言编写而成)
2. 依赖于浏览器V8引擎进行代码解释

3. 事件驱动

4. 非阻塞

5. 异步I/O

6. 轻量、可伸缩,适于实时数据交互应用

7. 单进程,单线程

Node.Js最大特性是采用异步式I/O与事件驱动的架构设计。对于高并发的解决方案,传统的架构是多线程模型,也就是每个业务逻辑提供一个系统线程,通过系统线程切换来弥补同步式I/O调用时的时间开销.

Node.Js采用的是单线程模型,在执行过程中会维护一个事件队列,程序在执行时在进入事件循环等待下一个事件的到来。

累了,困了,来个小demo缓解一下----

ps 我学习是在windows上开发,当然*nix会更好

Nodejs安装。。。。此处略去n千字…

验证是否安装成功:运行cmd,输入  node –v

顺带着把版本(v6.2.0)也检查了一下,哈哈哈… 好好鸡贼了一把

我用Visual Studio Code开发Nodejs,当然也有蛮多不错的的IDE:webstorm,notepad++ ,sublime,Eclipse等等

1、新建hello.js,里面写入

console.log(' Hello World ');

保存格式utf-8。存放在d:\NodeJs\demo\hello.js

2、运行cmd命令

cmd ——》 D:  ——》cd nodejs  ——》cd demo ——》node hello.js

还有另外一种方式

1. 运行cmd,输入node,回车 进入Nodejs的编译模式

Console.log(‘Hello World’);

2. 输出结果:

第一行是结果

第二行是返回值

ok,再来提升一下逼格

Nodejs较牛逼地方,就是对Http的封装 (Nodejs其底层已经是封装好的服务器)

创建hello.js文件,里面写入

  1.  var http = require('http');
  2.   http.createServer(function (req, res) {
  3.    res.writeHead(200, {'Content-Type': 'text/plain'});
  4.    res.end('Hello World');
  5.   }).listen(1337, "127.0.0.1");
  6.   console.log('Server is running at http://127.0.0.1:1337/');

代码分析:

a. 全局方法require()是用来导入模块的,一般直接把 require() 方法的返回值赋值给一个变量,可直接使用此变量。require("http") 就是加载系统预置的 http 模块

   b. http.createServer 是模块的方法,目的就是创建并返回一个新的web server对象,并且给服务绑定一个回调,用以处理请求。

   c. 通过 http.listen() 方法就可以让该 HTTP 服务器在特定端口监听。

浏览器运行结果如下:

      当一个request到来时,EventLoop会将这个Listener回调函数放入执行队列, Nodejs中所有的代码都是一个一个从执行队列中拿出来执行的。

    这些执行都是在工作线程上(Event Loop本身可以认为在一个独立的线程中,我们一般不提这个线程,而将Nodejs称呼为一个单线程的执行环境),

     所有的回调都是在一个工作线程上运行。

EventLoop 指的是计算机系统的一种运行机制。简单的说就是,在程序中设置两个线程:一个是负责程序本身的运行,称为“主线程”;另一个负责主线程与其他进程(主要是I/O操作)的通信。 也可以叫 “消息线程”

开发Nodejs程序,调试的时候,无论修改了那一部分代码,都需要重启服务才能生效,这是因为Nodejs只有在第一次引用到某部分的时候才会去解析脚本,以后都会直接访问内存,避免重复载入

缺点:提高了效率,却不利于程序调试

解决方案:supervisor ,会监视对代码的改动,并自动重启Node.js

安装supervisor:用npm安装,输入命令符 npm -g install supervisor

ps:必须安装到全局,否则错误命令也会提示安装到全局

or:修改全局路径到当前路径 npm config set prefix "路径"

supervisor server.js     //开始监视server.js

但是如果出错,会不停的刷cmd,以及网页间断性报错

Node.Js的异步式IO与事件式编程

Node.js最大的特性就是异步式I/O与事件紧密结合的编程模式。这种模式与传统的同步式IO线性的编程思路有很大的不同,因为控制流很大程度上要靠事件和回调函数来组织,一个逻辑要拆分为若干个单元格。

内容:阻塞和线程

1. 同步式I/O或阻塞式I/O

线程在执行中如果遇到磁盘读写或网络通信,通常要耗费较长时间。这时操作系统会剥夺这个线程的CPU控制权,使其暂停执行,同时将资源让给其他的工作线程,这种线程调度方式成为阻塞,当I/O操作完毕时,操作系统将这个线程的阻塞状态解除,恢复其对CPU的控制权、令其继续执行。

2. 异步式I/O或非阻塞式I/O

针对所有I/O操作不采用阻塞策略,当线程遇到I/O操作时,不会以阻塞的方式等待I/O操作的完成或数据的返回,而只是将I/O请求发送给操作系统,继续执行下一条语句,当操作系统完成I/O操作时,以事件的形式通知执行I/O操作的线程,线程会在特定时候处理这个事件,为了处理异步I/O,线程必须有事件循环,不断的检查有没有未处理的事件,依次予以处理。

3. 非阻塞与阻塞模式区别

非阻塞模式下,一个线程永远在执行计算操作,这个线程所使用的CPU核心利用率永远是100%,IO以事件的方式通知。

阻塞模式下,多线程往往能提高系统吞吐量,因为一个线程阻塞还有其他线程在工作,多线程可以让CPU资源不被阻塞中的线程浪费。

调度:当前一个工作,在5分钟之后执行

4. 同步式IO与异步式IO区别

同步式IO(阻塞式)

异步式IO(非阻塞)

利用多线程提供吞吐量

单线程即可实现高吞吐量

通过事件片分割和线程调度利用多核CPU

通过功能划分利用多核

需要由操作系统调度多线程使用多核CPU

可以将单线程绑定到单核CPU

难以充分利用CPU资源

可以充分利用CPU资源

内存轨迹大,数据局部性弱

内存轨迹小,数据局部性强

符合线性的编程思维

不符合传统编程思维

  异步式  少了多线程的开销 不符合传统编程思维

  同步式  会执行内存换页,cpu的缓存会被清空,重新读取内存

Node.js的事件循环机制

(1) Node.js在什么时候进入事件循环呢?

Node.js程序是由事件循环开始,到事件循环结束,所有的逻辑都是事件的回调函数。

(2) 如何使用自定义事件呢?

事件的回调函数在执行的过程中,可能会发出IO请求或直接发射(emit)事件,执行完毕后再返回事件循环。

模块(Module)和包(Package)

  1. 模块

    不同的功能组件,划分为不同的模块

  模块的定义十分简单,接口也十分简单。它的意义就是将类聚的方法或变量限定在私有的作用域中,同时支持引入和导出功能以便顺畅的链接上下游依赖

例如:

var http = require('http')   // 其中http是Node.js的一个核心模块,通过require函数获取这个模块,然后使用其中的对象

        Node.js提供了exports和require两个对象,其中exports是模块公开的接口,require用于从外部获取一个模块的接口,即获取模块的exports对象

  通常使用module.exports,因为在exports对象是用过形参的方式传入的,直接赋值形参会改变形参的引用,单并不能改变作用域外的值

2、包

        包是在模块基础上更深一步的抽象,Node.js的包类似于C/C++的函数库或者java的类库,它讲某个独立的功能封装起来,用于发布、更新、依赖管理的版本控制。开发了npm来解决包的发布和获取需求

  我们使用这种方法可以把文件夹封装成一个模块,即所谓的包。包通常是一些模块的集合,在模块的基础上提供了更高层的抽象,相当于提供了一些固定接口的函数库,通过定制package.json,我们可以创建更复杂、更完善、更符合规范的包用于发布。

文件操作

  Nodejs 中的 fs 模块用来对本地文件进行操作。文件的I/O是由标准POSIX函数封装而成。需要使用require('fs')访问这个模块。所有的方法都提供了异步和同步两种方式。

   fs 模块中提供的方法可以用来执行基本的文件操作,包括读、写、重命名、移动、创建和删除目录以及获取文件元数据等。每个操作文件的方法都有同步和异步两个版本。

   异步操作的版本都会使用一个回调方法作为最后一个参数。当操作完成的时候,该回调方法会被调用。而回调方法的第一个参数总是保留为操作时可能出现的异常。如果操作正确成功,则第一个参数的值是 null 或 undefined

  1. var fs = require('fs');
  2. 1.1. 读取文件
  3. var fs = require('fs');
  4. 1.1.1 fs.readFile(filename,[encoding],[callback(error,data)])
  5. fs.readFile('book.txt', 'utf-8', (err, data) => {
  6. if (err) {
  7. throw err;
  8. }
  9. console.log(data);
  10.  
  11. 1.1.2 fs.readFileSync(filename,[encoding])
  12. try {
  13. var data = fs.readFileSync('book.txt', 'utf-8');
  14. console.log(data);
  15. } catch (e) {
  16. throw e; //文件不存在,或者权限错误
  17. }
  18.  
  19. 1.1.3 fs.createReadStream(filename,[options])
  20. var stream = fs.createReadStream('book.txt');
  21. var data = '';
  22. stream.on('data', (trunk) => {
  23. data += trunk;
  24. });
  25. stream.on('end', () => {
  26. console.log(data);
  27. });
  28.  
  29. 1.1.4 readLine
  30. var readline = require('readline');
  31. var fs = require('fs');
  32. var rl = readline.createInterface({
  33. input: fs.createReadStream('book.txt')
  34. });
  35. rl.on('line', (line) => {
  36. console.log('Line from file:' + line);
  37. })
  38.  
  39. 1.2、文件写入
  40. 1.2.1 fs.writeFile(filename, [callback(error)]) //如果文件不存在,会自动创建
  41. fs.writeFile('name.txt', 'I am the man', (error) => {
  42. if(error){
  43. console.log(error);
  44. }
  45. })
  46.  
  47. 1.2.2fs.writeFileSync(file,[data])
  48. try {
  49. fs.writeFileSync('timer.txt', 'JesseFu is the best');
  50. } catch (e) {
  51. console.log(e);
  52. }
  53.  
  54. 1.2.3fs.createWriteStream(path[,option])
  55. var streamWrite = fs.createWriteStream('fuguoliang.txt');
  56. streamWrite.write('fuguoliang\r\n', (error) => {
  57. console.log(error);
  58. });
  59.  
  60. 1.2.4fs.appendFile(file,data[,options],callback(err)) //追加文本
  61. setInterval(() => {
  62. fs.appendFile('fuguoliang.txt', '\r\n ----Jesse ' + new Date().getSeconds());
  63. }, 1000)
  64.  
  65. 1.2.5fs.appendFileSync(file,data[,options])
  66. setInterval(() => {
  67. fs.appendFileSync('fuguoliang.txt', '\r\n ----what the hell... ' + new Date().getSeconds())
  68. }, 1000)
  69.  
  70. 验证路径是否存在
  71. fs.exists(path,callback(isexists))
  72. fs.existsSync(path) //返回true 或 false
  73.  
  74. 获取文件信息
  75. fs.stat(path,callback(err,stats))
  76. fs.statSync(path) //返回一个fs.stat实例
  77.  
  78. 移动文件 移动/重命名
  79. fs.rename(oldpath,newpath,callback);
  80. fs.renameSync(oldpath,newpath)
  81.  
  82. 删除文件 永久删除/
  83. fs.unlink(path,callback(err));
  84. fs.unlinkSync(path);
  85.  
  86. 创建一个目录 (重名会报错)
  87. fs.mkdir(path[,model],callback)
  88. fs.mkdirSync(path[,model]);
  89.  
  90. 删除一个空目录
  91. fs.rmdir(path,callback);
  92. fs.remdirSync(path);
  93.  
  94. 读取一个目录 以数组形式展现
  95. fs.readdir(path,callback(err,files))
  96. fs.readdirSync(path); //返回files

不容易啊,客官能坚持看完,看来阁下也是性情中人啊。不过在这儿啰嗦了半天,也只能简单了解,至于要更好的玩转Nodejs还需要更多的学习交流。

言有尽而意无穷,于此,结束Nodejs的初次见面,印象不错哦,客官有没有触到G点我不知道,我是会一直做下去

专业,因为专注

希望我的这篇笔记能够对客官有帮助,不胜荣幸,有好东西要分享一下喽,多多指教 [抱拳]

推荐几个学习Nodejs的网址:
  http://nodejs.org/   

http://cnodejs.org/  

http://www.oschina.net/p/nodejs/  

  http://www.ibm.com/developerworks/cn/opensource/os-nodejs/index.html

Nodejs --我自己的学习笔记的更多相关文章

  1. nodejs的socket.io学习笔记

    socket.io学习笔记 1.服务器信息传输: 2.不分组,数据传输: 3.分组数据传输: 4.Socket.io难点大放送(暂时没有搞定): 服务器信息传输 1. // send to curre ...

  2. nodejs的第二天学习笔记

    一. Shell: 1) 常用的shell a) CMD: window+r 打开面板中输入cmd 回车   特点:很多都是window下面的指令 b) powerShell:   特点:它能够兼容w ...

  3. nodejs的第一天学习笔记

    一. js的模块化 什么是模块化: 模块化的概念最早是后台,随着ajax技术的兴起,js在编程中所占的地位越来越高,同时js的文件也相应的越来越多.为了方便文件的管理和更新,提出了js文件的模块 化, ...

  4. nodejs服务端开发学习笔记

    正在学习中,不断改错... 学习了一段时间nodejs,对其中的很多东西还不是很理解,在网上看过很多的例子,希望通过自己的一些总结让自己了解的更全面些,同时也作为学习笔记留存备忘. 准备工作 node ...

  5. nodejs的mysql模块学习笔记(结合业务)

    1. 包官网地址 https://www.npmjs.com/package/mysql#install https://www.oschina.net/translate/node-mysql-tu ...

  6. Nodejs学习笔记(四)——支持Mongodb

    前言:回顾前面零零碎碎写的三篇挂着Nodejs学习笔记的文章,着实有点名不副实,当然,这篇可能还是要继续走着离主线越走越远的路子,从简短的介绍什么是Nodejs,到如何寻找一个可以调试的Nodejs ...

  7. Nodejs学习笔记(三)——一张图看懂Nodejs建站

    前言:一条线,竖着放,如果做不到精进至深,那就旋转90°,至少也图个幅度宽广. 通俗解释上面的胡言乱语:还没学会爬,就学起走了?! 继上篇<Nodejs学习笔记(二)——Eclipse中运行调试 ...

  8. Nodejs学习笔记(二)——Eclipse中运行调试Nodejs

    前篇<Nodejs学习笔记(一)——初识Nodejs>主要介绍了在搭建node环境过程中遇到的小问题以及搭建Eclipse开发Node环境的前提步骤.本篇主要介绍如何在Eclipse中运行 ...

  9. NodeJS学习笔记之Connect中间件模块(一)

    NodeJS学习笔记之Connect中间件模块(一) http://www.jb51.net/article/60430.htm NodeJS学习笔记之Connect中间件模块(二) http://w ...

随机推荐

  1. Android NDK进入发展

    使用互联网有很多javah命令生成一个头文件来完成JNI写,但事实上ADT集成NDK后.点点鼠标就可以了,网上的介绍是非常小懒的方法,在这里,我们主要谈论的懒惰JNI发展. 为ADT组态NDK.请个人 ...

  2. jquery+html三级联动下拉框

    jquery+html三级联动下拉框及详情页面加载时的select初始化问题   html写的三个下拉框,如下: <select name="ddlQYWZYJ" id=&q ...

  3. appserv+win8

    在win8系统安装appserv后,假设apache2服务不安装成功,在安装文件夹Apache2.2手动执行apache_servicefix.bat要么apache_serviceinstall.b ...

  4. javascript实现代码高亮

    javascript实现代码高亮-wangHighLighter.js 1. 引言 (先贴出wangHighLighter.js的github地址:https://github.com/wangfup ...

  5. Util应用程序框架公共操作类

    随笔分类 - Util应用程序框架公共操作类 Util应用程序框架公共操作类 Util应用程序框架公共操作类(五):异常公共操作类 摘要: 任何系统都需要处理错误,本文介绍的异常公共操作类,用于对业务 ...

  6. Swift辛格尔顿设计模式(SINGLETON)

    本文已更新为2.0语法,具体查看:一叶单例模式 一.意图 保证一个类公有一个实例.并提供一个訪问它的全局訪问点. 二.使用场景 1.使用场景 当类仅仅能有一个实例并且客户能够从一个众所周知的訪问点訪问 ...

  7. kvm与qemu

    载请注明出处: http://www.openext.org/2014/04/kvmqemu/ http://blog.csdn.net/muge0913/article/details/245577 ...

  8. Rich IntelliSense for jQuery

    A while back we updated VS2008 IntelliSense to not fail when referencing jQuery.  However, getting I ...

  9. C#/ASP.NET/AJAX

      C#/ASP.NET/AJAX ASP.NET 4.5新特性一:强类型数据绑定(Strongly-Type Data-Bindings) 摘要: 随着ASP.NET 4.5的发布提供了很多的新特性 ...

  10. Web前端开发的一点记录

    工欲善其事必先利其器,开发工具选择Sublime Text 简称(ST) 本文所说的均在Windows NT 环境下使用的ST3运行. ST的Package Control安装方法: 1. 直接输入p ...