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

简介: 使用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日志并进行多维度分析。
相关文章
|
14天前
|
JavaScript 前端开发
🚀自定义属于你的脚手架并发布到NPM仓库
🚀自定义属于你的脚手架并发布到NPM仓库
|
安全 NoSQL 关系型数据库
使用cnpm搭建企业内部私有NPM仓库
cnpm是企业内部搭建npm镜像和私有npm仓库的开源方案。它同时解决了现有npm架构的一些问题。
834 0
使用cnpm搭建企业内部私有NPM仓库
|
JavaScript 前端开发 数据安全/隐私保护
Vue封装组件并发布到npm仓库
前言 使用Vue框架进行开发,组件封装是一个很常规的操作。一个封装好的组件可以在项目的任意地方使用,甚至我们可以直接从npm仓库下载别人封装好的组件来进行使用,比如iview、element-ui这一类的组件库。但是每个公司的业务场景可能不同,开发人员还是得必须封装自己得组件,如果换了一个项目,那么我们就只能复制组件代码到新的项目里面去了,这样稍显麻烦,其实我们可以将组建上传到npm仓库,要用的时候可以直接从npm安装使用。 总结下来有两点好处: 方面使用,任何项目无缝衔接。 可作为开源项目,积累经验。
618 0
Vue封装组件并发布到npm仓库
|
6月前
使用Sinopia部署私有npm仓库
使用Sinopia部署私有npm仓库
76 0
|
9月前
|
资源调度 Ubuntu 前端开发
使用verdaccio+docker搭建 npm 私有仓库以及使用
公司内部前端组件或库的共享等,搭建一个`npm`私有库就很方便,现在中大型公司也基本都有自己的`npm`私有库,这篇文章,和大家一起共同搭建一个`npm`私有库,共同学习
449 0
|
11月前
|
Linux 开发工具 git
Linux系统使用Git仓库安装Nvm工具并安装Npm和Node
Linux系统使用Git仓库安装Nvm工具并安装Npm和Node
350 0
|
Linux 网络安全 开发工具
通过nexus3部署公司内部的私有npm仓库:从安装到配置、从发布包到测试包的一条龙服务
登录时使用默认用户admin,密码不知道就需要找默认的,点击Sign in时会提示你路径,这里我是这样查的,在linux服务器上输入以下命令
1519 0
|
JavaScript Shell API
|
资源调度 JavaScript
Vue实现一个全屏加载插件并发布至npm仓库
Vue实现一个全屏加载插件并发布至npm仓库
Vue实现一个全屏加载插件并发布至npm仓库
|
JavaScript 数据安全/隐私保护 Docker
使用Docker搭建Npm私服Verdaccio
使用Docker搭建Npm私服Verdaccio
671 0
使用Docker搭建Npm私服Verdaccio

推荐镜像

更多