尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Node.js入门教程(一):初识Node.js——服务端JavaScript的诞生与特点

Node.js入门教程(一):初识Node.js——服务端JavaScript的诞生与特点 前言什么是Node.js简单地说Node.js就是运行在服务端的JavaScript。在Node.js出现之前JavaScript只能运行在浏览器中负责页面的交互和动态效果。2009年Ryan Dahl创造性地把Google Chrome的V8引擎从浏览器中剥离出来让JavaScript得以在服务器端运行——这就是Node.js的起源。Node.js不是一个编程语言而是一个运行时平台它让JavaScript能够读写文件、创建网络服务、操作数据库做一切传统服务端语言如PHP、Java、Python能做的事情。一句话概括Node.js Chrome V8引擎 事件驱动架构 丰富的标准库。一、Node.js的核心特点1.1 事件驱动与非阻塞I/O这是Node.js最核心的设计哲学。传统服务端如PHP、Java Servlet在处理请求时如果遇到I/O操作比如读取文件、查询数据库线程会被阻塞——必须等I/O完成后才能继续处理下一个请求。这意味着每个请求都需要占用一个线程并发量高时线程数量暴增内存和CPU开销巨大。Node.js的做法截然不同当遇到I/O操作时它不会等待而是立即去处理下一个请求。等I/O操作完成后通过事件回调的方式来通知处理结果。用生活中的例子来理解传统同步方式你去食堂打饭排到窗口后告诉师傅我要一份红烧肉然后你就站在窗口前等着直到师傅把菜做好端给你你才离开——这期间你什么事都做不了。Node.js异步方式你告诉师傅我要一份红烧肉师傅给你一个取餐号你就可以先去找座位坐下、刷刷手机等师傅叫号时再去取餐——等待的时间里你完全可以做其他事情。// 同步方式阻塞—— Node.js中一般不这么用 const fs require(fs); const data fs.readFileSync(/path/to/file.txt, utf8); console.log(data); // 必须等文件读完后才会执行后面的代码 console.log(这句话要等文件读完才会打印); // 异步方式非阻塞—— Node.js的推荐方式 const fs require(fs); fs.readFile(/path/to/file.txt, utf8, (err, data) { if (err) throw err; console.log(data); // 文件读完才会执行这个回调 }); console.log(这句话会立即打印不用等文件读完);这种非阻塞I/O 事件回调的机制让Node.js可以用单线程处理成千上万的并发连接非常适合I/O密集型应用。1.2 单线程与事件循环Node.js是单线程的——只有一个主线程在执行你的JavaScript代码。听到单线程你可能会担心性能问题。但Node.js的单线程指的是JavaScript代码的执行是单线程的而I/O操作实际上是由底层系统libuv库通过多线程来完成的。事件循环Event Loop是Node.js的核心机制你的代码按顺序执行遇到异步操作就交给底层处理自己继续往下走底层处理完异步操作后把回调函数放入事件队列当主线程空闲时事件循环不断地从队列中取出回调并执行这个机制让单线程的Node.js能够高效处理大量并发请求——请求来了就处理遇到I/O就挂起去处理下一个I/O完成后再回来继续。1.3 跨平台支持Node.js基于V8引擎C编写通过libuv库抽象了操作系统底层的I/O操作因此可以在Windows、Linux、macOS等多个平台上运行代码几乎不用修改。你可以用以下命令查看当前Node.js版本$ node -v v20.10.0注意不同版本之间可能存在API差异建议使用LTS长期支持版本。二、Node.js能做什么Node.js的应用场景非常广泛以下是几个典型方向应用场景说明典型工具/框架Web服务器处理HTTP请求返回HTML/JSONExpress、Koa、NestJSRESTful API / GraphQL为前端提供数据接口Express、Apollo Server实时应用聊天室、在线协作、游戏Socket.io命令行工具自动化脚本、构建工具CLI工具、Webpack后端微服务分布式系统中的一个服务NestJS、gRPC全栈开发前后端都用JavaScriptNext.js、Nuxt.js三、开发环境搭建3.1 安装Node.js访问 Node.js官网下载LTS版本安装包按提示安装即可。安装完成后在终端验证$ node -v v20.10.0 $ npm -v 10.2.3npmNode Package Manager是Node.js的包管理工具会随Node.js一起安装。3.2 选择合适的编辑器编辑器特点推荐指数VS Code免费、插件丰富、调试方便⭐⭐⭐⭐⭐WebStorm功能强大、智能提示⭐⭐⭐⭐Vim/Neovim轻量、键盘流⭐⭐⭐四、你的第一个Node.js程序4.1 脚本模式推荐方式创建一个文件hello.js写入以下代码// hello.js console.log(Hello, Node.js!); console.log(欢迎来到RUNOOB Node.js教程); // 打印当前Node.js版本 console.log(Node.js版本:, process.version); // 打印当前工作目录 console.log(当前目录:, process.cwd());在终端运行$ node hello.js输出结果Hello, Node.js! 欢迎来到RUNOOB Node.js教程 Node.js版本: v20.10.0 当前目录: /your/project/path4.2 交互模式REPL打开终端输入node进入交互模式可以逐行执行JavaScript代码$ node console.log(Hello World!); Hello World! const x 10; const y 20; x y 30 .exit # 退出交互模式交互模式适合快速测试代码片段但正式开发时还是推荐用脚本文件。4.3 第一个HTTP服务恭喜你你已经写出了第一个Node.js程序。现在让我们更进一步——用Node.js创建一个最简单的HTTP服务器// server.js const http require(http); // 创建一个HTTP服务器 const server http.createServer((req, res) { // 设置响应头告诉浏览器返回的是HTML res.writeHead(200, { Content-Type: text/html; charsetutf-8 }); // 返回响应内容 res.end( h1欢迎来到RUNOOB Node.js教程/h1 p你的第一个Node.js HTTP服务器已成功运行 /p p请求地址: ${req.url}/p ); }); // 监听3000端口 server.listen(3000, () { console.log(服务器已启动: http://localhost:3000); console.log(按 CtrlC 停止服务器); });保存为server.js然后运行$ node server.js打开浏览器访问http://localhost:3000你会看到![服务器运行效果描述]这就是一个完整的Web服务器虽然只有短短十几行代码但它已经能处理HTTP请求并返回HTML页面了。五、npm与包管理基础npm是Node.js的应用商店你可以通过它安装别人写好的第三方包也可以发布自己的包。5.1 初始化项目# 创建一个新目录 mkdir my-node-project cd my-node-project # 初始化package.json一路回车使用默认值 npm init -ypackage.json是项目的配置文件记录了项目名、版本、依赖包等信息。5.2 安装第三方包# 安装一个包如moment用于日期处理 npm install moment # 安装开发依赖只在开发时使用生产环境不需要 npm install nodemon --save-dev安装后node_modules目录会存放所有依赖包package.json中会增加依赖记录。5.3 使用第三方包// app.js const moment require(moment); const now moment(); console.log(当前时间:, now.format(YYYY-MM-DD HH:mm:ss)); console.log(今天是星期, now.day()); // 0周日, 1周一...运行$ node app.js注意node_modules目录很大不要提交到Git仓库需要在.gitignore中忽略它。六、第一个项目实战欢迎页面现在让我们把前面的知识串联起来创建一个带路由的小项目。// project.js const http require(http); const fs require(fs); const path require(path); const server http.createServer((req, res) { const url req.url; // 根据不同路径返回不同内容 if (url /) { res.writeHead(200, { Content-Type: text/html; charsetutf-8 }); res.end( h1 首页/h1 p欢迎来到RUNOOB Node.js教程/p ul lia href/about关于/a/li lia href/time当前时间/a/li /ul ); } else if (url /about) { res.writeHead(200, { Content-Type: text/html; charsetutf-8 }); res.end( h1 关于/h1 p这是RUNOOB Node.js入门教程的第一个项目。/p p我们正在学习用Node.js创建Web服务器/p a href/← 返回首页/a ); } else if (url /time) { const now new Date(); res.writeHead(200, { Content-Type: text/html; charsetutf-8 }); res.end( h1 当前时间/h1 p服务器时间: ${now.toLocaleString(zh-CN)}/p p时间戳: ${now.getTime()}/p a href/← 返回首页/a ); } else { // 404 页面 res.writeHead(404, { Content-Type: text/html; charsetutf-8 }); res.end( h1404 - 页面未找到/h1 p你访问的页面 ${url} 不存在/p a href/← 返回首页/a ); } }); server.listen(3000, () { console.log( 项目已启动: http://localhost:3000); console.log( 按 CtrlC 停止服务器); });运行并访问不同路径体验Node.js的HTTP服务能力。七、常见问题与调试技巧7.1 端口被占用# 报错Error: listen EADDRINUSE: address already in use :::3000 # 解决方案换一个端口如3001或关闭占用端口的进程7.2 代码修改后需要重启Node.js默认不会自动监测文件变化修改代码后需要手动重启# 按 CtrlC 停止再重新运行 $ node project.js开发时可以使用nodemon实现自动重启# 全局安装nodemon npm install -g nodemon # 用nodemon运行 nodemon project.js7.3 调试技巧// 使用console.log打印调试信息 console.log(变量值:, someVariable); // 使用debugger语句需要在Chrome开发者工具中调试 debugger; // 使用Node.js内置调试器 // node inspect project.js八、本章小结知识点说明Node.js是什么服务端JavaScript运行环境核心特点事件驱动、非阻塞I/O、单线程事件循环适用场景Web服务、API、实时应用、CLI工具运行方式node xxx.js脚本模式/node交互模式包管理npm安装、管理、发布第三方包
返回列表