当前位置: 首页 > 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.jsqmd.com/news/946119/

相关文章:

  • 品牌房企打造的18号线四代宅大平层,靠谱吗? - mypinpai
  • 告别编译烦恼:在Visual Studio 2013 MFC项目中直接使用预编译的Paho MQTT库
  • 微针人机界面:无创生物传感与智能给药的前沿技术解析
  • FreeRTOS 手动移植教程(二):任务管理——多任务创建、优先级抢占与删除
  • ROS节点自启动踩坑实录:从startup Application到robot_upstart,我为什么最终选择了后者?
  • 从扫地机到自动驾驶:聊聊SLAM技术如何用激光雷达和视觉传感器搞定室内外定位
  • POP3协议抓包避坑指南:Wireshark过滤器这样设,一眼锁定关键认证数据
  • Linux 内核中的内存映射:从信号捕获到自动维护监控系统
  • 选购宝马专修,宝诚汇是你的明智之选 - 工业品牌热点
  • 从‘暴力破解’到‘算法还原’:深度解析super_mega_protection.exe的密钥校验逻辑
  • Seraphine:英雄联盟智能辅助工具的终极完整指南
  • 2000年中国高速/国道/铁路线状GIS数据包(SHP格式,含完整坐标系)
  • 如何撰写高质量研究周报:从信息筛选到价值呈现的工程实践
  • AirSim 1.3.1 Python API实战:用代码控制天气、时间与碰撞检测,打造动态仿真环境
  • 互联网大厂Java面试:从Spring框架到微服务场景的技术问答
  • 性价比高的全屋定制厂家直供门窗哪个靠谱
  • 一高科技集团三大业务布局助力教育高质量发展
  • 别再手动传证书了!K8s里用cert-manager自动管理TLS证书的保姆级教程
  • Cadence 16.6老用户的福音:Library Builder汉化版详细菜单解读与配置实战
  • 别再乱用tinyint(1)了!详解MySQL、MyBatis与Java类型映射的“潜规则”与最佳实践
  • MySQL 8.0在Docker里大小写敏感踩坑记:从‘表不存在’到彻底解决的完整复盘
  • LabVIEW 2019 生成 .NET DLL 实战:手把手教你让C# WinForm调用LabVIEW加法函数
  • 别扔!全志A13老平板变身Linux小主机:Armbian镜像制作与Lima开源GPU驱动实战
  • 保姆级教程:手把手教你用FrontEnd Plus和十六进制编辑器破解Java试用版限制(附字节码修改原理)
  • 2026年现阶段海珠区小规模代理记账企业推荐:如何甄选专业、合规、高价值的财税伙伴? - 2026年企业资讯
  • 设计团队效率提升370%的秘密:我们用LLM+向量数据库重构了整个设计资产管理系统(内部泄露版技术栈全图)
  • 从手机干扰到汽车失灵:聊聊我们身边那些‘看不见’的电磁兼容(EMC)问题
  • 绕过软件保护实战:不修改super_mega_protection.exe,如何暴力破解它的用户名?
  • EduCoder实训答案查询网站是怎么做出来的?从爬虫到前端的全栈技术拆解
  • 英伟达RTX Spark登场,端侧AI能否打破现状?