当前位置: 首页 > 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.cnnetsun.cn/news/2739570.html

相关文章:

  • PaperPass 查重准吗,2026 年四大主流检测系统横评与避坑指南
  • 2001–2017年USACO完整赛季资源包:测试数据+题面+标程+题解
  • 【企业AI成熟度诊断工具包】:含智能等级自测表、工具匹配矩阵与ROI预估模型
  • 避开这些坑,你的Nature Communications投稿就成功了一半:从格式到图表的保姆级自查清单
  • 2026乡镇同城服务创业攻略:从选址到落地全流程搭建方案
  • STM32在线升级时中断卡死?手把手教你用RAM运行中断函数(F0/F1通用)
  • 遥感新手必看:用Python+ENVI快速识别植被、水体、裸土(附光谱曲线对比图)
  • 别再只重启服务器了!深度解析百度云加速522错误的三种根源与长效优化方案
  • 量子不变量与带链表面的数学基础及应用
  • R5F100LG开发板实操代码包:LCD显示、定时器LED、蜂鸣器发声、ADC与看门狗全功能验证
  • 告别Switch游戏管理烦恼:NSC_BUILDER一站式解决方案
  • 苹果辅助功能开启引导式访问
  • 保姆级教程:手动下载并配置bert-base-chinese模型文件(附transformers 4.x版本适配指南)
  • Word高手进阶:巧用‘正规形式编号’和Tab键,打造能‘呼吸’的智能多级列表
  • 大数据毕设选题推荐:基于Python的农产品价格数据分析与可视化系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Spring AI 生产级实战:记忆管理
  • 求职路上的温暖守护
  • 如何在5分钟内实现专业级直播背景替换:OBS背景移除插件终极指南
  • 深度解析abu量化投资框架:从策略回测到自动化交易的全栈Python金融工程实战指南
  • 从‘101序列检测’实战,彻底搞懂Moore和Mealy状态机的区别(Verilog代码详解)
  • 别再手动转换了!CAPL脚本中byte/int/long数组与Hex字符串互转的通用函数库分享
  • 纳德拉一句话,Windows 41年逻辑重写:程序员,你的新同事不是人
  • TCMSP中药数据一键采集工具(带图形界面的Python可执行程序)
  • 2026年最新录音转文字工具实测:多语言长录音准确性高,好用
  • 2026年亲测AI论文写作软件榜单(高分定稿版)
  • 微信小程序计算机毕设之基于springboot+微信小程序的旅游景点导览APP的设计与实现小程序景区服务(完整前后端代码+说明文档+LW,调试定制等)
  • OpenCV-Python实战:手把手教你用滚动条做一个RGB调色板,理解颜色混合原理
  • 从波形反标失败到成功出功耗报告:手把手解决PTPX读FSDB和Link Library的那些坑
  • Surface Pro4拆机换SSD实战:避开单/双面固态的坑,附无损数据迁移教程
  • 别再只当缓冲器用了!AD8606运放的倍乘电路设计,教你玩转单电源信号放大