版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Node.js环境搭建与第一个Node.js程序的创建CONTENTS目录01Node.js简介02搭建Node.js环境03创建第一个Node.js程序04Node.js程序运行与调试1.Node.js简介Node.js是一个开源且跨平台的JavaScript运行时环境。简单来说,它能让JavaScript代码在服务器端或者浏览器之外的环境运行。以往,JavaScript主要在浏览器中用于实现网页的交互功能,而Node.js打破了这一限制。它基于V8引擎,使JavaScript代码具备在服务器端运行的能力,使开发者可以用JavaScript编写服务器端应用程序,极大地扩展了JavaScript的应用范围。01事件驱动Node.js采用事件驱动架构。在Node.js里它会监听各种事件,一旦事件发生,就会执行相应的回调函数。这种机制使得程序可以高效地处理多个并发操作,而无须等待一个操作完成后再进行下一个。02单线程Node.js应用在单个进程中运行,只有一个主线程。Node.js的单线程模型简单、高效,它通过事件循环来处理各种任务,一个线程就能应对大量并发请求。03非阻塞I/ONode.js的非阻塞I/O模型则不同,当执行I/O操作时,它不会阻塞主线程,而是继续执行后续代码,当I/O操作完成后,通过回调函数通知程序。1.Node.js简介Node.js具有以下特点。04异步编程由于具有非阻塞I/O和事件驱动的特点,Node.js广泛采用异步编程方式。通过回调函数、Promise、async/await等方式来处理异步操作。05高性能Node.js能够高效地处理大量并发连接,具备出色的性能表现。在处理高并发任务时,资源消耗少,响应速度快,适合用于构建对性能要求较高的应用。06npm生态npm是Node.js的包管理工具,拥有庞大的生态系统。开发者可以通过npm轻松安装、管理和分享代码模块。在npm仓库中,有成千上万个开源的模块可供使用,涵盖了各种功能,如网络框架构建、数据库操作、文件处理等。1.Node.js简介典型应用场景01搭建Web服务由于其具备高性能和事件驱动的非阻塞I/O模型,能轻松处理大量并发请求,适用于高并发、低延迟的Web应用场景。通过结合Express等Web框架,开发者可以快速搭建功能丰富、性能卓越的Web服务。02构建工具链Webpack可以用于对前端资源进行打包、压缩、优化等操作;Babel能够用于将新的JavaScript语法转换为浏览器能识别的旧语法,解决浏览器兼容性问题。通过npm安装这些工具,能极大地提升前端开发的效率和质量。03实现实时通信借助Socket.IO、WebSocket等技术,Node.js可以实现实时数据传输和双向通信,为用户提供流畅、实时的交互体验。例如在多人在线游戏中,将玩家的操作实时同步给其他玩家。1.Node.js简介2.搭建Node.js环境在Windows操作系统上安装Node.js的基本步骤如下。1.下载最新版的Node.js打开浏览器,访问Node.js官网。Node.js官网首页,通常会自动检测用户的操作系统,并推荐适合Windows操作系统的最新稳定版本(LTS版本,即长期支持版本)安装包,单击“下载”按钮进行下载。2.安装Node.js安装完成后,单击“Finish”按钮结束安装向导,然后重启系统使环境变量生效。
3.验证Node.js是否安装成功安装完成后,需要验证是否安装成功。按【Win+R】组合键,在打开的“运行”对话框中输入“cmd”,按【Enter】键打开命令行窗口。在命令行窗口中执行“node-v”命令,如果显示安装的Node.js版本号,说明安装成功。安装开发工具VisualStudioCode01下载VSCode打开浏览器,访问VisualStudioCode官网(/)。在其官网首页,找到适配Windows操作系统的下载按钮,然后单击“下载”按钮下载安装包。02安装VSCode下载完成后,运行安装包。在安装向导中,按照提示逐步进行安装,如选择安装路径、是否创建桌面快捷方式等,一般保持默认设置即可,完成设置后单击“安装”按钮。安装完成后,即可打开VSCode编写Node.js程序。2.搭建Node.js环境2.搭建Node.js环境验证Node.js与npm安装前文已经使用命令“node-v”验证了Node.js安装是否成功。对于npm(Node.js包管理工具,安装Node.js时会一并安装),同样在命令行窗口中进行验证。执行“npm-v”命令,若显示npm的版本号,说明安装成功。此外,npm默认的下载源在国外,下载速度可能较慢。可以设置淘宝镜像源来提高下载速度,在命令行窗口中执行“npmconfigsetregistry=”命令。设置完成后,可以通过执行“npmconfiggetregistry”命令来查看当前设置的镜像源是否为淘宝镜像源。配置Node.js程序开发环境01安装VSCode插件打开VSCode,单击左侧菜单栏的扩展图标。在搜索框中搜索“Node.jsExtensionPack”,这是一个包含多个对Node.js开发有帮助的插件的扩展包,单击“安装”按钮进行安装。安装完成后,它能提供语法高亮、代码自动补全、代码导航等功能,方便Node.js开发。此外,还可以安装ESLint插件,用于检查JavaScript代码是否符合规范,提高代码质量。02终端设置在VSCode的终端设置中,确保默认终端设置为命令行窗口或PowerShell等能运行node命令的终端。可以通过选择菜单栏中的“文件”→“首选项”→“设置”命令,搜索“egrated.shell.windows”进行配置。在VSCode中,选择菜单栏中的“终端”→“新建终端”命令,打开集成终端。3.创建第一个Node.js程序【操作要求】在模块1的文件夹Unit01中,使用VSCode创建JavaScript文件case0101.js,在该文件中编写代码调用全局对象console的log(),在控制台输出“HelloWorld”字符串。【实现过程】(1)在VSCode中,选择菜单栏中的“文件”→“新建文件”命令,创建一个新的JavaScript文件,将该文件命名为case0101.js,注意文件扩展名必须是.js,表示这是一个JavaScript文件。(2)在文件case0101.js中输入以下代码:console.log('HelloWorld');这段代码很简单,就是调用Node.js全局对象console的log(),在控制台输出“HelloWorld”字符串。(3)选择菜单栏中的“文件”→“保存”命令,将文件保存到文件夹Unit01中。(4)在VSCode终端提示符后面,输入命令“nodecase0101.js”,按【Enter】键,即可输出“HelloWorld”。3.创建第一个Node.js程序编写Node.js程序代码在Node.js中,CommonJS模块规范用于组织和管理代码。一个JavaScript文件就是一个模块。模块可以导出变量、函数、对象等,供其他模块使用。导出模块的语法格式:module.exports={…}导入模块的语法格式:constmodule=require('./module.js')3.创建第一个Node.js程序理解CommonJS模块规范在VSCode的终端中,使用cd命令进入包含case0101.js文件的文件夹Unit01,然后输入“nodecase0101.js”命令,按【Enter】键即可在终端看到输出“HelloWorld”。确保已在VSCode中打开要运行的Node.js文件。选择菜单栏中的“运行”→“启动调试”命令,或者直接按【F5】键。如果是第一次运行,VSCode会提示选择调试配置,选择“Node.js”。此时,VSCode会在集成终端中运行Node.js程序,并在“调试控制台”面板中输出程序运行结果。对于case0101.js文件,会在“调试控制台”面板中看到输出的“HelloWorld”。4.Node.js程序运行与调试在VSCode中运行Node.js程序调试Node.js程序01设置断点在VSCode中打开要调试的Node.js文件,例如main.js。在代码行号的左侧空白处单击,会出现一个红点,这就是断点。选择菜单栏中的“运行”→“启动调试”命令,程序会在设置的断点处暂停执行。02变量监控当程序暂停在断点处时,将鼠标指针悬停在变量上,VSCode会显示变量的当前值。在调试面板的“变量”区域,可以查看当前作用域内所有变量的值,还可以修改变量的值进行调试。03调试操作在调试过程中,可以使用调试工具栏上的按钮进行操作。例如,“继续”按钮(【F5】键)用于继续执行程序,直到遇到下一个断点;“单步跳过”按钮(【F10】键)用于执行当前行代码,并跳到下一行,但不会进入函数内部;“单步调试”按钮(【F11】键)用于进入函数内部执行代码。4.Node.js程序运行与调试打开命令行窗口(Windows)或终端(Linux、macOS)。在命令行窗口或终端的提示符后输入命令“node”,按【Enter】键后,会出现以下提示信息和提示符“>”。WelcometoNode.jsv22.14.0.Type".help"formoreinformation.>此时便进入Node.js的读取(输入)-求值-输出-循环(ReadEvaluatePrintLoop,REPL)环境。在REPL环境中,可以在提示符“>”后面直接执行JavaScript代码并立即看到执行结果。在REPL环境中,可以方便地测试JavaScript代码片段,快速验证一些代码。要退出REPL环境,在提示符“>”后面执行“.exit”命令或按【Ctrl+C】组合键两次即可。4.Node.js程序运行与调试使用REPL交互式环境
首先需要安装nodemon。在确保已经安装了Node.js和npm的前提下,在命令行窗口中执行“npminstall-gnodemon”命令,其中“-g”表示全局安装,安装完成后就可以在任何项目中使用nodemon了。如果已创建一个Node.js项目,并且项目中有一个app.js文件。在命令行窗口中,进入项目所在的文件夹,然后执行“nodemonapp.js”命令即可启动该项目。当对app.js文件进行修改并保存后,nodemon会自动检测到文件变化,并重新启动Node.js程序,无须手动停止和重新启动程序,大大提高了开发效率。这在开发过程中频繁修改代码并需要实时查看效果时非常有用。4.Node.js程序运行与调试
使用nodemon实现热重载在Node.js中,使用http模块创建一个监听3000端口的基础超文本传输协议(HypertextTransferProtocol,HTTP)服务。创建JavaScript文件task0101.js,在该文件中编写代码实现以下功能。当客户端发起请求时,服务器会返回状态码200表示请求成功,并设置响应内容类型为纯文本,向客户端发送“Hello,World!”的响应信息。运行该代码后,在浏览器地址栏输入“:3000”并按【Enter】键,就能看到页面显示“Hello,World!”。代码基本组成与要求如下。(1)通过“consthttp=require('http');”语句导入http模块。(2)调用“http.createServer((req,res)=>{…})”创建服务器实例,其中回调函数接收“req”(请求对象)和“res”(响应对象),用于处理客户端请求并返回响应。(3)使用“server.listen(port,()=>{…})”方法让服务器监听指定端口。任务1-1利用http模块搭建基础的HTTP服务任务描述1.创建文件夹与JavaScript文件2.运行与测试程序(1)启动服务器。打开终端或命令行窗口,设置子文件夹task0101为当前文件夹,然后执行以下命令:nodetask0101.js终端或命令行窗口中会输出以下信息:HTTP服务器已启动,监听3000端口打开浏览器,然后访问http://localhost:3000,页面中显示“Hello,World!”内容。(2)使用curl命令测试程序。在终端或命令行窗口中执行以下命令:curl-v:3000任务1-1利用http模块搭建基础的HTTP服务任务实施(1)创建一个模块文件math0102.js,在该文件中定义两个函数add()和subtract(),并通过module.exports将其导出,供其他模块使用。(2)创建另一个文件main0102.js,在main0102.js中,使用require()函数导入math0102.js模块,require()函数的参数是模块文件的相对路径。导入math0102.js模块后,就可以通过返回的对象(这里是math)访问该模块中导出的函数了。任务1-2通过实例体验CommonJS规范中模块的导出和导入机制任务描述1.创建文件夹2.创建JavaScript文件math0102.js3.创建JavaScript文件main0102.js在文件夹task0102中创建JavaScript文件main0102.js,然后编写以下代码。constmath=require('./math0102.js');letresult1=math.add(3,5);letresult2=math.subtract(10,4);console.log(result1);console.log(result2);4.运行与测试程序打开终端或命令行窗口,设置子文件夹task0102为当前文件夹,然后执行以下命令:nodemain0102.js终端或命令行窗口中会输出以下信息:86任务实施任务1-2通过实例体验CommonJS规范中模块的导出和导入机制Node.js模块化编程与核心API应用CONTENTS目录01Node.js模块系统02Node.js全局对象03Node.js核心模块04Node.js包管理与依赖管理05Node.js集成1.Node.js模块系统Node.js的模块系统旨在实现代码的模块化与复用,核心特点如下。内置模块:Node.js自带fs(文件系统)、http(HTTP服务)等内置模块,无须额外安装即可使用。文件模块:开发者可自定义模块文件(如utils.js),然后通过路径引入(require('./utils'))。npm模块:通过npm安装的第三方模块(如Express),可直接通过名称导入。模块缓存:首次加载后会被缓存,避免重复加载。模块作用域:模块内变量私有,通过导出接口实现共享。该系统通过清晰的模块化组织,有效管理项目依赖,提升代码可维护性与复用性,是Node.js生态的重要基石。ESM与CommonJS规范01CommonJS规范CommonJS规范是Node.js原生模块规范,默认使用此规范。采用同步动态加载(运行时解析),使用require()函数导入模块,使用module.exports或exports导出模块内容,适合服务器端开发。模块以文件为单位隔离作用域,依赖关系清晰,首次加载后缓存。文件扩展名为.js或.cjs(需在package.json中设置"type":"module"启用)。02ESM规范ESM使用import和export语法,支持异步加载和静态分析(编译时加载)。需要使用.mjs扩展名或者在package.json中设置"type":"module"启用,适用于现代浏览器和Node.js。ESM默认启用严格模式,支持顶层await,但无法直接混用CommonJS语法。1.Node.js模块系统Node.js
支持
CommonJS(传统标准)和
ESM(新标准)两种模块规范。两者的语法和加载机制有所不同,使用时可按需选择。CommonJS
可以通过动态
import()加载
ESM,而
ESM
可通过createRequire导入CommonJS模块。ESM逐渐成为趋势,但CommonJS在生态中仍广泛使用。自定义模块自定义模块是将代码封装到独立文件中,通过导出供其他文件使用,从而实现复用。自定义模块的主要操作如下。(1)创建文件:将功能代码写入文件(如utils.js)。(2)导出内容:使用module.exports(CommonJS)或export(ESM)暴露接口。(3)导入模块:使用require()(CommonJS)或import(ESM)导入模块。【验证示例2-2】(1)在文件夹Unit02中创建子文件夹demo0202。(2)创建文件utils.js与编写代码。代码如下://utils.js(CommonJS)constgreet=(name)=>'Hello,${name}!';module.exports={greet};(3)创建文件main.js与编写代码。代码如下:const{greet}=require('./utils');console.log(greet('张珊'));//输出“Hello,张珊!”(4)运行代码与输出结果。将文件夹demo0202设置为当前文件夹,执行以下命令:nodemain.js输出结果如下:Hello,张珊!1.Node.js模块系统使用import/require()导入模块
01CommonJS规范使用require()导入模块示例:constmodule=require('module-name')//导入内置或第三方模块constfs=require('fs');//内置模块constlocalModule=require('./local-module')//导入本地模块constcustom=require('./custom');//本地模块02ESM规范使用import导入模块。importmodulefrom'module-name'//默认导入importfsfrom'fs/promises';//内置模块(需在package.json中配置"type":"module"启用)import{namedExport}from'module'//命名导入import{add}from'./math.mjs';//本地模块import*asmodulefrom'module'//全部导入1.Node.js模块系统注意:ESM需明确文件扩展名(如.mjs)或配置package.json。1.Node.js模块系统module.exports与exports的主要区别有哪些?(1)module.exports:指向模块实际导出的对象,是模块真正导出的对象,可赋值为任意类型。(2)exports:module.exports的引用,只能通过属性赋值,如exports.server=page。应始终通过module.exports导出对象或函数,或通过exports.key=value添加属性。直接对exports赋值(如exports=…)会切断与module.exports的关联,导致导出失败。module.exports与exports的区别
1.Node.js模块系统Node.js按以下顺序加载模块。(1)核心模块:直接加载(如fs、http)。(2)相对路径/绝对路径:优先加载同名文件(.js、.json、.node)。例如,require('./math')查找顺序为math.js→math.json→math.node。(3)若路径为文件夹。查找package.json中的main字段指定文件。若无package.json,则加载指定文件夹下的index.js。(4)模块路径。第三方模块:从文件夹node_modules和全局模块路径中查找。模块加载顺序
1.Node.js模块系统Node.js模块首次加载后,会执行模块代码并缓存已加载的模块,后续使用require()函数加载时,会直接读取缓存结果,避免重复执行。【验证示例2-3】(1)在文件夹Unit02中创建子文件夹demo0203。(2)在文件夹demo0203中创建文件counter.js与编写代码。代码如下:letcount=0;module.exports={increment(){count++;returncount;}};(3)在文件夹demo0203中创建文件main.js与编写代码。模块缓存机制代码如下:constcounter1=require('./counter');constcounter2=require('./counter');console.log(counter1.increment());//1console.log(counter2.increment());//2(同一实例)(4)运行代码与输出结果。将文件夹demo0203设置为当前文件夹,执行以下命令:nodemain.js输出结果如下:122.Node.js全局对象在Node.js中,全局对象是一个特殊对象,所有全局变量和函数都是它的属性。其核心组成如下。(1)global对象:Node.js的顶层全局对象,类似浏览器中的window。(2)常用全局变量。①__dirname:当前模块目录路径。②__filename:当前模块文件路径。③require():导入模块的函数。④module:表示当前模块的对象。⑤exports:用于导出模块内容。(3)全局函数。①setTimeout()/clearTimeout():定时器相关函数,setTimeout()创建计时器,clearTimeout()删除计时器。②console:控制台输出工具(如console.log)。③process:进程对象,提供运行环境信息。2.Node.js全局对象在Node.js中,每个模块都有两个内置变量用于获取文件路径。①__filename:返回当前模块文件的绝对路径(包含文件名)。②__dirname:返回当前模块文件所在文件夹的绝对路径(不包含文件名)。这两个变量常用于动态拼接文件路径和加载模块,避免硬编码路径问题。例如:constfilePath=__dirname+'/data.txt'require(__dirname+'/utils.js')__filename与__dirname
2.Node.js全局对象【验证示例2-4】(1)在文件夹Unit02中创建子文件夹demo0204。(2)在文件夹demo0204中创建文件main.js与编写代码。代码如下://对于文件路径:D:\NodeCases\Unit02\demo0204\main.jsconsole.log(__filename);//输出“D:\NodeCases\Unit02\demo0204\main.js”console.log(__dirname);//输出“D:\NodeCases\Unit02\demo0204”(3)运行代码与输出结果。将文件夹demo0204设置为当前文件夹,执行以下命令:nodemain.js输出结果如下:D:\NodeCases\Unit02\demo0204\main.jsD:\NodeCases\Unit02\demo0204__filename与__dirname
2.Node.js全局对象Node.js
的
console
模块提供标准化的日志输出方法,用于向标准输出(stdout)和标准错误(stderr)输出信息,支持分级输出和格式化输出。console模块的主要应用场景包括调试代码、输出程序运行状态、错误跟踪等。console模块
2.Node.js全局对象在文件夹Unit02中,使用VSCode创建JavaScript文件case0201.js,在该文件中编写代码,使用Node.js的console模块输出当前时间,包含基础输出和格式化输出两种方式。【实现过程】(1)在文件夹Unit02中创建JavaScript文件case0201.js,在文件case0201.js中输入以下代码:使用console模块输出当前时间2.Node.js全局对象(2)保存新建的文件。(3)运行程序与输出结果。将文件夹Unit02设置为当前文件夹,然后在VSCode终端提示符后面,输入命令“nodecase0201.js”,按【Enter】键,即可输出以下信息:当前时间(原始格式):2025-05-21T07:42:28.705Z当前时间(格式化):2025/5/2115:42:28当前时间(自定义格式):2025-05-2115:42:28当前时间(占位符):2025-05-21T07:42:28.705Z关键代码解读如下。newDate():用于获取当前时间对象。toLocaleString():用于输出本地化格式。padStart():用于确保两位数显示。占位符%s:用于字符串替换。若需按特定时区输出或进行更复杂的格式化,可以结合Intl.DateTimeFormat对象或dayjs、moment等库实现。2.Node.js全局对象process是全局对象,提供与当前Node.js进程交互的接口,包含环境变量、命令行参数、进程状态等。典型应用场景包括读取命令行参数、配置环境(如区分开发/生产环境)、在进程间通信、优雅关闭服务。1.常用属性(1)process.argv。使用process.argv解析命令行参数。以数组形式获取命令行参数,返回的数组中前两个元素固定为node的路径和JavaScript文件的路径。(2)process.env。通过process.env读取环境变量对象。(3)process.pid:用于获取当前进程ID。(4)process.platform:用于获取操作系统平台的标识符,如win32(Windows)、linux(Linux)、darwin(macOS)。process对象
01process.exit(code)强制退出进程,code为退出状态码,默认为0(表示成功退出)。02process.cwd()返回进程的当前工作文件夹,与__dirname有区别。03process.nextTick(callback)将回调函数放入下一个事件循环执行,其优先级高于setImmediate()。2.Node.js全局对象常用方法事件监听01process.on('exit',callback):进程退出前触发。02process.on('SIGINT',callback):监听Ctrl+C信号,常用于优雅关闭服务器。03process.on('uncaughtException'):捕获全局异常防止进程崩溃。2.Node.js全局对象2.Node.js全局对象4.输入输出流控制(1)process.stdin:用于监听用户输入,通过.on('data',callback)捕获输入内容,或结合readline模块逐行读取。对应标准输入流(可读流),用于通过命令行或外部程序读取数据。示例代码:process.stdin.on('data',data=>{console.log('用户输入内容:',data.toString());});(2)process.stdout:对应标准输出流(可写流),用于向控制台或管道输出数据。与console.log()不同,process.stdout.write()默认不自动换行,适合精细化控制输出格式。示例代码:process.stdout.write('请输入内容:');2.Node.js全局对象【验证示例2-6】在文件夹Unit02中创建文件demo0206.js,在该文件输入以下代码:process.stdin.on('data',data=>{//监听标准输入console.log("输入内容为:",data.toString());});process.stdout.write("请输入内容:");//标准输出process.on('SIGINT',()=>{console.log('收到终止信号,正在优雅退出...');process.exit(0);});在VSCode终端提示符后输入命令“nodedemo0206.js”,按【Enter】键,在提示性文字“请输入内容:”后输入以下内容:Happyeveryday.再一次按【Enter】键,输出以下内容:输入内容为:Happyeveryday.按【Ctrl+C】组合键,输出以下内容:收到终止信号,正在优雅退出…3.Node.js核心模块Node.js核心模块是其运行时内置的基础功能模块,无须安装即可直接使用,为开发提供高效、低层级的API支持。Node.js核心模块主要包括以下几个。(1)操作系统模块(os):获取CPU、内存、网络接口等系统信息。(2)实用工具模块(util):提供继承、类型检查、调试等实用函数。(3)路径处理模块(path):提供跨平台的路径拼接、解析和规范化方法,兼容不同操作系统。(4)URL解析模块(url):解析和处理URL,提取协议、主机名、查询参数等。(5)查询参数解析模块(querystring):解析和格式化URL查询参数,如?key=value等。(6)二进制数据处理模块(buffer):处理二进制数据,适用于文件处理、网络通信等场景。(7)事件处理模块(events):基于观察者模式,支持自定义事件的触发与监听。(8)文件系统模块(fs):支持同步/异步文件操作,如读写、目录管理、权限控制等。(9)http/https模块:用于创建HTTP服务器和客户端,处理HTTP请求与响应。(10)流处理模块(stream):高效处理大文件或实时数据,分块处理数据(如大文件或网络数据),提高性能。3.Node.js核心模块os模块提供访问操作系统相关信息的工具,常用于监控服务器状态或优化程序配置过程。os模块的常用方法与属性有哪些?(1)os.cpus():返回CPU核心信息(型号、时间等)。(2)os.arch():返回CPU架构,例如'x64'。(3)os.cpus():以数组形式返回CPU核心信息。(4)os.totalmem()/os.freemem():返回系统总内存/空闲内存(单位为字节)。(5)os.platform():返回操作系统平台标识符,如linux(Linux)、win32(Windows)等。(6)os.uptime():返回系统运行时间(单位为秒)。(7)os.hostname():返回主机名。(8)os.homedir():返回用户主文件夹路径。os模块3.Node.js核心模块os模块的常见应用场景如下。
根据CPU核心数优化多线程任务。
监控内存使用情况,避免内存溢出。
监控服务器资源(如CPU负载)。
动态适配不同操作系统行为。os模块3.Node.js核心模块util模块的主要功能有哪些?(1)将回调函数转换为Promise形式(misify)。(2)提供继承机制(util.inherits)。(3)实现格式化输出(util.format)。(4)提供调试工具(util.debuglog)。(5)深度检查对象属性。util模块
3.Node.js核心模块在Node.js中,path模块是处理文件路径的核心工具,它提供了一系列方法来规范化、解析、处理和转换文件路径,避免不同操作系统路径分隔符(“/”与“\”)带来的兼容性问题。使用path模块,开发者可以高效、安全地处理文件路径,确保代码在不同操作系统上的一致性和可靠性。1.路径分隔符差异Windows:使用反斜杠“\”,如C:\user\file.txt。UNIX/Linux/macOS:使用正斜杠“/”,例如/user/file.txt。path模块会自动根据当前的操作系统选择合适的路径分隔符,确保代码跨平台兼容。2.关键术语绝对路径:从根文件夹开始的完整路径,例如/usr/bin/node。相对路径:相对当前工作文件夹的路径,例如./src/index.js。规范化路径:移除冗余的“.”“..”和双斜杠。path模块
3.Node.js核心模块path模块3.常用方法(1)路径拼接:path.join(…ths)。该方法用于将多个路径片段拼接成一个完整路径,自动处理路径分隔符和冗余符号。(2)将相对路径转为绝对路径:path.resolve(…paths)。该方法用于将相对路径转换为绝对路径,从右到左处理路径片段,直到遇到绝对路径。(3)路径解析为对象:path.parse(path)。该方法用于将路径分解为根文件夹、文件夹、文件名、扩展名等组成部分。(4)获取文件名(可排除扩展名):path.basename(path,[ext])。(5)获取文件扩展名:path.extname(path)。(6)规范化路径:path.normalize(path)。(7)获取文件夹名:path.dirname(path)。(8)获取平台的特定属性。①path.sep:获取当前平台的路径分隔符(/或\)。②path.delimiter:获取环境变量路径设置,例如PATH。3.Node.js核心模块【操作要求】在文件夹Unit02中创建子文件夹case0202,然后在子文件夹case0202中创建JavaScript文件case0202.js,在该文件中编写代码,使用Node.js的path模块的方法进行文件路径设置,分别实现安全加载文件、动态构建路径、处理文件上传、跨平台兼容等功能。【实现过程】在文件夹Unit02中创建子文件夹case0202,在其中创建JavaScript文件case0202.js,在文件case0202.js中输入以下代码:【训练实例2-2】使用path模块的方法进行文件路径设置3.Node.js核心模块url模块用于解析和处理URL,支持传统的url.parse()和现代的WHATWGURLAPI。url模块的主要应用场景包括:解析HTTP请求中的URL参数、构建和操作URL(如添加查询参数)。path模块用于处理本地文件系统路径,url模块用于处理网络URL。网络URL的路径分隔符始终是/,需用url模块处理。1.传统API:url.parse()【验证示例2-10】在文件夹Unit02中创建文件demo0210.js,在该文件中输入以下代码:url模块
3.Node.js核心模块2.现代API:newURL()【验证示例2-11】在文件夹Unit02中创建文件demo0211.js,在该文件中输入以下代码:constmyUrl=newURL('/path?a=1&b=2');console.log(myUrl.hostname);//输出“”console.log(myUrl.searchParams.get('a'));//输出“1”myUrl.searchParams.append('c','3');console.log(myUrl.href);//输出“/path?a=1&b=2&c=3”将文件夹Unit02设置为当前文件夹,然后在VSCode终端提示符后面输入命令“nodedemo0211.js”,按【Enter】键,即可看到输出结果。url模块
3.Node.js核心模块querystring模块用于解析和格式化URL查询字符串(如?key=value),常与url.parse()结合使用。querystring模块的主要方法有哪些?(1)querystring.parse(str):将字符串转换为对象。(2)querystring.stringify(obj):将对象转换为字符串。(3)querystring.escape()/querystring.unescape():编码/解码特殊字符。示例代码:qs.escape('HelloWorld!');//输出“Hello%20World%21”qs.escape('你好');//输出“%E4%BD%A0%E5%A5%BD”qs.unescape('Hello%20World%21');//输出“HelloWorld!”querystring模块
3.Node.js核心模块buffer是Node.js处理二进制数据(如文件、网络包)的核心模块,无须导入即可使用。其常见应用场景包括文件I/O、网络通信(如HTTP请求/响应)、图片处理、音视频等二进制文件处理、网络协议数据包解析等。1.创建Buffer(1)从字符串创建。(2)创建指定长度的Buffer(初始化为0)。(3)从数组创建(字节值)。2.常用操作(1)转换编码。(2)拼接Buffer。(3)比较与切片。(4)读写操作。buffer模块3.Node.js核心模块events模块是实现Node.js事件驱动架构的核心模块,基于发布/订阅模式,支持多监听器、一次性监听(once)。其常见应用场景包括HTTP服务器的请求处理、文件流的读写事件、自定义模块间的通信等。1.核心类:EventEmitter内置模块(如fs、net)均继承自EventEmitter。2.关键方法(1)on(event,listener):注册事件监听器。(2)once(event,listener):只触发一次的监听器。(3)emit(event,[…args]):触发事件并传递参数。(4)removeListener(event,listener):移除监听器。(5)setMaxListeners(n):设置最大监听器数量,默认值为10,防止内存泄漏。events模块4.Node.js包管理与依赖管理Node.js的包管理与依赖管理是其生态系统的核心。通过npm或Yarn等工具,开发者可便捷安装、共享和管理模块。package.json文件记录项目依赖及其版本,依赖管理支持语义化版本控制,配合package-lock.json锁定依赖的精确版本,确保环境一致性;还能处理嵌套依赖并通过扁平化策略解决版本冲突,保障项目稳定性与可复现性。模块化设计与扁平依赖树有助于提升效率,依赖冲突可通过工具自动解决或手动调整,这种机制极大促进了Node.js社区的协作效率与创新效率。4.Node.js包管理与依赖管理模块是代码单元,包是模块的集合。(1)模块:Node.js中最小的代码单元,通过exports或module.exports暴露接口,可被其他文件导入。模块包含单个自定义模块(JS文件)、内置模块(如fs)或第三方模块等。(2)包:一个或多个模块的集合,包含package.json文件,用于描述包的元信息(名称、版本、依赖等)。一个完整的项目或第三方库(如lodash)即一个包。
包与模块的区别4.Node.js包管理与依赖管理npm是Node.js的默认包管理器,用于安装、更新、删除依赖。安装的包默认保存于node_modules目录中,依赖信息保存在package.json和package-lock.json中。1.核心命令npm的核心命令如下。npminit-y:初始化package.json。npminstall<package>:安装指定依赖(写入dependencies)。npminstall<package>--save-dev:安装开发依赖,--save-dev也可简写为-D。npmuninstall<package>:卸载指定依赖。npmupdate<package>:更新指定依赖。npmupdate:更新所有依赖。npmrun<script>:执行package.json中的脚本。npmlist--depth=0:查看已安装的依赖。使用npm
4.Node.js包管理与依赖管理2.关键特性(1)语义化版本:通过package.json的dependencies指定版本范围(如^1.2.3)。(2)缓存机制:下载的包会缓存到本地(默认为~/.npm),加速重复安装过程。(3)生命周期脚本:通过package.json的scripts字段定义自定义命令。使用npm
4.Node.js包管理与依赖管理Yarn是Meta(前身是Facebook)推出的高性能包管理器,兼容npm的生态系统。npm和Yarn按需选择,Yarn适合追求稳定性的场景。npm5+已支持package-lock.json,两者差异缩小,但Yarn仍以稳定性和性能著称。1.核心优势(1)速度更快:可并行下载依赖,缓存机制优化。(2)确定性安装:yarn.lock文件严格锁定依赖版本,避免环境差异问题。(3)离线模式:支持无网络时从缓存安装依赖。使用Yarn
4.Node.js包管理与依赖管理2.常用命令Yarn的核心命令如下。yarninit-y:初始化package.json。yarnadd<package>:安装指定依赖。yarnadd<package>--dev:安装开发依赖。yarnremove<package>:卸载指定依赖。yarnupgrade<package>:更新指定依赖。yarnupgrade:更新所有依赖。yarn<script>:执行脚本。使用Yarn
4.Node.js包管理与依赖管理package.json是项目的核心配置文件,包含以下关键字段。(1)依赖管理。{"dependencies":{//生产环境依赖(运行时必需)"lodash":"^4.17.21"},"devDependencies":{//开发环境依赖,测试、构建工具等"jest":"^29.5.0","eslint":"^8.0.0"},"peerDependencies":{//对等依赖(插件需宿主环境支持)"react":">=16.8.0"}}package.json配置解释
4.Node.js包管理与依赖管理(2)脚本定义。{"scripts":{"start":"nodeapp.js",//启动命令(npmstart)"build":"webpack--configwebpack.config.js",//构建命令"test":"jest",//测试命令"lint":"eslintsrc"//代码检查}}package.json配置解释
4.Node.js包管理与依赖管理(3)其他常用字段。{"name":"my-project",//项目名称或包名(必填项)"version":"1.0.0",//版本号(遵循语义化版本)"main":"index.js",//入口文件"private":true,//设置为true防止意外发布"engines":{//指定Node.js和npm版本要求"node":">=14.0.0","npm":">=6.0.0"}}通过npmrun<script>执行脚本,例如npmrunstart。package.json配置解释
4.Node.js包管理与依赖管理配置路径映射可以简化模块导入路径,避免../../../嵌套。(1)TypeScript项目(tsconfig.json)。通过compilerOptions.paths配置模块路径别名,简化代码中的路径引用。示例代码:{"compilerOptions":{"baseUrl":".","paths":{"@utils/*":["src/utils/*"],//将@utils/映射到src/utils/目录"@components/*":["src/components/*"]}}}使用tsconfig.json或package.json配置路径映射
4.Node.js包管理与依赖管理(2)JavaScript项目(package.json)。通过_moduleAliases字段配置别名,需配合module-alias库。示例代码:{"_moduleAliases":{"@config":"src/config","@lib":"src/lib"}}安装依赖并在入口文件中启用的示例代码如下:npminstall--savemodule-aliasrequire('module-alias/register');//在入口文件顶部导入importconfigfrom'@config';//使用别名使用tsconfig.json或package.json配置路径映射
4.Node.js包管理与依赖管理在Node.js开发中,环境变量一般通过process.env(Node.js内置对象)访问,如process.env.NODE_ENV。它为管理数据库连接字符串、API密钥、端口号等敏感数据提供了便利,既避免了敏感信息在代码中的硬编码,又支持在不同部署环境下灵活切换配置,极大地提升了应用的安全性和灵活性。1.环境变量设置方法(1)使用命令行临时设置。(2)使用.env文件设置。需要使用dotenv库从.env文件中加载环境变量。执行以下命令安装dotenv库:npminstalldotenv2.配置文件管理按环境拆分配置,如config/dev.json、config/prod.json,动态加载配置。环境变量与配置文件管理4.Node.js包管理与依赖管理1.语义化版本(SemVer)(1)格式:主版本号.次版本号.修订号(如2.1.3)。(2)版本范围符号:>,大于指定版本;>=,大于等于指定版本;<,小于指定版本;<=,小于等于指定版本;~,允许修订号更新;^,允许次版本号和修订号更新;-,指定一个闭区间版本范围;*,任意版本。2.Lock文件Lock文件是协作与部署的基石。package-lock.json(npm)/yarn.lock(Yarn)精确记录安装的确切版本和依赖树结构,确保团队成员或持续集成(ContinousIntegration,CI)环境安装的依赖版本完全一致,避免因依赖版本浮动导致的问题。依赖版本控制Node.js与TypeScript集成TypeScript是JavaScript的超集,通过TypeScript的静态类型检查和现代语法增强Node.js开发的健壮性与可维护性,提升代码质量和可维护性,适用于中大型项目。Node.js与TypeScript集成的优势主要体现在以下几方面。(1)类型安全减少运行时错误。(2)支持ES6+语法(如装饰器、可选链)。(3)IDE智能提示提升开发效率。5.Node.js集成Node.js支持与TypeScript和WebAssembly(Wasm)深度集成,提升开发体验和性能。两者结合增强了Node.js的能力,使其在类型安全和性能关键场景更具竞争力。5.Node.js集成WebAssembly允许高性能代码在浏览器和Node.js中运行,通过WebAssembly执行高性能计算任务(如加密、图像处理),突破JavaScript性能瓶颈。两者结合适用于处理密集型任务(如游戏、音视频处理)。集成后的性能接近原生代码速度,适用于处理CPU密集型任务。复用C/C++、Rust生态的算法库。Wasm运行在沙箱中,隔离性好。实现步骤如下。(1)编译Wasm模块。使用Rus、C/C++编写代码,通过工具链(如wasm-pack)编译为.wasm文件。示例代码(Rust):#[no_mangle]pubfnadd(a:i32,b:i32)->i32{a+b}(2)在Node.js中加载。Node.js与WebAssembly集成为了便于复用和维护,编写代码将以下常用工具函数按功能拆分到不同模块。(1)格式化输出日期的工具函数formatDate()。(2)判断日期数据是否为当天日期的工具函数isToday()。(3)将英文单词首字母转换为大写格式的工具函数capitalize()。(4)从字符串中截取指定个数字符的工具函数truncate()。使用示例代码调用上述函数,验证其功能。任务2-1将常用工具函数按功能拆分到不同模块任务描述1.创建文件夹2.在文件夹utils中创建JavaScript文件在文件夹utils中分别创建JavaScript文件date.js和string.js。3.在文件夹task0201中创建JavaScript文件main.js在文件main.js中编写以下代码:constdateUtils=require('./utils/date');conststringUtils=require('./utils/string');console.log(dateUtils.formatDate(newDate()));//输出“2025-05-23”(期望输出)console.log(dateUtils.isToday(newDate("2025-05-20"))); //输出“false”console.log(stringUtils.capitalize('better')); //输出“Better”console.log(stringUtils.truncate('Happyeveryday',5)); //输出“Happy”4.运行代码与输出结果将文件夹task0201设置为当前文件夹,然后执行以下命令:nodemain.js按【Enter】键,可以看到运行的结果。任务2-1将常用工具函数按功能拆分到不同模块任务实施创建路径别名解析器,实现类似Webpack的路径别名功能,简化深层嵌套模块的导入过程。任务2-2创建路径别名解析器任务描述1.创建文件夹在文件夹Unit02中创建子文件夹task0202,然后在文件夹task0202中分别创建子文件夹config和src,在文件夹src中创建子文件夹utils。2.创建JavaScript文件在文件夹config中创建JavaScript文件db.js,在文件夹src中创建JavaScript文件app.js,在文件夹utils中创建JavaScript文件helpers.js,以上文件均无须编写代码。3.运行代码与输出结果将文件夹task0202设置为当前文件夹,然后执行以下命令:nodepath-resolver.js按【Enter】键,可以看到运行的结果。任务实施封装事件发射器,添加日志记录功能,便于在应用中实现松耦合的组件通信。任务2-3封装事件发射器,添加日志记录功能任务描述1.创建文件夹在文件夹Unit02中创建子文件夹task0203。2.创建JavaScript文件3.运行代码与输出结果
将文件夹task0203设置为当前文件夹,然后执行以下命令:nodemain.js按【Enter】键,可以看到以下运行结果:Listeneraddedforevent:user:createdEmittingevent:user:createdNewusercreated:李明任务实施通过控制台输入实现简单的四则运算,接收两个数字和一个操作符,返回计算结果,例如nodecalc.js5+3,直观展示Node.js处理输入输出的能力。任务2-4创建简单计算器任务描述1.创建文件夹在文件夹Unit02中创建子文件夹task0204。2.创建JavaScript文件在文件夹task0204中创建JavaScript文件calc.js,在该文件中编写代码。从本书配套的教学资源中打开“实战任务2-4”对应的程序文件calc.js,浏览相应代码。3.运行代码与输出结果
将文件夹task0204设置为当前文件夹,然后执行以下命令:nodecalc.js5+3按【Enter】键,可以看到以下运行结果:5+3=8任务实施Node.js异步编程与事件驱动CONTENTS目录01异步编程基础02事件机制03定时器与执行顺序04事件循环的执行顺序05异步控制Node.js采用异步、非阻塞I/O和事件驱动模型实现高性能并发。其核心是通过事件循环(EventLoop)管理异步操作,结合回调函数、Promise、async/await等机制处理异步流程。回调函数:早期方案(如fs.readFile(callback))易导致回调地狱。Promise:链式调用优化异步流程,支持.then()和.catch()。async/await:语法糖使异步代码更易同步,需配合try/catch处理错误。事件驱动:基于EventEmitter类(如http模块),通过on()监听事件、emit()触发事件,实现解耦通信。Node.js的异步模型避免了线程阻塞,适合高并发I/O场景(如Web服务器),但需注意回调地狱和错误处理的规范性。1.异步编程基础异步编程允许代码在等待耗时操作(如网络请求、文件读写)时继续执行后续任务,而不是“干等”。回调函数是异步编程的基石,但过度嵌套会降低代码质量、引发回调地狱。后续会介绍Promise、async/await等更优雅的解决方案,以规避这一问题。1.什么是异步编程可以把程序执行类比为排队办理业务:在同步编程模式下,每个任务必须完全结束后才能开始下一个任务,就像队伍中的人必须等前面的人办完所有事项才轮到自己,在这之前只能干等(阻塞);而异步编程模式,则允许在当前任务因等待(如I/O操作)而暂停时,程序能够先去处理其他独立的任务,待原任务就绪后再继续执行,就像在购物广场的餐厅用餐时,先取号,然后逛商场,有空桌后再按照号顺序就餐。异步编程概念
1.异步编程基础2.异步编程的核心优势:非阻塞I/O计算机的I/O操作(如读写文件、网络请求)速度远慢于CPU计算速度。在同步模式下,执行到耗时操作时,代码会“卡住”,程序必须等待I/O完成才能继续,就像排队时每个人必须完全结束后才能轮到下一位。而异步编程通过“非阻塞I/O”机制,让程序在等待I/O时不阻塞后续任务执行,I/O操作完成后通过回调等方式通知结果。此方式大大提高了资源利用率,适合高并发场景。例如,浏览器同时加载多张图片,无须等一张加载完再加载下一张。3.异步编程的“甜蜜”烦恼:回调地狱异步编程需要通过“回调函数”处理任务结果,如I/O完成后需要执行的操作。但当需要顺序执行的多个异步操作任务存在依赖关系时,代码会嵌套多层回调函数,形成“回调金字塔”结构。异步编程概念
1.异步编程基础1.异步编程的“接力棒”:回调函数回调函数是异步编程的基础,本质是把函数作为参数传递给异步方法,操作完成后自动调用该函数处理结果。例如://定义回调函数functionhandleResult(err,result){if(err)console.error('出错了:',err);elseconsole.log('输出结果:',result);}//异步任务(模拟网络请求)setTimeout(handleResult,1000,null,'数据返回了!');这里的handleResult()就是回调函数,1秒后异步任务完成,会带着结果调用它。回调函数与回调地狱1.异步编程基础2.回调函数的“安全协议”:错误优先原则为了规范异步代码的错误处理,Node.js约定了“错误优先”的回调格式:回调函数的第1个参数永远是错误对象err(可能为null),第2个参数是结果。这样开发者可以统一通过if(err)先处理错误,再处理逻辑,避免漏掉关键异常。例如:fs.readFile('file.txt',(err,data)=>{if(err){console.error("读取失败:",err);//优先处理错误return;}console.log('文件内容:',data);//再处理成功逻辑});回调函数与回调地狱1.异步编程基础3.回调地狱的困境:金字塔陷阱当多个异步任务需要按顺序执行(A→B→C),且每个任务都依赖前一个的结果时,回调函数会层层嵌套,形成“嵌套过深”的问题。可读性差:代码向右缩进越来越多,像金字塔一样难以阅读。维护困难:新增一个步骤需要修改多层嵌套,牵一发而动全身。错误处理复杂:错误传递路径不清晰,难以定位具体问题。例如,假设需要“读取用户信息→根据信息查询订单→根据订单生成报表”,同步代码可能只需要3行,而异步回调代码可能变成3层嵌套,每增加一个步骤就多一层嵌套,最终导致代码难以维护。回调函数与回调地狱2.事件机制事件机制是异步编程的核心实现方式,理解事件循环的调度规则有助于写出更高效的代码,而EventEmitter提供了灵
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中层竞聘面试试题及答案
- 叉车操作考试题目及详细答案解析
- 2026中国虚拟数字人产业应用场景拓展与商业化变现模式研究
- 2026清洁能源技术研发行业市场供需分析及商业化发展策略研究
- 2026人工智能农业应用研究探讨及行业市场前景与农业科技报告
- 2026南亚智能照明控制系统现存供给需求空间调研及投资价值规划分析报告
- 2026贸易服务行业市场发展数据处理及投资发展策略与投资管理报告
- 2026中国光学镜头车载监控市场增长驱动与安防厂商转型战略
- 2026汽车维修保养行业市场供需发展前景投资分析规划研究文件
- 2026中国商业航天发射服务市场竞争格局与政策支持分析报告
- 耳尖放血疗法课件
- 2025外研社小学英语四年级上册单词表(带音标)
- GB/T 8243.6-2025内燃机全流式机油滤清器试验方法第6部分:静压耐破度试验
- 医疗口腔开业活动方案
- 经营性公路建设项目投资人招标文件
- ISO基础知识培训课件
- 化验室风险点及预防措施
- 2024年度食用葵花籽油购销协议模板版
- GB/T 41666.7-2024地下无压排水管网非开挖修复用塑料管道系统第7部分:螺旋缠绕内衬法
- (人教2024版)七年级数学开学第一课-课件
- 2024年普通高等学校招生全国统一考试数学试题理全国乙卷含解析
评论
0/150
提交评论