当前位置: 首页 > 后端技术 > Node.js

Node.js技术总结

时间:2023-04-03 17:24:18 Node.js

Node.js官网定义是什么:Node.js是一个基于ChromeV8引擎的JavaScript运行环境。Node.js使用事件驱动、非阻塞I/O模型,使其轻量且高效。Non-blockingI/Omodel(非阻塞I/O模型),简单的说,每个函数都是异步的,最后由C/C++编写的事件循环处理库Libuv来处理这些I/O操作。它解释了非阻塞I/O的具体细节,简化并发编程模型,让你轻松编写高性能的Web应用程序,因此轻量高效。Node.js能做什么1)跨平台:涵盖所有你能想到的面向用户的平台,传统PCweb,PC客户端nw.js/electron,mobilecordova,HTML5,react-native,weex,Hardwareruff。io等2)Web应用开发:网站、Api、RPC服务等3)前端:三大框架ReactVueAngular辅助开发,工程演进过程(使用Gulp/Webpack构建Web开发工具)4)工具:npm上的各种工具模块,包括各种前端预编译器、构建工具Grunt/Gulp、脚手架、命令行工具、各种tricks等。Node核心:异步流程控制其实并不需要掌握上面这些图为所有技术的一般用途。对于初学者来说,先够了,再深入细节。所以,简化一下,只知道3个就够了。Promise最大的优势就是标准化。各种异步工具库按照统一规范实现,甚至可以无缝集成异步功能。因此,用Promise封装API,通用性强,简单易用,学习成本低。在异步函数普及之前,大部分应用都是使用Promise进行异步流程控制,所以掌握Promise是Node.js学习过程中必须掌握的最重要的事情。学习资料推荐最新Node.js技术栈的Promisehttps://cnodejs.org/topic/560...了解Promise工作原理https://cnodejs.org/topic/569...Promise迷你书http://cnodejs.org/topic/569...://liubin.github.io/promi...异步和事件触发:浏览器中非阻塞I/O的例子基于libuv的平台架构示意图Commonjs、AMD、CMD规范CommonJS通过require加载模块。通过exports和modul.exports公开模块的内容。//moduleA.jsmodule.exports=function(value){returnvalue*2;//moduleB.jsvarmultiplyBy2=require('./moduleA');varresult=multiplyBy2(4);CommonJS是一个同步加载模块,服务端Node.js遵循CommonJS规范。require("module");require("../file.js");exports.doStuff=function(){};module.exports=someValue;AMDAMD是“AsynchronousModuleDefinition”的缩写,意思是“异步模块定义”。AMD规范其实只有一个主接口define(id,dependencies,factory),在声明一个模块的时候指定所有的依赖,同时也将它们作为形参传递给factory。.define("模块",["dep1","dep2"],function(d1,d2){returnsomeExportedValue;});require(["模块","../文件"],函数(模块,文件){/*...*/});CMDCMD规范与AMD类似,保持尽可能简单,并保持与CommonJS和NodeJSModules规范的良好兼容性。靠就近,延迟执行。define(function(require,exports,module){var$=require('jquery');varSpinning=require('./spinning');exports.doSomething=...module.exports=...})Node查找模块中间件的步骤中间件组件是一个JavaScript函数,它通常接受三个参数:一个请求对象、一个响应对象和一个通常命名为next的参数,它是一个回调函数,表明该组件已经完成了它的工作,它是是时候执行下一个中间件组件了。Connect最小的Connect程序varconnect=require('connect');varapp=connect();app.listen(3000);日志中间件varconnect=require('connect');functionlogger(req,res,next){console.log('%s%s',req.method,req.url);next();}functionhello(req,res){res.setHeader('Content-Type','text/plain');res.end('helloworld');}connect().use(logger).use(hello).listen(3000);中间件的顺序很重要使用中间件的顺序来执行身份验证varconnect=require('connect');connect().use(logger).use(restrictFileAccess).use(serveStaticFiles).use(hello).listen(3000);挂载中间件和服务器路由管理请求函数admin(req,res,next){switch(req.url){case'/':res.end('try/users');休息;case'/users':res.setHeader('Content-Type','application/json');res.end(JSON.stringify(['tobi','loki','jane']));休息;}}安装中间件或服务器varconnect=require('connect');connect().use(logger).use('/admin',restrict).use('/admin',admin).use(hello)。听(3000);创建可配置的中间件功能设置(options){//设置逻辑returnfunction(req,res,next){//中间件逻辑}}app.use(setup({some:'options'}));创建一个可配置的记录器中间件组件varapp=connect().use(logger(':method:url')).use(hello);构建路由中间件组件varconnect=require('connect');varrouter=require('./middleware/router');varroutes={GET:{'/users':function(req,res){res.end('tobi,loki,ferret');},'/user/:id':function(req,res,id){res.end('user'+id);}},DELETE:{'/user/:id':function(req,res,id){res.end('删除用户'+id);}}};connect().use(router(routes)).listen(3000);因为程序中中间件的个数没有限制,中间件组件可以使用的次数也没有限制,所以可以定义多个路由器varconnect=require('connect');varrouter=require('./middleware/router');connect().use(router(require('./routes/user'))).use(router(require('./routes/admin'))).listen(3000);使用错误处理中间件varconnect=require('connect')connect().use(functionhello(req,res){foo();res.setHeader('Content-Type','text/plain');res.结束('你好世界');}).listen(3000);默认情况下,Connect给出的响应是状态码500,包含文本“InternalServerError”的响应主体和错误本身的详细信息。functionerrorHandler(){varenv=process.env.NODE_ENV||'发展';returnfunction(err,req,res,next){res.statusCode=500;switch(env){case'development':res.setHeader('Content-Type','application/json');res.end(JSON.stringify(err));休息;默认值:res.end('服务器错误);}}}Connect自带的中间件cookieParser():解析HTTPcookiebodyParser():解析请求体limit():限制请求体query():查询字符串解析logger():记录请求session():会话管理static():static文件服务数据存储内存、redis、mysql、mongodb、mongooseexpress渲染视图处理表单及文件上传koaegg部署阿里云、腾讯云、域名、pm2、nginx、集群、分布式、docker、微服务