游客发表
Node.js 跑起来的脱离那一刻,JavaScript 就不再是浏览络访浏览器的囚徒了。2009 年 Ryan Dahl 把 V8 引擎从 Chrome 里拽出来,器网塞进一个带文件系统和 TCP 栈的脱离运行时,这件事的浏览络访后果比很多人意识到的更彻底:JS 可以直接对着网卡发数据包了,不需要任何 DOM,器网不需要 window,脱离甚至不需要一个页面。浏览络访
我最早感受到这个变化,器网是脱离用 http 模块写了个十几行的脚本去抓某个接口的数据。没有开浏览器,浏览络访没有 DevTools,器网终端里 node fetch.js 一回车,脱离数据就回来了。浏览络访那感觉挺怪的器网——写了那么多年 XMLHttpRequest,突然发现这东西的本质不过是「发一个 HTTP 请求」,跟浏览器没什么必然关系。
net 开始Node 的 net 模块直接暴露 socket。你可以手动拼 HTTP 报文,连请求行带 header 一起写进 socket,然后读返回的字节流。我试过一次,代码如下:
const net = require('net'); const socket = net.connect(80, 'example.com', () => { socket.write('GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n'); }); socket.on('data', chunk => process.stdout.write(chunk)); 跑出来的是一堆原始响应,header 和 body 混在一起,Content-Length 还得自己解析。麻烦,但这件事说明了一个事实:网络访问在 JS 里已经退化成「字节流的读写」,HTTP 只是上面一层约定。浏览器把这层约定封装得太好,以至于很多人忘了底下是什么。
当然日常没人这么干。http / https 模块、fetch(Node 18 之后原生支持)、axios 这些才是常用工具。但知道底层长什么样,排查问题时有用。比如遇到 ECONNRESET,你就知道是 TCP 连接被对端掐了,跟 HTTP 状态码没关系。
浏览器里的 WebSocket 对象用起来很省心,onopen、onmessage 一套事件绑定完事。Node 里用 ws 这个库,API 长得差不多,但你能做的事情多得多。我做过一个行情推送的中转服务,服务端同时维持几千条 WebSocket 连接,每条连接对应一个上游数据源。浏览器端根本扛不住这种量级,Node 这边内存占用还算可控。
关键在于 Node 的 WebSocket 不只是「客户端」。它可以当服务端,可以自己握手,可以处理帧的掩码。浏览器里你只能连别人,Node 里你可以变成别人。
浏览器不会让你自定义 DNS 解析,也不让你随便信任自签证书。Node 里 dns 模块可以指定 resolver,https.Agent 能挂代理,rejectUnauthorized: false 一行就跳过证书校验(生产环境别这么干)。这些能力在爬虫、内网工具、调试代理里很实用。
我写过一个内网小工具,需要访问一台用自签证书的机器。浏览器里得手动导入证书,Node 里加个配置就完事。这种「不被浏览器安全策略绑住」的自由度,是脱离浏览器之后最直接的好处之一。
浏览器帮你处理了同源策略、CORS、cookie 管理、重定向跟随、缓存。Node 里这些要么手动实现,要么靠库。fetch 在 Node 里默认不跟随重定向,cookie 也不会自动存。第一次从浏览器切过来的人容易踩这个坑——请求发出去了,返回 302,然后就卡住了,因为没人帮你跟下一步。
另外 Node 没有 window,没有 document,任何依赖 DOM 的库直接跑不起来。jQuery 那种东西在 Node 里就是个死物。这也逼着人把「网络请求」和「页面操作」这两件事分开想,其实是好事。
说到底,JS 脱离浏览器做网络访问,不是把浏览器那套搬过来,而是换了一套更底层的工具箱。你得自己管连接、管重定向、管证书,但换来的是完全的控制权。习惯了之后,再回去写浏览器里的 fetch,反而会觉得束手束脚。
随机阅读
热门排行
友情链接