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

Node核心与NodeeventLoop

时间:2023-04-03 23:59:14 Node.js

Node是什么?Node.js是一个开源和跨平台的JavaScript运行环境;Node.js在浏览器之外运行V8JavaScript引擎(GoogleChrome的核心)。Node.js应用程序运行在单个进程中,无需为每个请求创建一个新线程。Node.js在其标准库中提供了一组异步I/O原生函数(以防止JavaScript代码被阻塞),而Node.js中的库通常是使用非阻塞范式编写的(从而使阻塞行为成为异常而不是常态)当Node.js执行I/O操作(例如从网络读取、访问数据库或文件系统)时,Node.js将恢复操作,而不是阻塞线程和浪费CPU循环等待Node.js和基于js核心(ecmascript)系统级api文件操作,网络编程实现自己的web服务Node解决了什么问题?Web服务器,瓶颈在于并发数(多线程同步)只要多人需要操作同一个资源,就必须通过锁定的javaphp用户来访问服务器。当每个客户端连接到服务器时,都会产生一个新的线程。一个线程占用内存2mb左右,8g内存节点不会新建一个Thread,只是发起一个事件分离前后端,写一些工具库webpack,clinode比较适合web应用场景,返回文件,读写Node核心特性事件驱动Node.jsAPI是基于事件的异步异步阻塞非阻塞(针对不同点)同步和异步,重点看消息通知机制readFilesynchronous体现在对方在等待一件事情的处理结果时是否提供通知服务。如果对方不提供通知服务,则为同步异步。如果对方提供通知服务,则为异步。阻塞和非阻塞程序都阻塞在等待消息结果的状态。在等待一件事情的处理结果的时候,你还做其他事情吗?如果不是,则为阻塞;非阻塞,等待一件事情的处理结果出来了,还要做其他事情吗?如果是这样,它是非阻塞的;Node中的全局对象this和module.exports是===console.log(this);//{}这不是全局的console.log(this===global);//falseconsole.log(this===module.exports);//trueargumentsconsole.log(arguments);//[Arguments]{//'0':{},//'1':[Function:require]{//resolve:[Function:resolve]{paths:[Function:paths]},//main:Module{//id:'.',//path:'/Users/hiraku/myself/architecture-product/node/4.global',//exports:{},//parent:null,//文件名:'/Users/hiraku/myself/architecture-product/node/4.global/index.js',//loaded:false,//children:[],//paths:[Array]//},//extensions:[对象:空原型]{//'.js':[函数],//'.json':[函数],//'.node':[函数],//'.mjs':[函数]//},//cache:[Object:nullprototype]{//'/Users/hiraku/myself/architecture-product/node/4.global/index.js':[Module]//}//},//'2':Module{//id:'.',//path:'/Users/hiraku/myself/architecture-product/node/4.global',//exports:{},//parent:null,//文件名:'/Users/hiraku/myself/architecture-product/node/4.global/index.js',//loaded:false,//children:[],//paths:[//'/Users/hiraku/myself/architecture-product/node/4.global/node_modules',//'/Users/hiraku/myself/architecture-product/node/node_modules',//'/Users/hiraku/myself/architecture-product/node_modules',//'/Users/hiraku/myself/node_modules',//'/Users/hiraku/node_modules',//'/Users/node_modules',//'/node_modules'//]//},//'3':'/Users/hiraku/myself/architecture-product/node/4.global/index.js',//'4':'/Users/hiraku/myself/architecture-product/node/4.global'//}全局键console.log(Object.keys(global));//[//'global',//'clearInterval',//'clearTimeout',//'setInterval',//'setTimeout',//'queueMicrotask',//'clearImmediate',//'setImmediate'//]process进程console.log(Object.keys(process));//['version','arch','platform','release','_rawDebug','moduleLoadList','binding','_linkedBinding','_events','_eventsCount','_maxListeners','domain','_exiting','config','abort','umask','chdir','cwd','_debugProcess','_debugEnd','_startProfilerIdleNotifier','_stopProfilerIdleNotifier','dlopen','uptime','_getActiveRequests','_getActiveHandles','reallyExit','_kill','hrtime','cpuUsage','resourceUsage','memoryUsage','kill','exit','getuid','geteuid','getgid','getegid','getgroups','initgroups','setgroups','setegid','seteuid','setgid','setuid','stdout','stderr','stdin','openStdin','allowedNodeEnvironmentFlags','assert','features','_fatalException','setUncaughtExcepmotionCaptureCallback'、'hasUncaughtExceptionCaptureCallback'、'emitWarning'、'nextTick'、'_tickCallback'、'env'、'title'、'argv'、'execArgv'、'pid'、'ppid'、'execPath'、'debugPort','argv0','_preload_modules','mainModule'process.argv//nodeindex.js--port3000console.log(process.argv);//1.当前节点的执行命令文件//2.当前执行的文件节点是谁+执行文件时,可以传参。这些参数会放在数组的第三项中//3.解析用户传入的参数//['/Users/hiraku/.nvm/versions/node/v11.10.0/bin/node',//'/Users/hiraku/myself/architecture-product/node/global/index.js',//'--port',//'3000']constargvObj=process.argv。slice(2).reduce((memo,current,index,arr)=>{if(current.startsWith('--')){memo[current.slice(2)]=arr[index+1];}返回备忘录;},{});console.log(argvObj);process.platform进程运行的平台console.log(process.platform,'platform');//darwin//win32darwincommander用法constcmd=require('commander');cmd.name('全局节点');cmd.usage('index.js');cmd.version('1.0.0');cmd.option('-p,--port','请设置你的保护');cmd.option('-c,--config','请设置你的配置文件');cmd.command('create').action(()=>{//这个方法会在运行时执行console.log('createproject');});cmd.on('--help',function(){console.log('\r\nRuncommand')console.log('\r\nnodeglobal-p3000')});constr=cmd.parse(process.argv);控制台日志(r);console.log(process.env);console.log(process.cwd());//用法:nodeglobalindex.js//选项://-V,--version输出版本号//-p,--port请设置你的prot//-c,--config请设置你的配置文件//-h,--help显示命令的帮助//命令://创建//帮助[命令]显示命令的帮助//运行命令//nodeglobal-p3000process.cwd当前工作目录,比如webpack找配置文件,搜索console.log(process.cwd());在当前工作目录中;///Users/hiraku/myself/architecture-product/node/4.global在当前命令行窗口设置环境变量//windowsetcommandexportcommand=>cross-envconsole.log(process.env)//当前进程的环境变量会用它来区分各种环境//cross-envenv=development&&nodexxxxNode实现的microtask节点的优先级其中实现的microtask比promise更高。nextTick和promise是两个队列,所以会先清除nextTick队列。nodeV10版本之后,统一执行效果与浏览器一致,执行各个宏任务。microtask会在每次queue清空后旧版本清空。process.nextTick(()=>{console.log(1);process.nextTick(()=>{console.log(2);process.nextTick(()=>{console.log(3);});});});Promise.resolve().then(()=>{console.log('promise')});//123promise如果在默认环境下执行setImmediate和setTimeout,会影响性能。setImmediate(()=>{//立即执行console.log('setImmediate');//节点中的宏任务});=>{console.log('setTimeout');},0);//setTimeout//setImmediatesetImmediatenextTicksetImmediate(()=>{console.log('setImmediate1');process.nextTick(()=>{Promise.resolve().then(()=>{console.log('承诺1');});});});setImmediate(()=>{console.log('setImmediate2');Promise.resolve().then(()=>{console.log('promise2');});process.nextTick(()=>{console.log('nextTick2');});});process.nextTick(()=>{console.log('nextTick1');});//nextTick1//setImmediate1//promise1//setImmediate2//nextTick2//promise2总结默认情况下,执行主代码时,会进入事件循环,首先检查当前定时器是否到了时间。如果到达时间,将执行定时器回调。poll阶段会执行i/o操作的回调,如果没有i/o,检查是否有setImmediate,如果有,则进入check阶段,如果没有,检查是否有timer,如果有没有定时器,也没有定时器,如果有定时器,i/o操作会结束循环,定时器到达时间后,会回到定时器阶段执行定时器的回调。每个宏任务执行完后,微任务定时器会被清零:这个阶段的执行已经被setTimeout()和setInterval()调度了回调:执行延迟I/O回调到下一次循环迭代。空闲,准备:仅供系统内部使用。轮询:检索新的I/O事件;执行与I/O相关的回调(在几乎所有情况下,除了关闭的回调,那些由定时器和*setImmediate()调度的回调),在其他情况下节点将在适当的时候阻塞在这里。检测:这里执行了setImmediate()回调函数。关闭回调函数:一些关闭回调函数,如:socket.on('close',...)。宏任务微任务分类Vue.nextTick混合任务,可能是微任务也可能是宏任务微任务promise.then,mutationObserver,process.nextTick宏任务脚本标签,ui渲染,MessageChannel(浏览器),ajax,eventevent、setTimeoutsetImmediaterequestFrameAnimation的browser是一个宏任务队列节点,多个宏任务队列的执行顺序相同