NodeJS
2026-05-07
-> % sudo npm install -g nrm
added 31 packages in 16s
6 packages are looking for funding
run `npm fund` for details
-> % nrm
Usage: nrm [options] [command]
npm registry manager can help you switch different npm registries easily and quickly
Options:
-V, --version output the version number
-h, --help display help for command
Commands:
ls List all the registries
current [options] Show current registry name or URL
use [name] Change current registry
add <name> <url> [home] Add custom registry
login [options] <name> [base64] Set authorize information for a custom registry with a base64 encoded string or username and password
set-hosted-repo <name> <repo> Set hosted npm repository for a custom registry to publish package
set-scope <scopeName> <url> Associating a scope with a registry
del-scope <scopeName> Remove a scope
set [options] <name> Set a custom registry attribute
rename <name> <newName> Change custom registry name
del [name] Delete custom registry
home <name> [browser] Open the homepage of registry with optional browser
test [registry] Show response time for specific or all registries
help [command] display help for command
-> % nrm ls
npm ---------- https://registry.npmjs.org/
yarn --------- https://registry.yarnpkg.com/
tencent ------ https://mirrors.tencent.com/npm/
cnpm --------- https://r.cnpmjs.org/
* taobao ------- https://registry.npmmirror.com/
npmMirror ---- https://skimdb.npmjs.com/registry/
huawei ------- https://repo.huaweicloud.com/repository/npm/
NodeJS Golang
2026-01-10
在 2026 年的后端技术版图中,Node.js 与 Golang 的博弈早已超越了单纯的“性能跑分”。Node.js 赢在开发效率和 I/O 并发的性价比,而 Go 赢在多核并行上限和系统级稳定。
高并发不等于 CPU 忙,大部分 Web 高并发场景本质是“等 I/O”,所以 Node.js 从未掉队;只有当面临算力密集型需求或超大规模微服务底座时,Go 的优势才会彻底显现。
Node.js 胜在开发效率与 I/O 并发性价比,适合 BFF 与实时应用;Go 赢在多核并行、内存优化与系统级稳定,适合 CPU 密集与大型微服务。
比如在大多数 Web 项目中,主要的
核心机制:单线程事件循环 VS 协程并行
理解两者的差异,首先要打破“并发即并行”的迷思。
Node.js 就像一个熟练的厨师同时照料着 10 个锅。它采用单线程加事件循环的机制,遇到 I/O 操作(如网络请求、数据库查询、文件读写)时,就通过挂起回调来处理其他任务,实现了并发但不并行的工作方式。这表示任意时刻只有一段 JS 代码在运行,虽然这样效率很高,但却无法发挥多核处理器的优势。
Go 语言则如同一个完整的厨师团队。使用 go 关键字启动 Goroutine 后,由 Runtime 负责调度到多个 CPU 核心上,实现真正的并行处理,让多个任务能够同步进行。
关键区分在于:并发是处理多个任务的能力,并行是同时执行多个任务的能力。Node.js 胜在前者,Go 胜在后者。
性能边界:I/O 与 CPU 的分水岭
性能的选择取决于业务瓶颈在哪里。
在 I/O 密集型场景(如 API 网关、CRUD、查库、调第三方接口),瓶颈往往在网卡、磁盘或数据库,而不在语言运行时。此时 Node.js 的事件循环和 Go 的协程效果接近,都能轻松扛住上万连接。
但在 CPU 密集型场景(如图片压缩、视频转码、加解密、重计算),Node.js 的单线程一旦被一段重计算卡住,整个进程的响应时间就会抖动,新请求无法进入;而 Go 可以将任务分散到多核,不阻塞主服务,在此场景下 Go 完胜。
此外,在内存占用上,Node.js 挂起的异步任务只是个回调,极轻;而 Go 每个 Goroutine 约占 2KB。在极端海量连接时,Node.js 反而略占优,尽管差距很小。
进阶视角:内存、冷启动与尾部延迟
除了基础机制,Go 在内存管理和冷启动上拥有 Node.js 难以逾越的优势。
除了基础机制,Go 在内存管理和冷启动上拥有 Node.js 难以逾越的优势。
在承受相同并发压力时,Go 版本的内存使用量通常只有 Node.js 的五分之一甚至更低。Node.js 的 V8 引擎启动需预分配大量内存,且“万物皆对象”导致堆内存开销巨大;而 Go 允许使用紧凑的值类型,并能智能地将短生命周期变量直接分配在栈上(用完即销,无需垃圾回收),内存管理极其高效。
同时,Go 作为编译型语言,直接编译为机器码,没有预热过程。在 Serverless 场景或微服务频繁重启时,Go 的毫秒级冷启动和首请求低延迟表现远优于 Node.js。
在高并发压测中,瓶颈往往在于“等待”。Node.js 虽然原始吞吐量不如 Go,但它天然的单线程摩擦像一个“软限流”,迫使系统正视反压,在下游抖动时反而能保持相对平稳的 P99 延迟。Go 虽然吞吐上限极高,但在突发流量下,其垃圾回收压力和 Goroutine 调度偶尔会在 P99 延迟上产生毛刺,这对团队的容量规划提出了更高要求。
同时,Go 作为编译型语言,直接编译为机器码,没有预热过程。在 Serverless 场景或微服务频繁重启时,Go 的毫秒级冷启动和首请求低延迟表现远优于 Node.js。
在高并发压测中,瓶颈往往在于“等待”。Node.js 虽然原始吞吐量不如 Go,但它天然的单线程摩擦像一个“软限流”,迫使系统正视反压,在下游抖动时反而能保持相对平稳的 P99 延迟。Go 虽然吞吐上限极高,但在突发流量下,其垃圾回收压力和 Goroutine 调度偶尔会在 P99 延迟上产生毛刺,这对团队的容量规划提出了更高要求。
为什么高并发系统依然偏爱 Node.js
真实工程中,技术选型往往不是性能至上,而是综合成本的考量。
开发速度是首要因素。JS/TS 实现了前后端同语言,CRUD、API、BFF 层出活极快,npm 生态的海量包更是如虎添翼。
其次是 I/O 场景够用。多数业务系统的瓶颈在数据库和下游服务,不在语言运行时,Node.js 完全顶得住。
团队匹配度也不容忽视。前端团队能直接写后端,招聘和协作成本大幅降低。
在实时/长连接场景(如 WebSocket、聊天室、Agent 等待 LLM 响应),Node.js 的事件循环天然契合这种“傻等 I/O”的场景。
终极解法:混合架构与选型对照
在大型复杂系统中,最成熟的做法往往是微服务架构下的混合选型。
让 Node.js 作为 BFF 层或前端网关,负责处理客户端请求、静态文件服务、轻量级 RESTful API 以及实时通信,发挥其开发快、生态全的优势。
让 Go 作为核心业务底座,负责高吞吐量的数据处理、复杂的计算密集型任务、底层微服务以及高频的内部 RPC 调用,发挥其多核并行和稳定上限的优势。
NodeJS
2026-01-03
npx 是 Node.js 生态中的命令行工具,全称可以理解为 Node Package eXecute,主要用于直接执行 npm 包提供的命令行程序。
它最初由 npm 工程师 Kat Marchán 开发,后来被纳入 npm CLI,现代版本的 npx 本质上是 npm exec 的命令行入口。因此,安装 Node.js 和 npm 后通常即可直接使用 npx,无需额外安装。
npx 最大的价值是无需全局安装 CLI 工具即可直接运行。例如,执行 npx prettier . 时,如果当前项目已经安装 Prettier,npx 会优先使用项目中的版本;如果没有,则可以获取相应的 npm 包并执行。这样既避免了大量全局工具污染,也能够减少“本机安装的 CLI 版本与项目要求不一致”的问题。
常见用法包括:
# 执行 npm 包
npx prettier .
# 执行指定版本
npx create-vite@latest my-app
# 执行指定 npm 包
npx --package=typescript tsc --version
# 在当前项目环境中执行命令
npx eslint src/
# 查看 npx 帮助
npx --help
npx 还特别适合执行一次性工具。例如创建项目、代码格式化、代码检查、数据库迁移、脚手架初始化等场景,都没有必要为了偶尔使用一次 CLI 而进行全局安装。
npx skills
近年来,npx 又成为 AI Agent Skills 生态的重要分发入口。例如:
npx skills add owner/repository
skills 是由 Vercel Labs 发布的一个 npm 包,负责从 GitHub 等代码仓库发现、安装和管理 Skills。
这个命令就是是用 npx 启动 skills CLI,并将参数传递给 skills CLI,而具体的 Skills 这是通过 GitHub 分发。
NodeJS
2021-12-14
Node 包都存储在 Registry 中,官方 Registry 是 npmjs.org。
切换源
npm config set registry https://registry.npm.taobao.org
或者直接修改 ~/.npmrc, 加入:
registry = https://registry.npm.taobao.org
下载的时候也可以指定:
npm info lodash --registry https://registry.npm.taobao.org
包管理器
- npm

- yarn

Facebook 出的, 对 npm 做了一些优化,npm 后面也做了类似的优化
- cnpm

淘宝出的,主要是默认使用淘宝自己维护的国内镜像
- pnpm

- entropic

据说是 NPM 前 CTO 成立的新项目,目标是去中心化
包依赖的语法
~ 匹配最近的小版本, eg: ~1.2.3 会匹配 1.2.x
^ 匹配最新的大版本,eg: ^1.2.3 会匹配所有 1.x.x
* 永远最新版本
参考资料与拓展阅读
NodeJS 网络编程 Socket
2021-01-31
本月,听了同事做的一次技术分享,觉得很有意思的问题,我在这里隐去业务细节,只保留技术部分,做个总结归纳,最后用一个业务无关的脚本来模拟一下这个过程。
同事的分享就好比是先逐步实验发现一个现象,然后研究出他背后的原理是什么。我在这里作为事后的归纳总结,就直接冲着背后的原理说了。
NodeJS
2019-04-17
线上某些基于 nodejs 的服务时不时看到这种进程,而且一直都在:
root 25997 1 0 Mar25 ? 00:00:00 /root/.nvm/versions/node/v10.14.2/bin/node /root/.nvm/versions/node/v10.14.2/lib/node_modules/npm/node_modules/update-notifier/check.js {"pkg":{"name":"npm","version":"6.4.1"}}
经过检查判断,这是 npm 带来的一个依赖模块,用来做版本检测。
NodeJS
2018-04-27
sudo apt install -y nodejs npm
# 已经不需要这句了:
# sudo ln -s `which nodejs` /usr/bin/node
# node -v
# npm -v
npm config set registry=https://registry.npm.taobao.org
sudo npm upgrade -g npm
# sudo npm install -g yarn --registry=https://registry.npm.taobao.org
curl --compressed -o- -L https://yarnpkg.com/install.sh | bash
yarn config set registry https://registry.npm.taobao.org
配置
echo registry=https://registry.npm.taobao.org > ~/.npmrc
npm config get registry
https://registry.npmjs.org/
npm config set registry=https://registry.npm.taobao.org
yarn config get registry
https://registry.yarnpkg.com
yarn config set registry https://registry.npm.taobao.org
JavaScript NodeJS
2017-02-12
"ni wo ta".split(" ");
// [ 'ni', 'wo', 'ta' ]
"ni wo ta".split(" ", 1);
// [ 'ni' ]
"ni wo ta".split(" ", 2);
// [ 'ni', 'wo' ]
"ni wo ta".split(" ", 3);
// [ 'ni', 'wo', 'ta' ]
"ni wo ta".split(" ", 4);
// [ 'ni', 'wo', 'ta' ]
"ni wo ta".split(":");
// [ 'ni wo ta' ]
"ni wo ta".split(":", 1);
// [ 'ni wo ta' ]
"ni wo ta".split(":", 2);
// [ 'ni wo ta' ]
如果要一刀将字符串切两半:
var line = "a : b : c";
var part1 = line.split(":", 1)[0];
if (a !== line) {
var a = part1.trim();
var b = line.substr(part1.length + 1).trim();
console.log([a, b]);
}
var line = "a : b : c";
var index = line.indexOf(":");
if (index != -1) {
var a = line.substr(0, index).trim();
var b = line.substr(index + 1).trim();
console.log([a, b]);
}
参考资料与拓展阅读