当前位置: 首页 > news >正文

认识 Node.js——从历史到你的第一个程序

摘要:Node.js 并不是一门新语言,而是 JavaScript 的“出圈”运行环境。本文会从“为什么会有 Node.js”讲起,解释它与浏览器 JavaScript 的区别、事件驱动与非阻塞 I/O 的理念,带你安装环境并完成人生第一个服务器程序。你将彻底明白 Node.js 为何能成为全栈开发的基石。


一、故事从浏览器里的 JavaScript 说起

JavaScript 诞生于 1995 年,最初只在网景浏览器里负责表单验证。很长一段时间,JavaScript 都像是“玩具语言”,被网页设计师用来实现一些鼠标悬停、弹出提示。与此同时,后端开发是 PHP、Java、Python 的天下,JavaScript 跟服务器毫无关系。

这种局面在 2008 年发生转变——Google 发布了 Chrome 浏览器和它的 V8 引擎。V8 将 JavaScript 直接编译为机器码,执行速度飞升。这让一些人开始琢磨:既然 V8 跑 JavaScript 这么快,能不能把它从浏览器里“拆出来”,让它在服务器上运行?

二、Ryan Dahl 的灵感:为什么不用事件驱动来做服务器?

2009 年,软件工程师 Ryan Dahl 对传统后端处理高并发的模式感到不满。比如 Apache 服务器,每来一个请求就开一个线程,线程多了会消耗大量内存,上下文切换也拖慢系统。他想,如果能用一个线程来处理所有请求,通过事件通知来避免等待,效率会大幅提升。

他的依据是:浏览器里的 JavaScript 已经是事件驱动的了——点击按钮触发事件、加载文件触发回调,整个 UI 都在单线程上跑,却不会卡死,这正是“非阻塞 I/O + 事件循环”的威力。于是 Ryan Dahl 把 Chrome 的 V8 引擎拿过来,用 C++ 绑定了底层操作系统的 I/O 接口,写出了一个全新的运行时,这就是 Node.js。

有趣的事实:项目最初叫web.js,后改名node.js,因为 Ryan 觉得它不只是为 web 服务,而是一个网络应用节点。

三、Node.js 到底是什么?

一句话:Node.js 是一个基于 V8 引擎的 JavaScript 运行时,使 JavaScript 能脱离浏览器,在服务器上执行。

它提供了一整套系统级 API,比如文件读写、网络通信、进程管理等。与浏览器环境最大的区别是:

特性浏览器中的 JSNode.js 中的 JS
DOM/BOM可以操作没有
文件系统安全限制,不能直接读写本地文件可读写文件、监听目录
模块系统ES6 modules(现代浏览器)CommonJS(早期)和 ESM
全局对象windowglobal
网络能力受同源策略限制可创建任意 TCP/UDP 服务

关键思想:事件驱动、非阻塞 I/O

我们用餐厅比喻来理解。传统多线程模型就像一家餐厅,每来一个客人就配一名服务员全程跟着,服务员在等客人点菜时啥也不干,餐厅能接待的人数受服务员数量限制。Node.js 模型则像只有一个服务员,这个服务员接待所有客人:递上菜单让客人自己看,然后去服务其他桌,客人点好菜会“喊一声”(事件),服务员立刻回来处理。由于服务员从不空等,一人的效率就能顶几十人。

四、Node.js 的发展历程和重要版本

  • 2009 年:Node.js 首次发布,仅支持 Linux 和 Mac。

  • 2010 年:npm(Node Package Manager)诞生,包管理生态开始成形。

  • 2011 年:Windows 版本发布,微软与 Joyent 合作移植。

  • 2014 年:Node.js 之父 Ryan Dahl 离开项目,社区开始发展。

  • 2015 年:Node.js 基金会成立,发布 v4.0.0,首次将 iojs 合并,进入长期支持轨道。

  • 2018 年:Node.js 10.x 加入稳定的 HTTP/2 支持。

  • 2020 年:Node.js 14.x 成为 LTS,ES modules 进入稳定。

  • 2023 年:Node.js 20.x 成为 LTS,性能持续优化,fetch API 稳定。

现在 Node.js 遵循偶数版本为 LTS(长期支持)的发布策略,奇数版本为实验性。

五、安装 Node.js(Windows / Mac / Linux)

去官网 nodejs.org 下载 LTS 版本即可。安装过程基本都是“下一步”。

安装完成后,打开终端(命令提示符/PowerShell/终端),输入:

node -v npm -v

如果显示版本号,说明安装成功。

建议:如果你将来可能同时维护多个 Node 项目需要不同版本,可以安装nvm(Node Version Manager)。Windows 用户用 nvm-windows,Mac/Linux 用 nvm。这样可以一键切换版本,极大方便开发。

六、第一次亲密接触:REPL 和运行脚本

Node.js 自带 REPL(Read-Eval-Print Loop)交互环境。在终端输入node回车,就可以像浏览器控制台一样写 JavaScript。

> 1 + 1 2 > const name = 'Node' undefined > `Hello ${name}` 'Hello Node'

退出 REPL 按两次 Ctrl+C 或输入.exit

现在创建第一个脚本文件。新建文件夹my-first-node,在里面创建hello.js,内容:

// hello.js console.log('Hello, Node.js!');

终端切换到该目录执行node hello.js,就会打印出信息。

还可以传入命令行参数:

// args.js console.log('命令行参数:', process.argv.slice(2));

执行node args.js 小白 加油,输出:命令行参数: [ '小白', '加油' ]

七、创建你的第一个 HTTP 服务器

Node.js 最强大的就是网络能力。几行代码就能创建一个 Web 服务器。

// server.js const http = require('http'); const server = http.createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }); res.end('<h1>你好,欢迎来到 Node.js 的世界!</h1>'); }); server.listen(3000, () => { console.log('服务器已启动,访问 http://localhost:3000'); });

运行node server.js,打开浏览器访问http://localhost:3000,就能看到网页。一个真正的后端服务就这么简单。

我们来读一下代码:

  • require('http')引入 Node 内置的 http 模块。

  • http.createServer返回一个服务器实例,传入的回调函数处理每次请求,两个参数req(请求对象)和res(响应对象)。

  • res.writeHead设置状态码和响应头。

  • res.end返回内容并结束响应。

  • server.listen(3000)让服务器监听 3000 端口。

事件循环在背后默默工作。创建服务器后,Node 进程不会退出,而是进入事件循环,不断等待新请求到来,触发回调,处理完继续等待。这就是非阻塞 I/O 的体现。

八、总结

今天我们从历史出发,明白了 Node.js 为什么诞生,它的哲学是什么。你安装了 Node,跑了脚本,写了第一个 HTTP 服务器,还回顾了必要的 JS 知识。


如果这篇文章帮你解决了实操上的困惑,别忘记点击点赞、分享,也可以留言告诉我你遇到的其它问题,我会尽快回复。动手练习是掌握编程最快的方法,请务必亲手敲一遍本文的所有示例代码,并截图保存你的成果。你的关注是我坚持原创和细节共享的力量来源,谢谢大家。

http://www.gsyq.cn/news/1457609.html

相关文章:

  • 品牌房企打造的18号线四代宅大平层,靠谱吗? - mypinpai
  • 告别编译烦恼:在Visual Studio 2013 MFC项目中直接使用预编译的Paho MQTT库
  • POP3协议抓包避坑指南:Wireshark过滤器这样设,一眼锁定关键认证数据
  • 选购宝马专修,宝诚汇是你的明智之选 - 工业品牌热点
  • Linux 内核中的内存映射:从信号捕获到自动维护监控系统
  • AirSim 1.3.1 Python API实战:用代码控制天气、时间与碰撞检测,打造动态仿真环境
  • 设计团队效率提升370%的秘密:我们用LLM+向量数据库重构了整个设计资产管理系统(内部泄露版技术栈全图)
  • 保姆级教程:手把手教你用FrontEnd Plus和十六进制编辑器破解Java试用版限制(附字节码修改原理)
  • EduCoder实训答案查询网站是怎么做出来的?从爬虫到前端的全栈技术拆解
  • 从手机干扰到汽车失灵:聊聊我们身边那些‘看不见’的电磁兼容(EMC)问题
  • 用LabelMe标注时图片闪退?可能是PIL模块在‘挑食’(附Python一键修复脚本)
  • GPT-5.5 新手快速上手与实战指南
  • XMly-Downloader-Qt5技术深度解析:Go+Qt5跨平台音频下载架构实战
  • 从手机干扰汽车收音机说起:给软件/嵌入式工程师的EMC入门科普与代码级抗干扰设计
  • Nature Communications投稿时,你的LaTeX文件真的准备好了吗?一份给技术型作者的实操指南
  • 【2024智能通知黄金标准】:基于127家客户实测数据,定义AI驱动通知的5项核心KPI
  • 【计算机科学与应用】YOLO-Apple:一种用于苹果幼果检测的改进型目标检测方法
  • QoSDiff框架:扩散模型与对抗注意力在QoS预测中的应用
  • 【企业AI成熟度诊断工具包】:含智能等级自测表、工具匹配矩阵与ROI预估模型
  • AI大模型盈利模式待解,美国专家乔·韦曼谈商业化、信任与成本问题
  • FDTD Solutions 8.0仿真效率提升指南:从手动建模到参数化扫描与优化
  • 终极指南:一键安装Windows包管理器Winget的智能解决方案
  • EBIF框架:非线性控制系统精确双线性化的新方法
  • AI赋能:让快马平台的Kimi模型为你打造会推荐懂交流的智能闺蜜浏览器
  • 别再只会用updateById了!MyBatis-Plus更新操作的三种实战场景与选择指南
  • Spring AI 生产级实战:记忆管理
  • 苹果辅助功能开启引导式访问
  • ESP8266 AP模式避坑指南:除了创建热点,这些softAPConfig和连接管理的细节你注意了吗?
  • 信号处理中的“幽灵”:常数1的傅里叶变换,那个2π到底是怎么冒出来的?
  • R语言鸢尾花分析实战包:从数据探索到模型评估全流程代码+报告