同花顺内网NPM二三事

前言

关于npm相信做为前端开发工程师必定不陌生,不过大部分人基本上只会使用3个命令,npm install,npm run dev,npm run build,不过本文并不介绍npm常见的命令,本文主要介绍了我司内网npm的搭建方式,和前端开发在使用过程当中经常会遇到的问题,但愿你们在使用过程当中可以对其了解更深入,本文阅读时间约须要5分钟。前端

我司内网NPM发展历程

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

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

企业内网npm

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

  • 淘宝开源CNPM

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

  • Nexus Repository

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

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

  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

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

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

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

  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知识可以帮助你们之后更好的工做,若有不对之处,欢迎指正~

相关文章
相关标签/搜索