Node.js 究竟是什么?

Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念。它的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处理数万条同时连接到一个(只有一个)物理机的连接代码。

Node 本身运行 V8 JavaScript。等等,服务器上的 JavaScript?对,您没有看错,就是Javascript。对于只在客户机上使用 JavaScript 的程序员而言,服务器端 JavaScript 可能是一个新概念,但这个概念本身并非遥不可及,因此为何不能在服务器上使用客户机上使用的编程语言?

什么是 V8?V8 JavaScript 引擎是 Google 用于其 Chrome 浏览器的底层 JavaScript 引擎。实际上,JavaScript 引擎负责解释并执行代码。Google 使用 V8 创建了一个用 C++ 编写的超快解释器,该解释器拥有另一个独特特征;您可以下载该引擎并将其嵌入任何 应用程序。V8 JavaScript 引擎并不仅限于在一个浏览器中运行。因此,Node 实际上会使用 Google 编写的 V8 JavaScript 引擎,并将其重建为可在服务器上使用。

什么是回调?

回调是一种异步相当于一个函数。回调函数被调用在完成既定任务。Node大量使用了回调。Node所有的API写的都是支持回调的这样一种方式。例如,一个函数读取一个文件可能开始读取文件,并立即返回控制到执行环境 使得下一个指令可以马上被执行。一旦文件 I/O 完成,它会调用回调函数,同时传递回调函数,该文件作为参数的内容。因此不会有堵塞或等待文件I/O。这使得Node.js高度可扩展,因此可以处理大量的请求,而无需等待任何函数来返回结果

事件驱动

创建了服务器,并且向创建它的方法传递了一个函数。无论何时我们的服务器收到一个请求,这个函数就会被调用。我们不知道这件事情什么时候会发生,但是我们现在有了一个处理请求的地方:它就是我们传递过去的那个函数。至于它是被预先定义的函数还是匿名函数,就无关紧要了。这个就是传说中的 回调 。我们给某个方法传递了一个函数,这个方法在有相应事件发生时调用这个函数来进行 回调 。

Node.js特性

  • Node.js库的异步和事件驱动的API全部都是异步就是非阻塞。它主要是指基于Node.js的服务器不会等待API返回的数据。服务器移动到下一个API调用,Node.js发生的事件通知机制后有助于服务器获得从之前的API调用的响应。

  • 非常快的内置谷歌Chrome的V8 JavaScript引擎,Node.js库代码执行是非常快的。

  • 单线程但高度可扩展 - Node.js使用具有循环事件单线程模型。事件机制有助于服务器在一个非阻塞的方式响应并使得服务器高度可扩展,而不是创建线程限制来处理请求的传统服务器。

  • 没有缓冲 - Node.js的应用从来不使用缓冲任何数据。这些应用只是输出数据在块中。

  • 许可证协议 - Node.js 在 MIT 协议 下发布

阻塞非阻塞

  同步/异步:   消息通知机制相关=>需要自己关注还是提供callback

  阻塞/非阻塞:等待消息时的状态=>是否可以干别的事情

  同步阻塞: 劫匪看着衰男把钱装好,不能干其他事情

  同步非阻塞:劫匪自己也到处搜索宝贝,但是还要不时跑回来看看钱装好没有。

  异步非阻塞:劫匪自己也到处搜索宝贝,衰男把钱装好了自动过来告诉劫匪好了

  异步阻塞:  劫匪就在那里傻等着,也不用管钱是否装好,衰男把钱装好了自动过来告诉劫匪好了

  我们需要通过它提过的一些支持的库自己编写,无法像Apache那样直接运行,V8引擎本身使用了一些最新的编译技术。这使得用Javascript这类脚本语言编写出来的代码运行速度获得了极大提升,又节省了开发成本。对性能的苛求是Node的一个关键因素。本质上就是为文件系统、数据库之类的资源提供接口。

阻塞非阻塞:可以简单理解为需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了,否则就可以理解为非阻塞。   

例如:

我去买一本书,立即买到了,这就是非阻塞;
如果恰好书店没有,我就等一直等到书店有了这本书买到了才走,这就是阻塞;

模块化

正如我们买了一个智能手机那样,我们总是可以安装第三方软件来扩展手机的功能,听音乐,玩游戏,阅读等等。对于nodejs也是一样一样的。

本身nodejs相当一个平台,您也可以通过安装模块来扩展 Node 的功能。可用于 Node 的模块极大地 增强了这个产品,那些模块非常有用,将使用 Node 的开发人员通常会安装几个模块。因此,模块也就变得越来越重要,甚至成为整个产品的一个关键部分。

编写第一个node程序

代码示例:

// 1 通过requer导入http模块,并且返回一个对象
var http=require("http");
// 2 创建服务器,设置回调函数
var server=http.createServer(function(){
console.log("服务器运行了");
})
// 3 监听端口,
server.listen("8888");
console.log("监听成功");

访问第一个服务器程序

  1.Localhost:8888  本机

  2.127.0.0.1:8888  本机

  3.192.168.1.30:8888  其他用户

设置请求响应对象,并且响应给客户端数据

// 1 通过requer导入http模块,并且返回一个对象
var http=require("http");
// 2 创建服务器,设置回调函数
var server=http.createServer(function(request,response){
console.log("服务器运行了");
// request请求对象,response响应对象
// console.log(request)
// 响应数据 ,返回之前要加上响应头信息
response.writeHead(200,{"content-type":"text/html;charset=utf-8"})
response.write("<h1>hello world</h1>");
// 响应结束
response.end();
})
// 3 监听端口,
server.listen("8888");
console.log("监听成功");

请求响应对象request,response

Node项目工程目录结构

  1.app.js  服务器文件

  2.Public(文件夹) 静态资源

  3.routes (文件夹)   路由

  4.views (文件夹)  视图文件

  5.dist (文件夹)   上线后的资源

完整请求响应
// 1 通过requer导入http模块,并且返回一个对象
var http=require("http");
// 2 创建服务器,设置回调函数
// 引入读文件的模块 fs
var fs=require("fs");
var server=http.createServer(function(request,response){console.log("服务器运行了");// request请求对象,response响应对象// console.log(request)// 响应数据 ,返回之前要加上响应头信息// response.writeHead(200,{"content-type":"text/html;charset=utf-8"})// response.write("<h1>hello world</h1>");// 响应结束// response.end();// fs.readFile ("路径",编码,函数(错误,读到的数据){})var newPath=request.url.split(".");if(newPath[1]=="html"){fs.readFile("public"+request.url,"utf-8",function(error,data){// console.log(data)if(error==null){response.writeHead(200,{"content-type":"text/html;charset=utf-8"});response.write(data);response.end();}})}else if(newPath[1]=="css"){fs.readFile("public"+request.url,"utf-8",function(error,data){// console.log(data)if(error==null){response.writeHead(200,{"content-type":"text/css;charset=utf-8"});response.write(data);response.end();}})}else if(newPath[1]=="jpg"||newPath[1]=="gif"||newPath[1]=="png"){fs.readFile("public"+request.url,function(error,data){// console.log(data)if(error==null){response.writeHead(200,{"content-type":"image/"+newPath[1]});response.write(data);response.end();}})}console.log(newPath)
})
// 3 监听端口,
server.listen("8888");
console.log("监听成功");

Fs模块 文件解析模块

返回哪个页面,首先要知道用户请求的是什么网页,获得请求路径两个方法获取请求路径,请求文件:1.对象自带属性—URL属性:request.url2.url模块:var mypath=require(“url”)引入fsvar myfs=require(“fs”)通过fs读取参数:1.路径,2.字符串编码集,3.回调函数,读取完毕后调用的函数:成功or失败myfs.readFile(“路径"+mypath,"utf-8",function(err,data){response.writeHead(200,{"content-type":"text/html"});
response.write(data);       response.end();});
var fs =require(“fs”);//加载文件系统模块

fs.readFile(“路径"+mypath,“utf-8",function(err,data){response.writeHead(200,{"content-type":"text/html"});console.log(err);response.write(data);       response.end();});

转载于:https://www.cnblogs.com/1542986913Yu/p/7592794.html

【个人笔记】《知了堂》node.js简介及创建应用相关推荐

  1. 【Nodejs篇一】Node js 简介

    一.Node.js简介 Node.js 不是一种独立的语言,Node.js 也不是一个 JavaScript 框架,.Node.js 是一个让 JavaScript 运行在服务端的开发平台.他跳过了h ...

  2. Node.js简介、安装Node.js、ES6中的模块

    一.Node.js简介 1. Node是什么 1)浏览器内核有两个引擎:渲染引擎(渲染html.css).JavaScript引擎(运行JavaScript代码) 2)Node是独立于浏览器的Java ...

  3. 微信小程序笔记(包含node.js简介)

    一.小程序基础知识 1. 小程序简介 小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验. 2. CSS样式 https://www.w3school.c ...

  4. Node.js「一」—— Node.js 简介 / Node.js 模块 / 包 与 NPM

    本文为 Node.js 系列笔记第一篇.文章参考:nodejs 教程 -- 大地:<深入浅出 Node.js>:阮一峰 nodejs 博客 文章目录 一.Node 简介 1. 简单介绍 2 ...

  5. 开发笔记13 | 部署 Node.js 应用程序到云 ECS

    <<系列文章集 前言 在之前的一篇文章中,我们介绍了 如何将一个本地的 Java 应用程序直接部署到阿里云 ECS ,有不少读者反馈,在本文中,我们来介绍如何部署 Node.js 应用程序 ...

  6. node.js入门系列(一)--Node.js简介

    什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. 每一种解析器都是一 ...

  7. Node.js—简介

    一.Node.js是什么 1. 基本概述 Node.js是一个可以让JavaScript运行在服务器端的平台.它是一个为实时Web应用开发而诞生的平台,它从诞生之初就充分考虑了在实时响应.超大规模数据 ...

  8. 【笔记整理】node.js笔记

    第一天: - Node.js 是什么   + JavaScript 运行时   + 既不是语言,也不是框架,它是一个平台 - Node.js 中的 JavaScript   + 没有 BOM.DOM ...

  9. 【第一节 Node.js简介】

    1.Node.js是什么? Node.js是基于Chrome JavaScript运行时建立的一个平台,实际上它是对Google Chrome V8引擎进行了封装,它主要用于创建快速的.可扩展的网络应 ...

最新文章

  1. Android初步学习BroadCast与Service实现简单的音乐播放器
  2. SVD java 算法实现
  3. 【Centos】更新为北京时间
  4. iOS8 Core Image In Swift:视频实时滤镜
  5. GDCM:SCU功能的测试程序
  6. SpringBoot快速构建项目
  7. dotnet core 应用是如何跑起来的 通过AppHost理解运行过程
  8. 给.net初学者的一些建议(共勉之)[转载]
  9. socketmq 设置队列大小_LeetCode 622:设计循环队列 Design Circular Queue
  10. 怎样才算优秀的xyz员
  11. 单招软件职业技能测试,高职单招职业技能测试,这些知识你都了解吗?
  12. 2021年大学计算机基础,2021年大学计算机基础试题题库及答案-20210418080659.doc-原创力文档...
  13. WarDrive:使用Backtrack 4中的Kismet进行嗅探并使用GE绘制地图的简明攻略
  14. 朴实无华,总结200道往年BAT机器学习面试题
  15. 中兴配置dhcp服务器,中兴F623路由器如何投入使用dhcp服务器
  16. Mac Android 查看dex文件内容
  17. Linux系统 查看系统版本、CPU、内存、主频等信息
  18. 【转载】最全的计算广告资料,广告算法工程师入门
  19. 解决out.print()爆红问题
  20. 法语学习笔记——语音

热门文章

  1. LeetCode 357. Count Numbers with Unique Digits
  2. google lab 深度学习_吴恩达、李飞飞等化身超级英雄!深度学习漫画第一卷现已开源...
  3. perl调用shell命令并获取输出
  4. Hive:用Java代码通过JDBC连接Hiveserver
  5. java 实现WebService 以及不同的调用方式
  6. fiddler启用过滤规则只显示想要的接口数据
  7. csharp datagridview to a datatable,a dataset
  8. 李洪强iOS开发之后使用XIB实现横向滚动的UIScrollView
  9. 在ubuntu上安装Avant Window Navigator (AWN)
  10. 基于原生js的图片延迟加载