node启动卡在getaddrinfo enotfound是因离线环境dns解析失败,需用--dns-result-order=ipv4first和--no-dns(node 20.10+)绕过dns,或劫持dns模块返回预设ip,npm则需设离线源、清缓存、删node_modules并加--offline标志。

离线环境里 Node 脚本一跑就卡在 DNS 解析,根本不是网络慢,而是它还在试图查域名——必须让 Node 绕过 DNS,直接走本地或预置 IP。
Node 启动时卡在 getaddrinfo ENOTFOUND 怎么办
这是离线场景最典型的症状:脚本执行到 require('http') 或 fetch() 就停住几秒,然后报 getaddrinfo ENOTFOUND registry.npmjs.org 或类似错误。Node 默认会调用系统 DNS 解析器,而离线机器往往没配 DNS 服务器,或者 /etc/resolv.conf 为空/超时。
- 别等超时自动失败——Node 的默认 DNS 超时是数秒级,且不可通过代码直接缩短
- 临时方案:启动时加
--dns-result-order=ipv4first(Node 18.13+),但治标不治本 - 根治法:让 Node 根本不发 DNS 请求——用
--dns-result-order=ipv4first配合--no-dns(Node 20.10+)或更稳妥的NO_PROXY=*+ 强制代理地址
npm install 在离线环境卡 fetchMetadata 的真实原因
不是 npm 慢,是它默认仍尝试连 registry.npmjs.org 做元数据校验。即使你已设镜像源,npm 仍可能因缓存、锁文件或配置残留回退到官方源。
- 确认当前 registry:
npm config get registry,输出必须是离线可用地址(如https://registry.npmmirror.com) - 清空所有远程依赖痕迹:
npm cache clean --force,删掉node_modules和package-lock.json - 关键一步:加
--offline标志强制离线模式:npm install --offline,此时 npm 只读本地缓存和node_modules已有包 - 若提示 “No matching version found”,说明缓存里缺对应版本——需提前在联网机运行
npm pack <pkg></pkg>下载 tarball,再复制进~/.npm/_cacache/content-v2/
VSCode 调试器启动时解析失败怎么绕过
VSCode 的 Node 调试器(pwa-node)在 launch 阶段会尝试加载远程 source map、验证调试适配器版本,这些动作默认走网络。离线时表现为断点灰掉、F5 后卡住、控制台无输出。
- 禁用所有远程请求:在
launch.json的configurations里加"skipFiles": ["<node_internals>"]</node_internals>和"resolveSourceMapLocations": [] - 关掉自动更新检查:
"trace": false和"showAsyncStacks": false,避免调试器内部触发 fetch - TS 项目务必把
sourceMap设为true且outDir指向本地已编译目录;不要依赖inlineSourceMap,它会在 JS 文件里嵌入 base64 map,离线时无法校验 - 最关键的:用
runtimeExecutable指向本地绝对路径的node可执行文件(如/opt/node/bin/node),而不是只写"node"——后者会触发 PATH 查找,而 PATH 查找可能间接触发 DNS(某些 shell 初始化脚本含 curl)
离线环境里 require('dns') 报错怎么兼容
有些老库或自定义模块显式调用 dns.lookup() 或 dns.resolve(),离线时直接抛错。不能改库源码?那就劫持 DNS 模块。
- 在入口文件顶部(
index.js最前)插入:
const dns = require('dns');
dns.lookup = (hostname, options, cb) => {
if (typeof options === 'function') cb = options;
// 返回预设 IP 或抛同步错误,避免异步挂起
cb(null, '127.0.0.1', 4);
};
dns.resolve = () => cb(null, ['127.0.0.1']);
- 更彻底:启动时用
NODE_OPTIONS="--require /path/to/dns-patch.js"全局注入,所有子进程都生效 - 注意:这种 patch 仅适用于明确知道目标域名可硬编码的场景;若业务真需动态解析,就得提前导出 hosts 映射表,用
fs.readFileSync('/etc/hosts')手动查
离线不是“没网就行”,而是得把所有隐式网络调用——DNS、HTTP、HTTPS、甚至某些 TLS 握手里的 OCSP 检查——全部堵死或重定向。最容易被忽略的是 npm 和 VSCode 调试器底层那些不声不响的 fetch 调用,它们比你的业务代码更早触发超时。











