当前位置: 首页 > Web前端 > HTML5

Node精要

时间:2023-04-05 00:10:29 HTML5

什么是Node?Node是一个JavaScript运行时平台。特点:异步和事件驱动机制,及其标准库。Node的动力来源来自于服务于GoogleChrome的Chromium项目组开发的V8JavaScript引擎。V8负责JavaScript代码的解释和执行。c++绑定层可以用来结合libuv和v8。节点包含v8特性:shipping、staged、inprogress三组。npm需要在与Node项目相同的目录中有一个package.json文件。创建package.json文件的最简单方法是使用npm。Node程序主要分为:Web应用、命令行工具、后台程序、桌面程序、Web应用:提供单页应用、rest微服务、全栈Web应用的简单程序。mkdirexample-projectcdexample-projectnpminit-ycoremodule:node的核心模块,相当于其他语言的标准库,是编写服务端JavaScript所需要的工具。event模块是一个处理事件的小库,node的大部分API都是基于它的。Node有文件系统库,fs,path,tcp客户端和服务端库net,http库,域名解析库dns,测试断言库assert,查询平台信息的操作系统库os。异步I/O发起Ajax请求:$.post('/url',{title:'web'},function(data){console.log('responsereceived');});console.log('Send阿贾克斯结束');ajax发送结束后输出收到的response。Ajax通过post请求向服务器发送ajax请求,服务器处理请求,然后将响应数据返回给执行回调。读取文件:varfs=require('fs');fs.readFile('/path',function(err,file){console.log('读取文件完成')});console.log('启动读取文件');readFile()通过fs.readFile()异步调用node处理请求,然后返回数据给执行回调。两个文件读取任务的耗时取决于最慢文件读取的耗时:fs.readFile('/path1',function(err,file){console.log('读取文件1完成');});fs.readFile('/path2',function(err,file){console.log('读取文件2完成');});使用核心模块和流constfs=require('fs');constzlib=require('zlib');constgzip=zlib.createGzip();constoutStream=fs.createWriteStream('output.js.gz');fs.createReadStream('./node-stream.js').pipe(gzip).pipe(outStream)用于同步,他们的耗时是两个任务耗时的总和。Non-blockingI/ONon-blockingI/O是一个低级的术语,意思是你的程序可以在做其他事件的同时发起一个获取网络资源的请求,然后当网络操作完成时,会回调一个函数run来处理这个操作。结果。典型的NodeWeb应用程序使用Web应用程序库Express来处理商店的订单流程。包含在Node和Express、http路由器、非阻塞网络I/O、线程等,libuv。浏览器通过非阻塞I/O向应用程序发起请求以检查库存、注册用户、发送回执电子邮件、向非阻塞网络I/O返回HTTP响应并返回JSONHTTP响应到浏览器。同时,发送回执电子邮件以更新数据库。事件和回调函数Node内置的http服务器库,即核心模块http.Server,负责结合流、事件和Node的http请求解析器来处理请求。事件轮询:三个非阻塞网络调用:对于请求数据库和响应事件轮询是一个单向运行的先进先出队列。ajax异步提交的服务端处理过程:varhttp=require('http');varquerystring=require('querystring');http.createServer(function(req,res){varpostData='';req.setEncoding('urf8');req.on('data',function(num){postData+=num;});req.on('end',function(){res.end(postData);});}).listen(8080);console.log('服务器启动完成');ajax请求绑定到成功事件。$.ajax({'url':'/url','method':'POST','data':{},'success':function(data){//成功事件}});使用节点的httpWritehelloworld示例:consthttp=require('http');constport=8080;constserver=http.createServer((req,res)=>{res.end('hello');});server.listen(port,()=>{console.log('server');});单线程Node在浏览器中保持了JavaScript的单线程特性。单线程的缺点是:无法使用多核cpu;错误会导致整个应用程序退出,应用程序的健壮性值得检验。大量计算占用cpu,导致无法继续调用异步I/O。WebWorkers可以创建工作线程来执行计算,解决JavaScript大计算阻塞UI渲染的问题。工作线程为了不阻塞主线程,通过消息传递的方式传递运行结果,同时也阻止了工作线程访问主线程中的UI。子线程的出现,意味着Node可以从容应对单线程健壮性和无法利用多核CPU的问题。I/O密集型和CPU密集型节点面向网络,擅长并行I/O,可以有效组织更多的硬件资源,提供更好的服务。I/O密集型的优点主要是Node利用了事件循环的处理能力,而不是每个请求都启动一个线程来服务,占用的资源非常少。Node的前后端编程语言环境是统一的;其带来的高性能I/O用于实时应用。并行I/O使用户能够高效地利用分布式环境,有效地利用稳定的接口来提高Web渲染能力。原型对象类的结构:functionUser(){//constructor}User.prototype.method=function(){//method};es6classUser{constructor(){}method(){}}[1,2,3].map(n=>n*2).filter(n=>n>3);生成器可以将异步I/O转换为同步编程风格。生成器用于KoaWeb应用程序库。模板字符串web应用程序this.body=`

web

jeskson

`;Debuggernode自带的debugger支持单步执行和REPL,Read,calculate,output,loop。Node支持Chrome调试协议。一个expresswebapplication:mkdirhello_expresscdhello_expressnpminit-ynpmiexpress--save在JavaScript中,函数是一等对象,node有内置的事件模型,用来写异步实时程序比其他脚本语言。libuv是一个原生库,可提供快速、跨平台、非阻塞I/O。Node带有一个调试器和一个依赖管理器npm。v8用作JavaScript运行时。