同花顺内网NPM二三事

前言

关于npm相信作为前端开发工程师一定不陌生,不过大部分人基本上只会使用3个命令,npm install,npm run dev,npm run build,不过本文并不介绍npm常见的命令,本文主要介绍了我司内网npm的搭建方式,和前端开发在使用过程中常常会遇到的问题,希望大家在使用过程中能够对其了解更深刻,本文阅读时间约需要5分钟。

我司内网NPM发展历程

我司的内网npm仓库是在2017年中旬开始搭建并使用的,在此之前大家都是采用复制粘贴的方式来搬运nodemodules,17年中旬开始在内网搭建了一套cnpm内网仓库,主要采用淘宝开源的cnpm仓库,当时还没有打通内网访问淘宝镜像的地址,因此仓库更新包还是要每隔一段时间才会去更新一下,导致内网一些包的版本总是不是最新的;

19年开始公司开始采用nexus重新部署了一套私有仓库,用该方案搭建主要是可以一套仓库同时兼顾各类开发语言,同时直接打通了镜像源地址,让内网无需再为包无法下载或者版本更新不及时的事情发愁。

企业内网npm

企业内网搭建npm的常见两种方式

  • 淘宝开源CNPM

官方部署github地址: https://github.com/cnpm/cnpmj...

  • Nexus Repository

官方部署github地址:https://github.com/sonatype/d...

目前我司上述两种仓库都依然在内网并存,对于上述两种仓库有如下建议:

  1. 如果你需要搭建的这个仓库需要兼容多种语言,如:js,java,python,那么建议你用nexus作为仓库
  2. 如果你仅需要支持前端npm包,那么用淘宝cnpm,该仓库是基于node编写的,对前端人员更加友好

企业内网npm可能会遇到的问题

1. 使用npm install下载遇到404问题
  • 检查项目下的package-lock.json文件中该包的仓库地址是否和内网的不一样
  • 使用npm config get registry查看当前仓库地址是否指向内网的仓库
  • 该包是否含脚本,脚本自动从github上面下文件,如果包含,那么执行npm install --ignore-scripts该命令可以跳过该脚本的下载(大部分遇到的都是node-sass这种包会有脚本,后文会讲解如何在内网安装这种包)
2. 内网node-sass安装失败怎么办

如果公司有内网开发的话,很多同学应该会遇到这个问题,往往大家的做法可能都是从外网拷贝传到内网指定目录下,但这种方式过于繁琐,可维护性比较差,那么目前业界是怎么做的呢?

目前做的比较好的是淘宝,他们的做法是定时同步github上面的node-sass到自己的服务器上,然后开发人员在本地命令行中修改node-sass下载脚本的地址即可

npm config set SASS_BINARY_SITE=http://npm.taobao.org/mirrors/node-sass

那么对应到各位的公司里面应该如何做呢?
主要有如下两个方案:

  1. 搭建代理通道,内网通过一台中转服务器,反向代理到淘宝仓库存储脚本的地址,或者直接代理到对应github的地址,然后开发人员在本地设置如下命令,即可修改node-sass的脚本地址
1. 公司内网服务器nginx配置转发路由,并让机房开通下面代理淘宝地址的权限,nginx配置如下:

...
location ^~ /mirrors/ {
    proxy_pass http://cdn.npm.taobao.org/dist/
}
...

2. 前端开发在本地命令行中修改binary_site的地址(xxx是内部服务器自己的ip):
npm config set SASS_BINARY_SITE=http://xxx.xxx.xxx/mirrors/node-sass

3. 执行下载命令,即可正常下载node-sass
npm install node-sass
  1. 公司如果有自己的gitlab的话,可以按照淘宝的同步逻辑将github上面对应的node-sass文件拷贝到内网的gitlab仓库,那么开发人员在设置的时候可以直接将本地node-sass的下载地址指向gitlab
npm config set SASS_BINARY_SITE=http://gitlab.xxx.xxx/node-sass
淘宝镜像地址:https://npm.taobao.org/mirrors

另外,上述方案不仅仅适用于node-sass,同样适用于所有类似node-sass需要下载脚本的包,比如electron,puppeteer...等等,算是一个通用的解决方案,建议使用第一种代理通道的方案,向公司申请下权限即可

3.我司目前内网npm仓库存在的问题

目前我司在使用nexus作为仓库的过程中遇到如下另个问题:

  1. 开发人员在本地安装包的时候经常404

遇到这种情况,只需要稍等片刻,然后再重新多执行几次npm install即可

ps:虽然该种情况一会能好,和网络关联性较大,但笔者强烈怀疑是nexus内部机制的一些bug,一些超时时间和重试机制设置做的并不好
  1. 内网装node-sass或者puppetter等包无法安装

接下去会按照上述搭建代理通道的方式来解决该问题

4. package-lock.json该不该提交

package-lock.json是在学习了yarn.lock之后在npm5版本上面新增的功能,该文件的主要作用是用来锁住package.json中的版本号,使得每一次下载的npm包的版本都是一样的,并且下载的来源也都是同一个。

不过个人有不一样的看法,目前从开发实践中来看建议大家不要将package-lock.json提交到git上作为版本管理;主要是由于目前的包遵循semver语义化版本的原则来进行更新包的,基本上不太会出现小版本升级导致api变更,靠谱的包升级都是修复bug或者是相关优化,如果把package-lock.json加入版本管理之后,后面该包修复bug业务方更新起来是一个比较麻烦的事情,如果该包使用的业务方过多,那么要推动大家一起改也是比较费时费力的,而不锁版本的好处就在于开发人员可以无感知的就可以在业务开发时修复一些隐藏的bug,而不用每次特地去修改某个包的版本号,因此推荐大家无需将package-lock.json纳入版本管理。

总结

很多公司或多或少都会有内网,搭建npm私服也是必经之路,开发人员如果对于npm没有基本的认识,一般遇到问题很难明白其中发生了什么,希望本文给大家介绍的npm知识能够帮助大家以后更好的工作,如有不对之处,欢迎指正~

阅读 664

推荐阅读