在我印象里,“全栈工程师”这个词是NodeJS诞生后才逐渐火起来的,因为NodeJS赋予了JS服务器开发的能力。下面开始从一个小白的角度进军NodeJS...

  前言:在学习NodeJS之前是需要安装的,安装方法很easy。安装好之后,安装路径会自动写到环境变量path路径中,所以我们可以直接cmd去黑窗口用node命令运行js文件。

1、NodeJS是什么

  Node.js是一个构建在Chrome V8引擎上的 JavaScript 运行环境。

   此时,JS的运行环境就多了一个,变成俩个了——浏览器、NodeJS。安装完node之后,我们就可以用node命令去执行js文件。比如node demo.js命令去执行一个demo.js文件...

2、NodeJS的特点

  单线程、非阻塞异步I/O、事件驱动   

  1、js是单线程执行的

  也就是说,同一个时间只能做一件事,不像java、php那样可以创建多个线程,这是js的特点。

  在Java、PHP或者.net等服务器语言中,会为每个客户端连接创建一个新的进程。而每个进程需要耗费大约2MB内存。也就是说,理论上一个8GB的服务器可以同时连接最大用户量为4000个左右。要让Web应用程序同时支持更多的用户,就需要增加服务器的数量或内存数,这样硬件成本就上升了。

  NodeJS不为每个客户连接创建一个新的线程,而仅仅使用一个线程。当有用户连接,就触发一个内部事件,通过非阻塞I/0、事件驱动机制,让NodeJS程序宏观上也是并行的,给人的感觉就是用户之间互不影响。使用NodeJS,一个8GB内存服务器,可以同时处理超过4万用户的连接。

  另外,单线程带来的好处还有操作系统完全不再有线程创建、销毁的时间开销。

  2、非阻塞异步I/O

  简单点说就死异步不会阻塞后面的代码。绝大多数网站的I/O操作很多,I就是input数据的读取,O就是output数据的写入。但是I/O的时候,CPU命令磁盘去做事情,CPU就闲置了。

  

  3、事件驱动模型:NodeJS底层机制,保证不会“上错菜”

  

  

主线程:主线程会一直轮询,队列中没有代码了,主线程就会退出。

  1.执行node的代码,把代码放入队列
  2.事件循环程序(主线程)把队列里面的同步代码都先执行了,
  3.同步代码执行完成,执行异步代码
  4.异步代码分2种状况,    

    1.异步非io setTimeout() setInterval(),判断是否可执行,如果可以执行就执行,不可以跳过。

    2.异步io 文件操作 会从线程池当中去取一条线程,帮助主线程去执行。

 

子线程:被放在线程池里面的线程,用来执行异步io操作

  1.在线程池里休息
  2.异步io的操作来了,执行异步io操作。
  3.子线程会把异步io操作的callback函数,扔回给队列
  4.子线程会回到线程池了去休息。

回调(callback ):在异步io代码执行完成的时候被扔回主线程。

3、NodeJS组成

  1. 引入 required 模块:我们可以使用 require 指令来载入 Node.js 模块。
  2. 创建服务器:服务器可以监听客户端的请求,类似于 Apache 、Nginx 等 HTTP 服务器。
  3. 接收请求与响应请求:服务器很容易创建,客户端可以使用浏览器或终端发送 HTTP 请求,服务器接收请求后返回响应数据。

4、创建第一个NodeJS应用

// 使用 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的服务器。

5、NPM介绍使用

NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:
-- 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
-- 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
-- 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。

1、使用npm命令安装模块 : $ npm install <Module Name>

比如:npm 命令安装常用的 Node.js web框架模块 express: $ npm install express 安装好之后,express 包就放在了工程目录下的 node_modules 目录中。因此在代码中只需要通过 require('express') 的方式就好,无需指定第三方包路径。引用方式: var express = require('express');

2、全局安装和本地安装: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. 可以直接在命令行里使用。

3、创建模块,package.json 文件是必不可少的。我们可以使用 NPM 生成 package.json 文件

6、回调函数

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内容

第一个实例在文件读取完后才执行完程序。

第二个实例我们不需要等待文件读取完,这样就可以在读取文件时同时执行接下来的代码,大大提高了程序的性能。

因此,阻塞是按顺序执行的,而非阻塞是不需要按顺序的,所以如果需要处理回调函数的参数,我们就需要写在回调函数内。

参考:https://www.runoob.com/nodejs/nodejs-event-loop.html

NodeJS入门篇的更多相关文章

  1. nodejs入门篇---创建project并具体解释

    想了非常久.总想写点对大家有优点的,今天解说生成项目. 如今市面上一般须要人全栈-----mean(mongo,express.angular,nodejs),这样能够从前端开发到后端以及数据库,听起 ...

  2. nodeJs入门篇之认识nodejs

    摘要:将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏览器就基于V8,同时打开 ...

  3. nodejs入门篇之linux版的nodejs简易环境安装部署

    第一步:下载二进制安装包 根据linux的不同版本选择32位或64位,因为我的linux的虚拟机是64位的,所以我选择的是64位二进制安装文件(Linux Binariesx64),可以右键选择在新窗 ...

  4. nodeJs 5.0.0 安装配置与nodeJs入门例子学习

    新手学习笔记,高手请自动略过 安装可以先看这篇:http://blog.csdn.net/bushizhuanjia/article/details/7915017 1.首先到官网去下载exe,或者m ...

  5. NodeJS入门(四)—— path对象

    很快Node就会迎来4.0的时代,届时将并入现有的iojs,所以先前写过的iojs入门系列直接更名为NodeJS入门. 本篇开始将逐个介绍Node的各主要模块,依循API文档走一遍,但会给出比API文 ...

  6. 开心菜鸟系列----函数作用域(javascript入门篇)

      1 <!DOCTYPE html>   2 <html>   3 <script src="./jquery-1.7.2.js"></ ...

  7. nodejs入门教程之http的get和request简介及应用

    nodejs入门教程之http的get和request简介及应用 前言 上一篇文章,我介绍了nodejs的几个常用的模块及简单的案例,今天我们再来重点看一下nodejs的http模块,关于http模块 ...

  8. nodejs 基础篇整合

    nodeJs 基础篇整合 最近有朋友也想学习nodeJs相关方面的知识,如果你是后端想接近前端,node作为一门跑在服务端的JS语言从这里入门再好不过了.如果你正好喜欢前端,想走的更高,走的更远.no ...

  9. 每天记录一点:NetCore获得配置文件 appsettings.json vue-router页面传值及接收值 详解webpack + vue + node 打造单页面(入门篇) 30分钟手把手教你学webpack实战 vue.js+webpack模块管理及组件开发

    每天记录一点:NetCore获得配置文件 appsettings.json   用NetCore做项目如果用EF  ORM在网上有很多的配置连接字符串,读取以及使用方法 由于很多朋友用的其他ORM如S ...

随机推荐

  1. Jenkins HA高可用参考

    商用版Jenkins(CloudBee)提供HA插件,开源版本可以借助etcd服务发现+心跳脚本+sync的方式实现高可用.

  2. 基于ASP.NET MVC 利用(Aspose+Pdfobject.js) 实现在线预览Word、Excel、PPT、PDF文件

    #region VS2010版本以及以上版本源码下载地址:http://download.csdn.net/download/u012949335/10231812 VS2012版本以及以上版本源码下 ...

  3. 【题解】 BZOJ4548 小奇的糖果

    本文同步在学弟ZCDHJ的个人博客发布,审核需要一段时间. 传送门 考虑题目中获得的糖果并不包含所有的颜色这句话,发现相当于我们可以直接选取某一个颜色强制不能选(这样子一定最优). 然后就可以考虑分开 ...

  4. ceph 运维常用指令

    集群 启动一个ceph 进程 启动mon进程 service ceph start mon.node1 启动msd进程 service ceph start mds.node1 启动osd进程 ser ...

  5. 谈一谈PHP计划任务

    公司所用计划任务均是大概这样子的: */ * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testOne & ...

  6. day05.2-一个文件的增删改查实例

    一. 测试程序   #INFO.txt源文件内容 global log 127.0.1 local2 daemon maxconn 256 log 127.0.0.1 local2 info defa ...

  7. Weblogic wls-wsat组件反序列化漏洞(CVE-2017-10271)

    CVE编号: CVE-2017-10271 漏洞描述: Weblogic wls-wsat组件反序列化漏洞 利用脚本: https://github.com/hanc00l/weblogic_wls_ ...

  8. [Objective-C语言教程]多态(26)

    多态性这个词表示有许多形式. 通常,当存在类的层次结构并且通过继承相关时,会发生多态性. Objective-C多态表示对成员函数的调用将导致执行不同的函数,具体取决于调用该函数的对象的类型. 考虑下 ...

  9. extjs Tree中避免连续单击会连续请求服务器

    应用场景:在项目中我要做一个左边是tree,右边是panel的界面.当我单击tree中的一条记录时,发送请求,并将结果显示在右边的panel中.做完之后发现,如果连续单击就会连续请求两次服务器,毕竟用 ...

  10. Java_多线程2_线程池

    线程池(pool): 线程池的作用: 1.节省资源,减少线程的数量和创建销毁线程的开销2.合理的管理线程的分配 线程池的创建: 1.newCachedThreadPool //优点:很灵活,弹性的线程 ...