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

依赖Nodejs

时间:2023-04-03 12:46:56 Node.js

背景前端的历史沿革中提到,Nodejs的爆发始于2009年,Nodejs的出现是基于作者RyanDahl在web开发中对高性能的追求。要实现高性能,异步IO/事件驱动是基本原理。与一些高级语言相比,最终选择了Javascript作为开发语言。由于Javascript固有的事件驱动和单线程的特性,用Nodejs很容易编写出高性能的Web服务。简单理解NodejsNode.js是一个基于ChromeV8引擎的JavaScript运行环境。Node.js使用事件驱动、非阻塞I/O模型,使其轻量且高效。以上是官方的解释,我们还是提取关键词来理解实践。ChromeV8引擎简介V8引擎是Chrome于2008年9月2日开源发布的,V8是使用C++开发的。与其他转换为字节码或解释执行的JavaScript引擎相比,V8将其编译为原生机器码(IA-32、x86-64、ARM或MIPSCPU),并使用内部的内联缓存(inlinecaching)等提高性能的方法。有了这些特性,JavaScript程序在V8引擎下运行起来和二进制程序一样快。Chrome浏览器使用Webkit渲染引擎中的v8引擎来提高浏览器的渲染性能。上图展示了webkit的大致结构。红色部分为webkit默认引擎,在谷歌系列产品中被v8引擎取代;Nodejs是一系列站在“巨人肩膀上”的包。它的高性能离不开ChormeV8引擎。JavaScript运行环境Javascript是一种静态脚本语言,运行时必须借助引擎来运行。Javascript运行环境一般分为两种:浏览器运行环境(通常我们写的js代码只能在浏览器中运行)非浏览器运行环境(比如Nodejs,是借助V8引擎实现的)event-驱动我们在Javascript中注册一个事件(回调函数)。但是这个事件不会立即执行。只有当事件被触发时,事件(回调函数)才会被执行。这种形式是事件驱动的。非阻塞I/O阻塞:前面的程序必须等到它执行完。比如你打电话问问题,对方说你等一下,我帮你查一下。这个时候,你的电话还在挂断中,等啊等啊,等到结果出来。非阻塞:可以暂停上一个程序的执行,继续执行其他程序,等到用完。比如你打电话问个问题,然后挂了,他们查到结果就会给你打电话。在检查问题期间,你可以做任何你需要做的事情。I/O:写入(in)到磁盘和读(out)到磁盘。在程序执行的过程中,必须进行很多I/O操作,比如读写文件、输入输出、请求响应等等。I/O操作是最耗时的。比如要读取一个文件,整个线程会暂停,等待文件读取完毕再继续。也就是说,I/O操作会阻塞代码的执行,大大降低程序的运行效率。在Nodejs中,单线程可以通过回调函数(事件驱动)进行异步操作,达到非阻塞I/O的效果。安装Nodejs,可以选择官网下载的安装包。MacOS用户推荐使用brew安装#installbrewinstall-gnode#uninstallbrewuninstallnodejs使用nvm安装管理Nodejs版本curl-o-https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/安装.sh|bash#或wget-qO-https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh|bash#putenvironmentvariablesource~/.bash_profile#判断是否安装成功nvmlist#安装nodenvminstall6.14.4#or10.10.0,8.9.1,etc#判断节点是否安装成功CommonJs已经介绍过,并实现了一个简单的案例,使用exports导出模块,require导入模块。require:引入一个模块exports:导出模块内容模块:模块本身使用Nodejs创建服务//index.jsconsthttp=require('http');const主机名='127.0.0.1';常量端口=3000;constserver=http.createServer((req,res)=>{res.statusCode=200;res.setHeader('Content-Type','text/plain');res.end('HelloWorld\n');});server.listen(port,hostname,()=>{console.log(`服务器运行在http://${hostname}:${port}/`);});运行nodeindex.js将启动127.0.0.1:3000并在浏览器中输出Helloworld了解底层API路径模块提供用于处理文件路径和目录路径的实用程序。//引用constpath=require('path');path.join('/foo','bar','baz/asdf','quux','..');//returns:'/foo/bar/baz/asdf'//path.resolve()方法将路径或路径片段序列解析为绝对路径path.resolve('/foo/bar','./巴兹');//返回:'/foo/bar/baz'fs文件系统模块,读写文件和目录。//引用constfs=require('fs');//读取文件fs.readFile('./test.txt',function(err,data){if(err){throwerr;}console.log(data);});//写入文件fs.writeFile('input.txt','我是新写入的内容',function(err){if(err)console.error(err);console.log('datawrittendata');});//deletefs.unlink('/tmp/hello',(err)=>{if(err)throwerr;console.log('/tmpdeletedsuccessfully/hello');});//重命名fs.rename('/tmp/hello','/tmp/world',(err)=>{if(err)throwerr;console.log('renameDone');});更多API请参考NodejsApi官网。参考:ChromeV8引擎介绍百度百科V8介绍Nodejs官网指南