使用verdaccio打造自己的npm私有化仓库

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 使用verdaccio打造自己的npm私有化仓库

前言

接着上篇文章Gitea+Jenkins能碰撞出怎样的火花?浅谈前端自动化部署_DieHunter1024的博客-CSDN博客


本文将与大家分享使用verdaccio搭建私有化npm仓库以及npm包的发布


准备工作

Node环境

远程或本地服务器

verdaccio

安装配置verdaccio

1.使用npm install --global verdaccio全局安装verdaccio

2.在服务器中新建文件夹用来存放npm数据

3.在新建的文件夹中运行cmd输入verdaccio,显示以下日志就可以了

1.png

4.在浏览器打开http://localhost:4873/显示以下页面就可以进行下一步了

1.png

5.通过日志可以知道verdaccio的yaml文件在 C:\Users\用户名\.config\verdaccio\config.yaml,我们可以自定义该文件并且手动启动,将yaml文件复制到新建的文件夹下并修改文件,以下是我的配置文件,仅供参考

# 数据缓存目录
storage: ./storage
# 插件目录
plugins: ./plugins
#开启web 服务,能够通过web 访问
web:
  # 页面title名称
  #enable: false
  title: NPM-diehunter
#验证信息
auth:
  htpasswd:
    #  用户信息存储目录
    file: ./htpasswd
    # 最大注册人数,默认infinity
    #max_users: 1000
#公有仓库配置
uplinks:
  npmjs:
    # url: https://registry.npmjs.org/
    # taobao镜像
    url: https://registry.npmmirror.com/
packages:
  "@*/*":
    # scoped packages
    access: $all
    publish: $authenticated
    #代理 如果本地仓库没找到会去npmjs中找,npmjs就是uplinks中的变量
    proxy: npmjs
  "**":
    # 权限:所有人,匿名用户,认证(登陆)用户
    # "$all", "$anonymous", "$authenticated"
    #是否可访问所需要的权限
    access: $all
    #发布package 的权限
    publish: $authenticated
    # 如果package 不存在,就向代理的上游服务发起请求
    proxy: npmjs
middlewares:
  audit:
    enabled: true
# 监听本地所有ip,配置了后可以通过公网访问
listen: 0.0.0.0:10241
# 日志
logs:
  - { type: stdout, format: pretty, level: http }
  #- {type: file, path: verdaccio.log, level: info}


6.使用cmd脚本启动文件,可以将以下命令写成bat文件并放在文件夹目录

verdaccio --listen 10241 --config ./config.yaml

7.最后运行命令,打开网页

1.png

8.此外,可以参考Nginx常用指令,基本配置,反向代理_DieHunter1024的博客-CSDN博客,把npm仓库反向代理到路由,不占用端口

上传代码至仓库

推荐使用nrm管理npm仓库地址,切换仓库地址为http://localhost:10241/


1.png


以之前写的PubSubPattern(发布订阅)为例子,在文件夹中 npm init -y 新建package.json文件,并配置name,version等

{
  "name": "pub_sub_pattern",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

注册用户:使用npm adduser --registry http://localhost:10241/注册用户,输入用户名(小写),密码,邮箱


1.png


然后在index.js中写入源码

exports.PubSubPattern = class PubSubPattern {
  constructor() {
    this._eventList = {}; //调度中心列表
  }
  static Instance() {
    //返回当前类的实例的单例
    !PubSubPattern._instance &&
      Object.defineProperty(PubSubPattern, "_instance", {
        value: new PubSubPattern(),
      });
    return PubSubPattern._instance;
  }
  on(type, handler) {
    if (!checkArgs(type, handler)) {
      return;
    }
    //若调度中心未找到该事件的队列,则新建某个事件列表(可以对某个类型的事件注册多个回调函数)
    !isKeyInObj(this._eventList, type) && (this._eventList[type] = new Array());
    this._eventList[type].push(handler);
  }
  un(type, handler) {
    if (!type) {
      return;
    }
    const fnList = this._eventList[type];
    if (type && (!handler || typeof handler !== "function")) {
      this._eventList[type] = null;
      return;
    }
    for (let i = 0; i < fnList.length; i++) {
      fnList[i] && fnList[i] === handler && (this._eventList[type][i] = null);
    }
  }
  once(type, handler) {
    if (!checkArgs(type, handler)) {
      return;
    }
    const _handler = (args) => {
      this.un(type, _handler);
      handler(args);
    };
    this.on(type, _handler);
  }
  emit(type, module) {
    if (!type) {
      return;
    }
    const fnList = this._eventList[type];
    if (!fnList) {
      return;
    }
    isKeyInObj(this._eventList, type) && fnList.map((_) => _ && _(module));
  }
  clear() {
    this._eventList = {};
  }
}
/**
 * 检查对象是否包含该属性,除原型链
 * @param obj 被检查对象
 * @param key 被检查对象的属性
 */
function isKeyInObj(obj, key) {
  return Object.hasOwnProperty.call(obj, key);
}
/**
 * 检查参数是否符合标准
 * @param type 事件名
 * @param handler 事件钩子
 */
function checkArgs(type, handler) {
  if (!type) {
    return;
  }
  if (!handler || typeof handler !== "function") {
    throw new Error(
      "handler is not defined or not a function at arguements[1]"
    );
  }
  return true;
}


完成后输入npm publish --registry http://localhost:10241/将代码发布到npm仓库


1.png


npm包的发布就完成了


安装依赖

另起一个test文件夹,使用


npm init -y

npm i pub_sub_pattern


下载依赖


1.png


在test文件夹中新建main.js输入以下内容

const { PubSubPattern } = require("pub_sub_pattern");
console.log(PubSubPattern);
PubSubPattern.Instance().on("event", (data) => {
  console.log(data);
});
setTimeout(() => {
  PubSubPattern.Instance().emit("event", { name: "hunter" });
}, 1000);

并且在控制台执行node main,出现以下日志就表示成功了


1.png


写在最后

最后,我们可以配合这篇文章Gitea+Jenkins能碰撞出怎样的火花?浅谈前端自动化部署_DieHunter1024的博客-CSDN博客


将npm publish --registry http://localhost:10241/命令放在Jenkins的命令中实现自动发布npm,这便是微前端的雏形


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
6月前
|
JavaScript Linux 数据安全/隐私保护
node内网安装npm私服以及依赖包上传发布verdaccio
node内网安装npm私服以及依赖包上传发布verdaccio
439 1
|
24天前
|
前端开发 JavaScript API
自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南
自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南
70 0
|
24天前
|
前端开发 JavaScript 开发工具
从零开始:构建、打包并上传个人前端组件库至私有npm仓库的完整指南
从零开始:构建、打包并上传个人前端组件库至私有npm仓库的完整指南
173 0
|
24天前
|
资源调度 前端开发 安全
前端实战:基于Verdaccio搭建私有npm仓库,轻松上传与下载自定义npm插件包
前端实战:基于Verdaccio搭建私有npm仓库,轻松上传与下载自定义npm插件包
52 0
|
6月前
|
JavaScript 前端开发
🚀自定义属于你的脚手架并发布到NPM仓库
🚀自定义属于你的脚手架并发布到NPM仓库
|
3月前
|
存储 安全 Java
阿里云云效产品使用合集之怎么设置使用npm私有仓库进行流水线拉取依赖
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
4月前
|
Web App开发 JavaScript 前端开发
npm私服verdaccio 搭建
npm私服简化团队内部包管理,提供私密组件存储与快速访问。Verdaccio作为热门选择,基于Node.js,易部署且功能丰富。搭建后,CI/CD流程提速,维护统一,版本清晰。安装仅需全局`npm install -g verdaccio`,启动简易。发布组件需注册、登录及`npm publish`至自定义registry。配置文件(`config.yaml`)支持定制,如更换logo或启用HTTPS。常见问题包括主题定制与解决500错误。进阶话题如域名绑定与自动化版本更新将在后续探讨。寻求同道,共同优化与运维,提升私服稳定性与实用性。
177 0
npm私服verdaccio 搭建
使用Sinopia部署私有npm仓库
使用Sinopia部署私有npm仓库
138 0
|
资源调度 Ubuntu 前端开发
使用verdaccio+docker搭建 npm 私有仓库以及使用
公司内部前端组件或库的共享等,搭建一个`npm`私有库就很方便,现在中大型公司也基本都有自己的`npm`私有库,这篇文章,和大家一起共同搭建一个`npm`私有库,共同学习
624 0
|
24天前
|
缓存 资源调度 JavaScript
npx与npm的差异解析,以及包管理器yarn与Node版本管理工具nvm的使用方法详解
npx与npm的差异解析,以及包管理器yarn与Node版本管理工具nvm的使用方法详解
29 0