在我印象里,“全栈工程师”这个词是NodeJS诞生后才逐渐火起来的,由于NodeJS赋予了JS服务器开发的能力。下面开始从一个小白的角度进军NodeJS...php
前言:在学习NodeJS以前是须要安装的,安装方法很easy。安装好以后,安装路径会自动写到环境变量path路径中,因此咱们能够直接cmd去黑窗口用node命令运行js文件。html
Node.js是一个构建在Chrome V8引擎上的 JavaScript 运行环境。java
此时,JS的运行环境就多了一个,变成俩个了——浏览器、NodeJS。安装完node以后,咱们就能够用node命令去执行js文件。好比node demo.js命令去执行一个demo.js文件...node
单线程、非阻塞异步I/O、事件驱动 web
也就是说,同一个时间只能作一件事,不像java、php那样能够建立多个线程,这是js的特色。express
在Java、PHP或者.net等服务器语言中,会为每一个客户端链接建立一个新的进程。而每一个进程须要耗费大约2MB内存。也就是说,理论上一个8GB的服务器能够同时链接最大用户量为4000个左右。要让Web应用程序同时支持更多的用户,就须要增长服务器的数量或内存数,这样硬件成本就上升了。npm
NodeJS不为每一个客户链接建立一个新的线程,而仅仅使用一个线程。当有用户链接,就触发一个内部事件,经过非阻塞I/0、事件驱动机制,让NodeJS程序宏观上也是并行的,给人的感受就是用户之间互不影响。使用NodeJS,一个8GB内存服务器,能够同时处理超过4万用户的链接。编程
另外,单线程带来的好处还有操做系统彻底再也不有线程建立、销毁的时间开销。json
简单点说就死异步不会阻塞后面的代码。绝大多数网站的I/O操做不少,I就是input数据的读取,O就是output数据的写入。可是I/O的时候,CPU命令磁盘去作事情,CPU就闲置了。浏览器
主线程:主线程会一直轮询,队列中没有代码了,主线程就会退出。
1.执行node的代码,把代码放入队列
2.事件循环程序(主线程)把队列里面的同步代码都先执行了,
3.同步代码执行完成,执行异步代码
4.异步代码分2种情况,
1.异步非io setTimeout() setInterval(),判断是否可执行,若是能够执行就执行,不能够跳过。
2.异步io 文件操做 会从线程池当中去取一条线程,帮助主线程去执行。
子线程:被放在线程池里面的线程,用来执行异步io操做
1.在线程池里休息
2.异步io的操做来了,执行异步io操做。
3.子线程会把异步io操做的callback函数,扔回给队列
4.子线程会回到线程池了去休息。
回调(callback ):在异步io代码执行完成的时候被扔回主线程。
1. 引入 required 模块:咱们可使用 require 指令来载入 Node.js 模块。
2. 建立服务器:服务器能够监听客户端的请求,相似于 Apache 、Nginx 等 HTTP 服务器。
3. 接收请求与响应请求:服务器很容易建立,客户端可使用浏览器或终端发送 HTTP 请求,服务器接收请求后返回响应数据。
// 使用 require 指令来载入 http 模块,并将实例化的 HTTP 赋值给变量 http var http = require('http'); // 使用 http.createServer() 方法建立服务器,并使用 listen 方法绑定 3000端口。 函数经过 request, response 参数来接收和响应数据 http.createServer(function (request, response) { // 发送 HTTP 头部 // HTTP 状态值: 200 : OK // 内容类型: text/plain response.writeHead(200, {'Content-Type': 'text/plain'}); // 发送响应数据 "Hello World" response.end('Hello World\n'); }).listen(3000); // 终端打印以下信息 console.log('Server running at http://127.0.0.1:3000/');
把以上代码放到单独某个js文件中,用node命令去执行,便会在本地建立一个端口号为3000的服务器。
NPM是随同NodeJS一块儿安装的包管理工具,能解决NodeJS代码部署上的不少问题,常见的使用场景有如下几种:
-- 容许用户从NPM服务器下载别人编写的第三方包到本地使用。
-- 容许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
-- 容许用户将本身编写的包或命令行程序上传到NPM服务器供别人使用。
一、使用npm命令安装模块 : $ npm install <Module Name>
好比:npm 命令安装经常使用的 Node.js web框架模块 express: $ npm install express 安装好以后,express 包就放在了工程目录下的 node_modules 目录中。所以在代码中只须要经过 require('express') 的方式就好,无需指定第三方包路径。引用方式: var express = require('express');
二、全局安装和本地安装:npm 的包安装分为本地安装(local)、全局安装(global)两种,从敲的命令行来看,差异只是有没有-g而已,好比:
npm install express # 本地安装
npm install express -g # 全局安装
本地安装
1. 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),若是没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
2. 能够经过 require() 来引入本地安装的包。
全局安装
1. 将安装包放在 /usr/local 下或者你 node 的安装目录。
2. 能够直接在命令行里使用。
三、建立模块,package.json 文件是必不可少的。咱们可使用 NPM 生成 package.json 文件
Node.js 异步编程的直接体现就是回调。
异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。
回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,Node 全部 API 都支持回调函数。
例如,咱们能够一边读取文件,一边执行其余命令,在文件读取完成后,咱们将文件内容做为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操做。这就大大提升了 Node.js 的性能,能够处理大量的并发请求。
回调函数通常做为函数的最后一个参数出现:
function foo1(name, age, callback) { }; function foo2(value, callback1, callback2) { }
阻塞代码实例:
// 引入文件操做模块 var fs = require("fs"); var data = fs.readFileSync('input.txt'); //input.txt内容是: 我是input.txt内容 console.log(data.toString()); console.log("程序执行结束!"); // 用node命令执行 $ node main.js 我是input.txt内容 程序执行结束!
非阻塞代码实例:
// 引入文件操做模块 var fs = require("fs");
fs.readFile('input.txt', function (err, data) {
if (err) return console.error(err); console.log(data.toString());
});
console.log("程序执行结束!");
// 用node命令执行
$ node main.js
程序执行结束!
我是input.txt内容
第一个实例在文件读取完后才执行完程序。
第二个实例咱们不须要等待文件读取完,这样就能够在读取文件时同时执行接下来的代码,大大提升了程序的性能。
所以,阻塞是按顺序执行的,而非阻塞是不须要按顺序的,因此若是须要处理回调函数的参数,咱们就须要写在回调函数内。