详解如何在npmjs上上传和更新属于自己的组件库(上)

简介: 详解如何在npmjs上上传和更新属于自己的组件库

大家好,我是纸飞机,想必大家都在项目中经常会使用npm install、yarn add、cnpm install等安装包的命令吧。那么大家好奇过,这些包都是怎么来的吗?不用迷茫,本篇文章就为你揭秘他们到底怎么来的并且手把手教你做一个属于你自己的一个可以npm安装的组件库。


🔥无论是npm、yarn还是cnpm他们都有一个统一的名字:JavaScript包管理工具。顾名思义都是用来管理包的,用户将包发在线上随时可用。并且cnpm和npm本就是同宗同源,他们的命令都大致相同,只是cnpm对国内有好些。yarn虽然不同,但无非就是多了个缓存离线下载。下面放出三个大哥的官网,大家可以去了解,这次的主题是npm包的上传。


npm:npm

cnpm:http://npm.taobao.org/

yarn:Yarn 中文文档


🔥一、创建包

1. git init my_npm_comp
2. cd my_npm_comp
3. npm init -y


20210907230916652.png

创建出这么个玩意,操作中初始化了一个git仓库,一个npm仓库(建立package.json依赖包文件)。


🔥二、编写组件库


这里要注意了,我们是要做一个组件库,而不是一个组件,所以我们需要尽量模块化。


我们在package.json同级下建立一个components文件夹,然后里面建立的一个个文件的就是你的组件。例如我要来做个Alert组件和Toast组件。


首先components下建立Alert.js和Toast.js。

20210909211906957.png

❤️1、Alert组件制作

这是个滥竽充数的组件,勿怪勿怪,为了凑个库,也好讲解。

components下的Alert.js

let Alert = {
    show:function(){
        alert('纸飞机666')
    }
}
export default Alert;

❤️2、Toast组件制作

components下的Toast.js

let Toast = {
  // 隐藏的 setTimeOut 引用
  hideTimeOut: null,
  /**
   * 初始化
   */
  init: function () {
    var toastNode = document.createElement("section");
    toastNode.innerHTML =
      '<i class="iconfont icon-success"></i><i class="iconfont icon-error"></i><span class="text">111</span>';
    toastNode.id = "toastWaka"; // 设置id,一个页面有且仅有一个Toast
    toastNode.setAttribute("class", "toast"); // 设置类名
    toastNode.style.display = "none"; // 设置隐藏
    document.body.appendChild(toastNode);
  },
  /**
   * 显示Toast
   * @param text 文本内容
   * @param type 类型 success error
   * @param duration 持续时间
   */
  show: function (text, type, duration) {
    // 确保上一次的 TimeOut 已被清空
    if (this.hideTimeOut) {
      clearTimeout(this.hideTimeOut);
      this.hideTimeOut = null;
      // console.error('上一次的 TimeOut 还未走完!');
      // return;
    }
    if (!text) {
      console.error("text 不能为空!");
      return;
    }
    var domToastWaka = document.getElementById("toastWaka");
    console.log("domToastWaka", domToastWaka);
    if (!domToastWaka) {
      console.error("toastWaka DOM 不存在!");
      return;
    }
    var domIconSuccess = domToastWaka.querySelector(".icon-success"); // 成功图标
    var domIconError = domToastWaka.querySelector(".icon-error"); // 错误图标
    var domToastText = domToastWaka.querySelector(".text"); // 文字
    domToastText.innerHTML = text || "";
    switch (type) {
      case "success":
        domIconSuccess.style.display = "inline";
        domIconError.style.display = "none";
        break;
      case "error":
        domIconSuccess.style.display = "none";
        domIconError.style.display = "inline";
        break;
      default:
        domIconSuccess.style.display = "none";
        domIconError.style.display = "none";
        break;
    }
    domToastWaka.style.display = "block";
    // 不传的话默认2s
    var that = this;
    this.hideTimeOut = setTimeout(function () {
      domToastWaka.style.display = "none";
      that.hideTimeOut = null; // 置 TimeOut 引用为空
    }, duration || 2000);
  },
  /**
   * 隐藏 Toast
   */
  hide: function () {
    // 如果 TimeOut 存在
    if (this.hideTimeOut) {
      // 清空 TimeOut 引用
      clearTimeout(this.hideTimeOut);
      this.hideTimeOut = null;
    }
    var domToastWaka = document.getElementById("toastWaka");
    if (domToastWaka) {
      domToastWaka.style.display = "none";
    }
  },
};
Toast.init();
export default Toast;

❤️3、css样式和库导出出口

20210909212420781.png

my_npm_comp下建立style.css放css样式,index.js是整个组件库的出口,便于后面install后导入组件。

style.css

/*toast样式*/
#toastWaka {
    position: absolute;
    display: none;
    left: 50%;
    bottom: 50%;
    z-index: 99999;
    margin: 0 auto;
    -webkit-transform: translate(-50%);
    transform: translate(-50%);
    width: 120px;
    height:40px;
    line-height: 40px;
    border-radius: 5px;
    text-align: center;
    color: #fff;
    background-color: rgba(000,000,000,0.5);
}
#toastWaka .text{
    color: #fff;
    display: inline-block;
    font-size: 14px;
    position: absolute;
    top:0;
    bottom:0;
    right:0;
    left:0;
}

注意index.js非常重要,毕竟一定要有导出,你才能导入 。这里涉及到一些前端模块化的知识,后面会补充,有兴趣的小伙伴也可以自行去查看。

index.js

import Toast from './components/Toast'
import Alert from './components/Alert'
let myLibs = {}
myLibs.Alert = Alert
myLibs.Toast = Toast
export default myLibs
相关文章
|
3月前
|
前端开发 API
前端界面生成PDF并导出下载
【10月更文挑战第21天】利用合适的第三方库,你可以在前端轻松实现界面生成 PDF 并导出下载的功能,为用户提供更方便的文档分享和保存方式。你还可以根据具体的需求进一步优化和定制生成的 PDF 文件,以满足不同的业务场景要求。
|
4月前
|
关系型数据库 MySQL API
MySQL 历史数据迁移到 Elasticsearch
MySQL 历史数据迁移到 Elasticsearch
176 4
|
6月前
|
存储 消息中间件 运维
招联金融基于 Apache Doris 数仓升级:单集群 QPS 超 10w,存储成本降低 70%
招联内部已有 40+ 个项目使用 Apache Doris ,拥有超百台集群节点,个别集群峰值 QPS 可达 10w+ 。通过应用 Doris ,招联金融在多场景中均有显著的收益,比如标签关联计算效率相较之前有 6 倍的提升,同等规模数据存储成本节省超 2/3,真正实现了降本提效。
招联金融基于 Apache Doris 数仓升级:单集群 QPS 超 10w,存储成本降低 70%
|
9月前
|
网络协议 网络架构
字节填充与0比特填充以及数据链路的基本问题
字节填充与0比特填充以及数据链路的基本问题
469 0
|
网络协议 Java Windows
【Minecraft开服】Windows搭建我的世界MC服务器「公网远程联机」
简单几步在windwos搭建我的世界服务器,并通过cpolar工具将本地服务暴露到公网连接
3670 0
【Minecraft开服】Windows搭建我的世界MC服务器「公网远程联机」
|
存储 Linux
2.3 基于reactor的HTTP服务器实现
2.3 基于reactor的HTTP服务器实现
124 0
解决办法:npm ERR! code ENOLOCK
解决办法:npm ERR! code ENOLOCK
1670 0
|
小程序 测试技术 Android开发
小程序抓包测试的优选方法
今日的文章,我们主要讲的是,如何使用fiddler拦截PC端的小程序流量,而后使用Burpsuite进行抓包测试
|
SQL 安全 数据库
汉王人脸考勤管理系统
汉王人脸考勤管理系统
汉王人脸考勤管理系统
|
存储 安全 Windows
Win32子窗口创建,子窗口回调函数,消息堆栈,逆向定位子窗口消息处理过程
Win32子窗口创建,子窗口回调函数,消息堆栈,逆向定位子窗口消息处理过程

热门文章

最新文章

相关实验场景

更多