Node.jsNodejs –我要好之就学笔记

 

   
 对于Nodejs,相信消费者并无陌生,网上却曾多说纷纭,有人说是一个平台,有人说是服务器JavaScript,有人说一个框架…

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

 
 于是乎,怀着这卖忐忑和景仰yu好奇,之前有自学了一段时间,这些日子公司项目完测,遂整理了片Nodejs学习笔记,这里决分享下好之笔记(说不定以后还能经受承宝典咧,想想都发接触鸡冻)也时有发生从别处借鉴过来的文化,若有同,不胜荣幸,供顾客参考,如有不足多多指教Node.js 1Node.js 2

 

推荐阅读
朴灵《深入浅出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引擎进行代码解释

  1. 事件驱动

  2. 非阻塞

  3. 异步I/O

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

7.
单进程,单线程

 

   
Node.Js最要命特点是运用异步式I/O与事件驱动的架构设计
。对于高并发的化解方案,传统的架是多线程模型,也便是每个工作逻辑提供一个系线程,通过系统线程切换来弥补同步式I/O调用时之光阴初步销.

   
Node.Js采用的是单线程模型,在推行进程遭到见面保护一个事件队列
,程序于执行时在进事件循环等下一个风波的到来。

 

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

  ps
我学习是于windows上出,当然*nix会更好

 
Nodejs安装。。。。此处有些去n千字…

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

  Node.js 3

 
顺带在把本(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

 Node.js 4

再有另外一栽方法

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

Console.log(‘Hello World’);   

  1. 输出结果:

 Node.js 5

第一执行是结果

亚执行是返回值

 

ok,再来提升一下逼格

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

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

 var http = require('http');
  http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World');
  }).listen(1337, "127.0.0.1");
  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 服务器在一定端口监听。

浏览器运行结果如下:

Node.js 6

     
当一个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

var fs = require('fs');
 1.1. 读取文件 
var fs = require('fs');
1.1.1、 fs.readFile(filename,[encoding],[callback(error,data)])
fs.readFile('book.txt', 'utf-8', (err, data) => {
if (err) {
throw err;
}
console.log(data);

1.1.2、 fs.readFileSync(filename,[encoding])
try {
var data = fs.readFileSync('book.txt', 'utf-8');
console.log(data);
} catch (e) {
throw e; //文件不存在,或者权限错误
}

1.1.3、 fs.createReadStream(filename,[options])
var stream = fs.createReadStream('book.txt');
var data = '';
stream.on('data', (trunk) => {
data += trunk;
});
stream.on('end', () => {
console.log(data);
});

1.1.4、 readLine
var readline = require('readline');
var fs = require('fs');
var rl = readline.createInterface({
input: fs.createReadStream('book.txt')
});
rl.on('line', (line) => {
console.log('Line from file:' + line);
})

1.2、文件写入
1.2.1、 fs.writeFile(filename, [callback(error)]) //如果文件不存在,会自动创建
fs.writeFile('name.txt', 'I am the man', (error) => {
if(error){ 
console.log(error);
} 
})

1.2.2、fs.writeFileSync(file,[data])
try {
fs.writeFileSync('timer.txt', 'JesseFu is the best');
} catch (e) {
console.log(e);
}

1.2.3、fs.createWriteStream(path[,option])
var streamWrite = fs.createWriteStream('fuguoliang.txt');
streamWrite.write('fuguoliang\r\n', (error) => {
console.log(error);
});

1.2.4、fs.appendFile(file,data[,options],callback(err)) //追加文本
setInterval(() => {
fs.appendFile('fuguoliang.txt', '\r\n ----Jesse ' + new Date().getSeconds());
}, 1000)

1.2.5、fs.appendFileSync(file,data[,options])
setInterval(() => {
fs.appendFileSync('fuguoliang.txt', '\r\n ----what the hell... ' + new Date().getSeconds())
}, 1000)

验证路径是否存在
fs.exists(path,callback(isexists))   
fs.existsSync(path) //返回true 或 false

获取文件信息
fs.stat(path,callback(err,stats))
fs.statSync(path) //返回一个fs.stat实例

移动文件 移动/重命名
fs.rename(oldpath,newpath,callback);
fs.renameSync(oldpath,newpath)

删除文件 永久删除/
fs.unlink(path,callback(err)); 
fs.unlinkSync(path);

创建一个目录 (重名会报错)
fs.mkdir(path[,model],callback)
fs.mkdirSync(path[,model]);

删除一个空目录
fs.rmdir(path,callback);
fs.remdirSync(path);

读取一个目录 以数组形式展现
fs.readdir(path,callback(err,files))
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