news 2026/10/19 10:26:53

Ubuntu 18.04安装Node.js完全指南:六种方案对比与避坑实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ubuntu 18.04安装Node.js完全指南:六种方案对比与避坑实践

每次帮人排查服务器上的Node.js环境,我做的第一件事永远是问一句:当初是怎么装的?因为Ubuntu 18.04上安装Node.js的方式起码有五六种,每一种带来的环境形态都不一样,后面排错思路也完全不同。这篇文章就围绕这个看似基础、实际上坑不少的问题,把几条主流路线的原理、步骤、注意事项一次性总结清楚。无论你是刚接触Linux的新人,还是被旧服务器环境折磨过的老手,都能直接对照操作。

1. Ubuntu 18.04的Node.js困局:官方源停留在8.x,而生态早已换代

先把背景说透。Ubuntu 18.04是2018年4月发布的系统,它默认软件源里躺着的nodejs包,版本是8.10.0。放在当时这版本不算差,但放到现在看,很多主流工具链根本跑不起来。我之前在一台刚装好的18.04服务器上执行node -v,看到输出“v8.10.0”的那一瞬间,就知道后面所有依赖安装都会变成一场噩梦。

为什么Ubuntu的官方源这么保守?这是Debian系发行版的软件管理哲学:稳定优先,除了安全补丁之外基本不追新版本。系统源里的Node.js会被冻结在一个固定版本上,只修漏洞,不升大版本。所以“直接apt装”得到的不是“旧一点”的Node.js,而是“一个和当前生态脱节非常多”的Node.js。18.04在2023年已经结束维护,但存量机器依然不少,很多老项目、旧服务器还在上面跑着,这也就导致“如何在18.04上装Node.js”这个问题到今天仍然高频出现。

接下来要做的判断其实是三件事:第一,拿到一个可执行的node和npm;第二,决定要不要同时保留多个Node版本;第三,决定全局安装的npm包会落在哪里。后面这几种安装方式,本质上都是在给这三个问题提供不同答案。想清楚这一点,再看具体步骤就不会觉得乱了。

2. apt安装的两条路:直接装和老老实实换NodeSource源

2.1 直接apt install nodejs:装完才发现版本不对

先说最简单、也最容易让人后悔的做法:

sudo apt update sudo apt install nodejs npm node -v npm -v

你大概率看到的是v8.10.0和3.5.2。这个组合意味着什么?Vue CLI要求Node 12以上,Vite要求14.18以上,新版Next.js直接要求18.17以上。也就是说,现代前端项目几乎一个都跑不了。但注意,我也不是说它完全没用。如果你只是跑一些老接口服务,或者学习Express基础,这套环境还能凑合;教学场景里很多实验代码用的就是老版本Node。

这个方案的卸载倒是很干净:

sudo apt remove --purge nodejs npm

之所以放在第一个讲,是想让大家先吃一颗定心丸:Ubuntu官方源里的Node.js默认就是这么落后,任何在网络上看到“以后不要直接apt装Node”的吐槽,都是在说这一条。它的问题是版本策略,不是apt本身。所以真正的apt方案,其实是下面这一条。

2.2 换NodeSource源装LTS:给apt开外挂

NodeSource是一家专门维护Node.js二进制仓库的服务商,它做的事情很简单:把最新版Node打包成Debian格式,放到自己的APT仓库里,再提供一个一键切换脚本。你只需要执行:

curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - sudo apt install -y nodejs node -v

这条命令干了挺多事。curl先把setup脚本拉到本地,管道交给sudo bash执行;脚本会检测你的系统版本,往/etc/apt/sources.list.d/目录写入NodeSource的源配置,同时导入GPG签名密钥。后面的sudo apt install nodejs就是从NodeSource仓库拉包并安装。-E参数的作用是保留当前shell里的环境变量,避免某些代理或镜像配置在sudo状态下失效。

版本号可以换成16.x、18.x这类LTS主线,我个人的习惯是:生产服务器上永远装LTS,不追奇数版本。装完验证一下来源:

which node ls -l /usr/bin/node

你也可以用apt policy nodejs看当前源的版本信息。和官方源那套相比,NodeSource的node是预编译的二进制再打包,安装速度快,稳定性和apt天然集成,GPG key的信任成本也属于正常范围内。系统升级时apt upgrade还会继续维护大版本内的更新,这点很舒服。

2.3 apt方案的卸载与版本切换局限

NodeSource方案的卸载稍微多两步:

sudo apt remove --purge nodejs sudo rm /etc/apt/sources.list.d/nodesource.list sudo rm /etc/apt/keyrings/nodesource.gpg sudo apt update

不需要担心卸载不干净,因为apt会把Node二进制本身清理掉。真正的痛点是版本切换:一个NodeSource源通常只对应一个主线版本,想换版本就得换源、重新安装。如果哪一天项目A要Node 16,项目B要Node 18,apt方案在两个目录里来回折腾就不太行了。这是我后来转向nvm的最直接原因。

3. nvm安装法:多版本切换自由背后的工作原理与使用细节

3.1 nvm的“障眼法”:它如何做到多版本共存

nvm的全称是Node Version Manager,一个纯shell脚本写成的版本管理器。它的核心思路和apt完全不同:不往系统目录里写东西,而是把每个Node版本解压到用户目录下的~/.nvm/versions/node/里,然后通过修改PATH环境变量来实现“当前用哪个版本”。换句话说,它不是把Node装进系统,而是“骗”shell去执行对应路径下的node。

所以nvm use 18.20.4这条命令,本质是把~/.nvm/versions/node/v18.20.4/bin拼接到PATH最前面。因为shell找命令是顺序扫描PATH目录的,谁在前面谁生效。这就不难理解为什么nvm能做到多版本共存、按目录切换版本,而且完全不需要sudo权限。它只影响当前用户的shell环境,对系统里其他用户无感。

3.2 安装与常规操作

安装nvm本身也简单:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

这个脚本会git clone nvm仓库到~/.nvm,然后往~/.bashrc追加函数定义代码。安装完新开一个终端,或者手动执行source ~/.bashrc,就可以使用了:

command -v nvm nvm --version

接下来安装Node:

nvm install --lts nvm install 18.20.4 nvm ls nvm use 18.20.4 nvm alias default 18.20.4

nvm install --lts会安装当前LTS版本,nvm alias default的作用是设置新终端默认使用的版本。如果不做这一步,重开终端后nvm会提示“none”,node命令可能找不到。如果你所在的网络环境访问官方源速度不理想,可以设置镜像变量后重新安装:

export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node/ node -v

3.3 全局包与默认版本的坑

用nvm过程中最容易踩的坑,就是“我这个包明明全局装了,换个版本怎么就没了”。原因很直接:nvm下每个Node版本都有自己独立的lib目录,npm install -g只会装到当前版本的~/.nvm/versions/node/vXX/lib/node_modules里。切到另一个版本后,两者互相不可见。解决办法要么在每个版本里都重复安装,要么别折腾,固定一个默认版本别乱切。

还有一个特别常见的现象:新开终端后nvm命令消失了。这通常是.bashrc没被加载导致的,检查一下这几个位置:

echo $NVM_DIR ls -la ~/.nvm tail -n 20 ~/.bashrc

如果发现install脚本写进去的代码不在.bashrc而在.bash_profile,而你每次登录走的是非登录shell,就会无法加载。把加载语句复制到.bashrc即可。另外,不要轻易rm -rf ~/.nvm,那等于把所有已装Node版本和全局包全部清空,重装和配置环境的时间成本很高。

3.4 老版本需求如何处理

nvm真正的杀手锏是处理老版本。有些历史项目就是锁死在Node 8或者Node 10上,nvm下一条命令就完事:

nvm install 8.17.0 nvm use 8.17.0

我见过太多人为了一个老项目把系统自带的Node降级,结果把别的服务搞崩了。用nvm就可以在同一个机器上保留Node 8、Node 16、Node 18多个版本,进项目目录时看一眼.nvmrc文件:

echo "18.20.4" > .nvmrc nvm use

nvm会自动读取.nvmrc并切换版本,配合package.json里的engines字段,项目维护起来省心很多。

4. 官方二进制包:不用编译也不用改系统的“绿色版”

4.1 什么场景下该选二进制包

官方二进制包就是从nodejs.org官网直接下载的tar.xz文件,里面已经是一整套编译好的可运行环境。它的特点是:不需要apt,不需要编译,不需要sudo(前提是放在用户目录下)。适合哪些场景?第一,临时在CI/CD环境里跑任务,不想引入包管理器;第二,服务器需要离线安装,把压缩包拷进去就能用;第三,希望彻底避开系统包的依赖冲突。

有次为了排查一个诡异的环境问题,我在一台服务器上临时解压了Node到/tmp目录直接跑,跑完删掉,系统干干净净,完全没有留下任何痕迹。这是二进制包特有的优势。

4.2 从下载到配置PATH的完整步骤

以Node 18.20.4为例:

wget https://nodejs.org/dist/v18.20.4/node-v18.20.4-linux-x64.tar.xz sha256sum node-v18.20.4-linux-x64.tar.xz sudo mkdir -p /opt/node sudo tar -xJf node-v18.20.4-linux-x64.tar.xz -C /opt/node --strip-components=1

下载后先做sha256校验,可以拿官网的校验值对比一下,这是习惯问题,防止下载文件损坏。解压时--strip-components=1会去掉顶层目录名,直接把node、npm这些文件放进/opt/node,后面使用更清爽。

接下来需要让系统找到node命令,两种方式任选一种。

第一种,软链接:

sudo ln -s /opt/node/bin/node /usr/local/bin/node sudo ln -s /opt/node/bin/npm /usr/local/bin/npm

第二种,配置全局环境变量:

echo 'export PATH=/opt/node/bin:$PATH' | sudo tee /etc/profile.d/node.sh source /etc/profile.d/node.sh

第二种方式更适合一个目录下有一整套工具链的情况,而且以后想删掉,只要移除这个文件和目录即可,不污染系统里其他文件。验证:

node -v npm -v which node

4.3 升级、卸载与多版本并存

二进制包的升级逻辑非常简单:下载新版tar包,解压覆盖替换到/opt/node目录,旧的软链接不需要改,因为/opt/node/bin/node这个路径没变。卸载则是反向操作,先删软链接或profile文件,再删整个目录:

sudo rm /usr/local/bin/node /usr/local/bin/npm sudo rm -rf /opt/node

注意,npm全局安装的包都放在/opt/node/lib/node_modules里,删目录等于连全局包一起删,卸载前先npm -g list看看。想要多版本并存也能做到:解压到/opt/node16、/opt/node18这种不同目录,切换时改PATH或软链接即可,只是没有nvm那么自动,适合需求固定的环境。

5. 源码编译安装:耗时最长但导出最自由的方式

5.1 什么样的人才需要源码编译

实话实说,绝大多数场合都不需要这条路。编译Node.js源码耗时久、依赖多、报错信息还容易劝退新手。但仍有两类场景值得考虑:一是目标机器的CPU架构不在官方预编译包覆盖范围里,比如某些嵌入式环境或特殊指令集,必须本地编译;二是需要自定义编译参数,比如想改默认安装前缀、打补丁、裁剪某些模块,这些只能从源码入手。如果你属于这两类,下面的流程可以少踩很多坑;如果不是,看完当知识储备也行。

5.2 完整编译流程与关键参数

先把编译工具链装上:

sudo apt install build-essential python3 pkg-config libssl-dev g++ make

Ubuntu 18.04默认自带的python版本是3.6,编译Node 18是没有问题的。然后下载源码:

wget https://nodejs.org/dist/v18.20.4/node-v18.20.4.tar.gz tar -xzf node-v18.20.4.tar.gz cd node-v18.20.4

配置阶段是关键,--prefix决定安装位置:

./configure --prefix=/usr/local/node make -j$(nproc) sudo make install

make -j$(nproc)会按CPU核心数开启并行编译,四核机器一般二十到四十分钟能编译完,但如果你用的是一个2核2G的云主机,建议改成make -j2,否则内存会先撑不住。编译完成后,/usr/local/node/bin下就有node和npm了,同样需要软链接或PATH配置。

5.3 编译时的几种典型崩溃

我编译过程中遇到过几次比较典型的失败。第一次是g++版本太老,报错说编译器不支持某些C++特性,解决办法是用g++-8替换默认版本再编译:

sudo apt install g++-8 export CXX=g++-8

第二次是报Python版本过低,多数情况是系统里没有python3这个命令,或者版本太老,检查后补齐即可。第三次是openssl相关的头文件缺失,也就是前面依赖列表里libssl-dev没装全。最好在开始编译前把依赖一次性装齐,不然每次都要从头编译,时间成本相当难受。

源码编译的优势是自由,代价也是自由——所有配置和依赖问题都得自己处理。如果不是有特殊需求,我真的建议跳过这一节,直接看后面的选择建议。

6. 全方式横评与我的最终建议

6.1 六种安装方式的核心参数对比

安装方式安装耗时多版本支持是否需要root系统侵入性最合适场景
apt官方源秒级不支持需要大老项目、临时测试
NodeSource源分钟级需要换源需要中生产服务器固定版本
nvm分钟级支持不需要小开发机、个人服务器
官方二进制包分钟级手动管理看目录小容器、离线环境
源码编译小时级手动管理需要中特殊架构、定制编译
snap秒级支持channel切换需要中想快速应急的场合

6.2 不同身份场景的推荐组合

如果你是个人开发机,日常要写前端、切项目、开箱即用,那无脑选nvm。它把一个“系统软件”变成“用户工具”,多版本切换的成本最低。如果你管理的是一台线上服务器,希望环境稳定、可预期,NodeSource的apt源最合适,固定LTS版本后基本不用管。如果你的环境是Docker容器,请直接使用官方容器镜像,在镜像里折腾源码编译纯属没苦硬吃。离线环境或者临时任务,官方二进制包永远是最可靠的后备方案。

至于snap,Ubuntu 18.04确实自带snapd,也可以snap install node --classic,但它的版本更新节奏、路径隔离和权限模型有时候会让人摸不着头脑,我一般不主动推荐,应急时可以试试。

6.3 装好之后必须做的三件收尾事

无论你用上面哪种方式装好Node.js,我建议都顺手做三件事。第一,检查npm的全局目录是否预期:

npm config get prefix npm prefix -g

如果你发现全局目录长在系统目录下、装包时需要sudo,后面大概率会因为权限问题踩坑。nvm和二进制包用户可以不用管,apt用户要多留意。

第二,配置npm镜像。npm官方源的访问速度在部分网络环境下确实让人着急,你可以设置镜像:

npm config set registry https://registry.npmmirror.com npm config get registry

这只是一个可选的加速手段,不影响包版本正确性。

第三,给项目打上Node版本标记。在项目根目录创建.nvmrc,在package.json里写明engines.node,这样团队协作时每个人都知道该用哪个版本,从源头上减少“我本地好好的怎么到你机器就报错”这种经典问题。

最后说几句实在话

装Node.js这种操作,看起来只是几条命令的事,但选错方式之后要花的时间,往往比安装本身多一个数量级。我自己的习惯是:新服务器上首选NodeSource加固定LTS版本,个人测试机上用nvm,需要快速验证时用官方二进制包,能不动系统就尽量不动。希望这篇总结能让你少走一遍我当年踩过的弯路。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/19 10:26:37

沙箱不是测试环境:工程师必须掌握的隔离原理与三类实现范式

1. 沙箱不是玄学,是工程师手里的“隔离实验室” 最近刷技术社区、听分享会、甚至日常站会里,“沙箱”这个词出现频率高得离谱——“这个功能先放沙箱跑一下”“模型调用必须走沙箱通道”“上线前得在沙箱里压测七轮”。可真要问一句:“沙箱到…

作者头像 李华
网站建设 2026/10/19 10:26:26

HOOK模型实战:拆解触发、行动、酬赏与投入,破解用户留存难题

做产品这几年,被问得最多的问题就是:怎么让用户每天回来。砸钱做补贴,用户薅完羊毛就走;功能越堆越多,大多数人也只是注册当天点两下,之后就再也没打开过。后来我把行为设计领域流传很广的HOOK模型翻来覆去…

作者头像 李华
网站建设 2026/10/19 10:26:25

多模态大模型与机器人结合:从零跑通视觉-语言-动作闭环项目

最近大半年,找我咨询多模态大模型与机器人结合问题的同行特别多,其中不乏完全没接触过机器人的算法开发者和刚入门的学生。大家的问题高度集中在一个点上:网上到处是"多模态大模型赋能具身智能"的新闻,但真要自己动手把一个大模型接到机器人上,到底从哪里开始?我花了…

作者头像 李华
网站建设 2026/10/19 10:26:20

基于C# WinForms的屏幕拾色器:取色、转换与全局热键实践

简介:一个用C#开发的拾色器工具,面向有一定Windows Forms基础的桌面应用开发者,解决屏幕取色与颜色模型转换的实际需求。压缩包约2.07MB,包含可直接运行的编译成果与源代码工程,适合学习C#图形界面开发、System.Drawin…

作者头像 李华
网站建设 2026/10/19 10:24:30

把skills当项目管:系统化梳理、评估与展示个人技能的方法

1. 从“skills”这个词说起:为什么它突然成了高频搜索最近一段时间,不管是在技术社区、职场论坛还是各种学习群里,“skills”这个词的出现频率明显高了不少。有人把它翻译成“技能”,有人叫它“能力项”,还有人直接把它…

作者头像 李华
网站建设 2026/10/19 10:24:15

diagram-design:从草图到可维护系统架构图的设计原则与实操指南

1. 从一张草图到一套系统:diagram-design 到底在解决什么问题 第一次看到 “diagram-design” 这个标题,很多人会以为它只是教你怎么把流程图做得好看一点。但真正在项目里画过架构图、部署图、数据流图的人都知道,图的美观只是最表层的事。真…

作者头像 李华