做过企业级项目开发的同行应该都遇到过这样的场景:客户现场是完全封闭的内网环境,别说npm官方源了,连百度都打不开。去年我接手某大型国企项目时,就遇到了这样的挑战——开发机连的是客户内网,所有外网访问都被物理隔离。当时为了部署Vue开发环境,整整折腾了两天时间。
这种内网环境下最大的难点在于依赖管理。Vue项目依赖的node_modules动辄几百MB,包含成千上万个文件。常规的npm install在内网根本无法执行,因为所有依赖都需要从npm官方仓库下载。更麻烦的是,很多依赖包还会在安装时动态下载二进制文件(比如node-sass),这在内网环境下直接会导致安装失败。
经过多次实战,我总结出三种主流解决方案:
这三种方案各有优劣。全量迁移最简单粗暴但占用空间大;离线镜像最规范但配置复杂;缓存安装则折中平衡。下面我会重点介绍缓存安装方案,这也是我在实际项目中最常用的方法,特别适合中小型Vue项目。
选择Node.js版本是个技术活。我强烈建议使用LTS版本(当前是18.x),避免使用最新奇数版本。去年有个项目用了Node 17,结果后来发现对某些老版本依赖包存在兼容性问题,不得不重装环境。
安装步骤很简单:
bash复制# Windows系统推荐使用安装包
下载地址:https://nodejs.org/dist/v18.16.0/node-v18.16.0-x64.msi
# Linux系统建议用nvm管理
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
nvm install 18.16.0
安装完成后需要检查两个关键配置:
bash复制# 查看npm全局安装目录
npm root -g
# 通常输出:/usr/local/lib/node_modules
# 查看缓存目录位置
npm config get cache
# 通常输出:~/.npm
很多新手会直接npm install完事,但这样会漏掉很多隐藏依赖。我的经验是分三步操作:
bash复制# 1. 安装Vue CLI核心工具
npm install -g @vue/cli @vue/cli-service
# 2. 安装常见构建工具
npm install -g webpack webpack-cli vite rollup
# 3. 安装辅助工具
npm install -g yarn pnpm npm-check-updates
这里有个小技巧:使用--ignore-scripts参数可以避免安装时执行预编译脚本,这在后续迁移时能减少兼容性问题:
bash复制npm install --ignore-scripts -g node-sass
很多人以为直接把node_modules拷过去就行,其实远不止如此。完整的迁移清单应该包括:
我习惯用rsync做增量同步,比直接压缩打包更可靠:
bash复制# Linux/Mac系统
rsync -avz ~/.npm/ 内网机器IP:/path/to/npm-cache/
# Windows系统可以用robocopy
robocopy C:\Users\username\AppData\Roaming\npm-cache \\内网机器\共享目录 /MIR
在内网机器上,根据迁移过来的文件不同,有三种安装方式:
方法一:直接使用缓存安装
bash复制npm install --cache ./npm-cache --optional --cache-min 99999999999 --shrinkwrap false @vue/cli
方法二:从本地tarball安装
bash复制npm install ./offline-packages/vue-cli-5.0.8.tgz
方法三:全局链接
bash复制cd /path/to/global/node_modules/@vue/cli
npm link
我最推荐第一种方式,因为它能保持完整的依赖树结构。曾经有个项目用第二种方式,结果因为漏传了几个间接依赖包,调试了半天才找出问题。
即使准备充分,内网环境还是可能报Cannot find module错误。这时候要检查:
有个快速验证的方法:
bash复制# 查看某个包是否在缓存中
ls ~/.npm/包名/版本号/
像node-sass这种包含原生二进制文件的模块特别容易出问题。解决方案是:
--target_arch参数bash复制export SASS_BINARY_PATH=/path/to/binding.node
内网环境下升级依赖特别麻烦,我的经验是:
bash复制ncu -u
npm install
对于长期的内网开发环境,建议搭建Verdaccio私有仓库:
bash复制# 在外网环境初始化仓库
npm install -g verdaccio
verdaccio
然后配置上游仓库和缓存策略:
yaml复制# config.yaml
storage: ./storage
uplinks:
npmjs:
url: https://registry.npmjs.org/
cache: true
maxage: 1h
我写了个bash脚本自动完成整个迁移过程:
bash复制#!/bin/bash
# 备份npm配置
npm config list > npm_config_backup.txt
# 打包缓存目录
tar -czvf npm_cache.tar.gz $(npm config get cache)
# 打包全局安装包
GLOBAL_MODULES=$(npm root -g)
tar -czvf global_node_modules.tar.gz "$GLOBAL_MODULES"
# 生成安装清单
npm list -g --depth=0 > global_dependencies.txt
对于有Docker环境的客户,可以考虑容器化部署:
dockerfile复制FROM node:18-alpine
COPY npm-cache /root/.npm
COPY node_modules /app/node_modules
WORKDIR /app
CMD ["npm", "run", "serve"]
这种方案最大的好处是环境隔离,避免污染客户机原有配置。去年有个金融项目就是采用这种方案,节省了80%的环境部署时间。