vue3+vite从零架构:写组件、构建、打包并上传个人前端组件库至私有npm仓库最终在自己项目中下载并使用(超详细的流程,小编已实现)

目录

第一章 前言

第二章 准备工作

第三章 封装组件

3.1 文件结构

3.2 编写组件代码

第四章  项目打包

第五章 发布到npm

5.1 npm准备工作

5.2 发布npm包

​编辑

第六章 从npm安装使用


第一章 前言

在我们很多开发过程中,不管是使用vue还是react,我都会导入第三方组件,比如我们最常用的element-ui/plus、antd、echarts…像这些已经封装好的组件可以在项目的任意地方使用,我们也会从npm仓库下载下来。但是由于一些公司/项目又有这些组件不适应的功能,从而我们又会自定义组件,在一些别的项目中遇到类似的功能,我们又会把封装好的组件复制到新的项目里,其实在这个过程中我们已经开始慢慢有构架的思想了,其实,我们可以将这些组件上传到npm仓库,要是在别的项目中有用到,直接再从npm安装使用即可。接下来小编就给大家详细说一下流程,跟着做即可(不管使用的是js还是ts,原理是类似的)。

第二章 准备工作

  • 创建vue3项目(前提条件:node版本18+
npm init vue@latest

(vue3项目创建,详细看小编下的该文章:)

vue3基础+进阶(一、Vue3项目创建并相比vue2熟悉项目结构)_vue create与vue3-CSDN博客

( node管理看小编下的该文章:)

nvm安装并配置环境变量使用nvm安装、切换nodejs-CSDN博客

  • 初始化并运行项目
npm install // 初始化项目
yarn run dev // 运行项目

第三章 封装组件

3.1 文件结构

在根目录下新建一个packages文件夹,文件夹下的分别是components和index.js。packages的主要作用就是放我们的公共组件,后续导出的,index.js是批量导出组件的。

  • 注意1:或许网上会有多种不同的方法创建这个文件夹并放置不同的位置,但是小编要说的是是:原理其实是和我们正常写项目时,创建公共组件的思路是一样的大家一定不要被误解成一定需要这么创建!!这么做的原因:只是单纯的为了区分一下,后续上传npm上也是只需要打包这部分组件,其他部分都不是特别影响。
  • 注意2:packages下的文件结构最好是小编给的,components下放公共组件,index.js批量注册公共组件
  • 注意3:小编框的文件特别需要注意,后续需要使用的

3.2 编写组件代码

  • 小编这里用了一个小图标为例子——
  • wIcon.vue文件中的代码:
<script setup>
defineOptions({ // vue3定义的一些配置项(vue3项目的组件名一般是根据文件名走的)
  name: 'w-icon'
})

const props = defineProps({ // 接受传参
  className: { // 传参的类名
    type: String
  }
})
</script>

<template>
  <i class="icon iconfont" :class="`icon-a-${props.className}`"></i> // 封装的内容,将参数拼接
</template>

<style scoped> // 样式
i {
  font-size: 100px;
}
</style>

注意:有不清楚的看vue3的官方文档

https://cn.vuejs.org/

  • 由于我们这里封装的是图标,所以如果直接用上面的代码是没有内容的。这里需要使用到iconfont,网址如下:

iconfont-阿里巴巴矢量图标库

这种用法小编就不详细说了:找图标放到自己创建的项目中,然后在自己的项目中导入

index.html文件下:

<link rel="stylesheet" href="//at.alicdn.com/t/c/font_4613448_g8pczuzf37.css">
  • 批量导出:packages/index.js文件下
import { defineAsyncComponent } from 'vue'

const components = import.meta.glob('./components/*.vue')
const registerGlobalComponent = (app) => {
    for (const [key, value] of Object.entries(components)) {
        const name = key.slice(key.lastIndexOf('/') + 1, key.lastIndexOf('.'))
        app.component(name, defineAsyncComponent(value))
    }
}

export default registerGlobalComponent

 -- 注意:这里一定要以export default registerGlobalComponent的形式暴露出函数,否则在后续打包上传到npm后,使用会报错

批量注册组件可以看小编下的该文章:

vue:vue2与vue3如何全局注册公共组件(包括涉及到的相关方法函数的讲解)_vue2 vue3全局组件的使用-CSDN博客

(自此,我们的icon组件初步封装并注册成功)

  • 写好的组件我们可以自测一下:(这里引用与正常写项目使用公共组件是一样的,在main.js文件下引入组件)
import registerGlobalComponent from '../packages/index'

registerGlobalComponent(app)

  • 然后在页面上使用一下(小编这里偷懒了,直接在初始文件自带的组件下使用了,如下:) 
<w-icon className="070_bangong" /> // 公共组件,直接使用即可,根据自己封装的内容传参数

注意用法:

  • 查看效果

说明封装没有问题!!

第四章  项目打包

  • 网上教程会跟你说打包要改什么什么,其实,什么都可以不用改,我们正常打包也是可以的但是我们区分不了哪些是我们自定义的公共组件;(而npm上传的主要是打包后的文件和package.json,其他都不要),所以我们这里为了区分一下正常的打包,小编讲一下原理:

        -- 在vite.config.js文件中添加改配置项:(该配置是yarn build时输出的信息)

build: {
    outDir: 'npm_components', // 指定构建结果的输出目录
    target: 'es2015', // 指定要构建的目标环境,可以是某个浏览器的版本,或者是Node.js的版本
    minify: 'esbuild', // 是否为代码开启压缩
    cssTarget: 'chrome80',
    chunkSizeWarningLimit: 2000, // 设置大块大小(以字节为单位)的警告限制
    emptyOutDir: true, // 在构建前是否清空outDir目录
    rollupOptions: { // 修改内部Rollup配置
      // 请确保外部化那些你的库中不需要的依赖
      external: ['vue'],
      output: {
        // 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量
        globals: {
          vue: 'Vue',
        },
      },
    },
    lib: {
      entry: './packages/index.js', // 入口文件,可以是相对于项目根目录的路径
      name: 'npm_components', // 设置库的名称
    }
}

 

  • 打包:yarn build,打包成功后文件如下,这个只是针对packages文件下的包

第五章 发布到npm

5.1 npm准备工作

  • 注册账号:先去npm官网注册一个账号,注意记住用户名、密码和邮箱,发布的时候可能会用到,官网如下

npm | Home

  • 设置npm源:检测自己的镜像源,必须设置成npm的镜像源才能发布npm包!!!
npm config set registry=https://registry.npmjs.org

查看是否设置成功:

npm config get registry

  • 添加npm用户:控制台进入自己的文件名(npm_component_test)下,输入npm adduser,添加自己的账号
npm adduser

跳转到该页面,输入邮箱的code即可

5.2 发布npm包

  • 上面的准备工作做好之后,发布包我们需要更改package.json的配置

  • 添加如下:针对自己的配置修改
  "name": "npm_component_test", // 输出npm包名, 在npm中必须唯一
  "version": "1.0.0", // 版本号,如果需要再次输出,只需要版本号+1即可
  "private": false, // 设置为false,否则会打包错误
  "description": "这是一个icon的测试组件……", // 包的描述
  "type": "module", // 在 node 支持 ES 模块后,要求 ES 模块采用 .mjs 后缀文件名。只要遇到 .mjs 文件,就认为它是 ES 模块。如果不想修改文件后缀,就可以在 package.json文件中,指定 type 字段为 module。
  // 以下文件配置根据自己yanr buid打包的内容配置
  "main": "npm_components/npm_component_test.js", // 指定加载的入口文件
  "module": "npm_components/npm_component_test.umd.cjs", // 指定 ES 模块的入口文件
  "files": [ // 指定需要跟随一起发布的内容文件
    "npm_components/*.js",
    "npm_components/*.css",
    "npm_components/*.cjs",
  ],

  • 用指令发布npm包
npm publish --access=public

(当报如下错时一般是npm包重名了 )

 修改以下name即可:

打npm包成功: 

npm可以查看到:

第六章 从npm安装使用

  • 最后一步了,查看我们发布的组件是否可以使用
  • 下载
npm install npm_component_test_1

  • 下载成功:项目依赖中已经有我们创建的包了

  •  使用
// 导入npm_component_test_1插件
import A from 'npm_component_test_1' // 命名注意规范,小编偷懒
import 'npm_component_test_1/npm_components/style.css' // 样式也要导入

app.use(A)

由于使用的时icon,index.html需要导入小图标文件:

<link rel="stylesheet" href="//at.alicdn.com/t/c/font_4613448_g8pczuzf37.css">

<script setup>
</script>

<template>
  <main>
    <w-icon className="070_anquan" />
  </main>
</template>

展示如下: 

到这里我们的组件就封装好了,并且可以直接从npm仓库下载使用!!!

以上也是小编的源码,如果大家先体验的化也可以直接使用上面的代码,为了方便大家测试,小编这个测试组件也不会删除,可以下载体验。

补充:如果大家需要删除自己发布的npm包,使用如下指令——

npm unpublish [package-name] --force

// 例如小编的: npm unpublish npm_component_test_1 --force

最后,大家伙都看到这,一键三连加关注就给小编吧,小编会陆续更新对大家有用的文章的!!!!

若有问题,也欢迎大家评论区留言互相讨论!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/798472.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

github相关命令

如果我们要从 GitHub 上拉取一个项目到本地&#xff0c;进行修改并上传回去&#xff0c;通常需要以下步骤&#xff1a; 1. 克隆远程仓库到本地 使用 git clone 命令将 GitHub 上的项目克隆到本地&#xff1a; (网址示例如下所示&#xff09; git clone https://github.com/你的…

DP- 使用最小花费爬楼梯 DAY19

使用最小花费爬楼梯 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第i个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。 …

STM32对flash中程序的加密保护

2024.7.14 今天学习了很多关于STM32对于程序的保护措施&#xff0c;原先一直不理解为什么DF CAR需要做加密&#xff0c;他的加密流程我也不是很知道&#xff0c;后面发现他是在控制任务初始化的时候&#xff0c;加了一个判断flash中某个区域的数值的程序&#xff0c;如果判断失…

易懂的吉文斯(Givens)变换(一)

文章目录 二阶Givens旋转矩阵作用于向量作用于矩阵更一般的情况 二阶Givens旋转矩阵 在QR分解中&#xff0c;Givens旋转是一种用于将矩阵变成上三角形的技术。 别的教程里面往往会直接给出一个n*n阶的通用Givens矩阵形式&#xff0c;但是这样太过抽象难懂了&#xff0c;而且难…

ceph 部署

端口号 NFS 2049 rpcbind 111 NFS 目录越深&#xff0c;写入性能越差 操作简单&#xff0c; 一.前言&#xff1a;存储知识 1、存储基础 单机存储设备 【1】DAS&#xff08;直接附加存储&#xff0c;是直接接到计算机的主板总线上去的存储&#xff09; IDE、SATA、SCSI、SAS…

记录些Redis题集(2)

Redis 的多路IO复用 多路I/O复用是一种同时监听多个文件描述符&#xff08;如Socket&#xff09;的状态变化&#xff0c;并能在某个文件描述符就绪时执行相应操作的技术。在Redis中&#xff0c;多路I/O复用技术主要用于处理客户端的连接请求和读写操作&#xff0c;以实现高并发…

《后端程序员 · Nacos 配置优先级动态刷新》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

J025_斗地主游戏案例开发(简版)

一、需求描述 完成斗地主游戏的案例开发。 业务&#xff1a;总共有54张牌&#xff1b; 点数&#xff1a;3、4、5、6、7、8、9、10、J、Q、K、A、2 花色&#xff1a;黑桃、红桃、方片、梅花 大小王&#xff1a;大王、小王 点数分别要组合4种花色&#xff0c;大小王各一张。…

mysql不初始化升级

1、下载mysql&#xff0c;下载地址&#xff1a;MySQL :: Download MySQL Community Server 2、解压下载好的mysql&#xff0c;修改配置文件的datadir指定目录为当前数据存储的目录 3、通过管理员cmd进入新版本mysql的bin目录&#xff0c; 然后执行命令安装mysql服务&#xff…

性能测试(2)

jmeter参数化 loadrunner Jmeter IP欺骗&#xff0c;也称为IP欺诈&#xff0c;是指通过伪装、篡改IP地址的方式&#xff0c;进行网络攻击或欺骗行为。这种行为可能会导致网络安全问题&#xff0c;包括身份盗窃、数据泄露、DDoS攻击等。为了保护自己的网络安全&#xff0c;用户…

「C++系列」一篇文章讲透【运算符】

文章目录 一、运算符1. 算术运算符2. 关系运算符3. 逻辑运算符4. 位运算符5. 赋值运算符6. 条件运算符&#xff08;三元运算符&#xff09;7. 成员访问运算符8. 指针和地址运算符9. 类型转换运算符10. 其他运算符 二、其他特殊运算符1. 成员访问运算符2. 指针和地址运算符3. 类…

C语言 ——— 模拟实现strcpy函数

目录 strcpy函数功能介绍 strcpy函数的模拟实现 strcpy函数功能介绍 学习并使用strcpy函数-CSDN博客 strcpy函数的模拟实现 代码演示&#xff1a; #include<stdio.h> #include<assert.h> char* my_strcpy(char* destination, const char* source) {assert(des…

OpenCV下的单目标定,双目标定与立体校正(calibrateCamera, stereoCalibrate and stereoRectify)

OpenCV下的单目标定&#xff0c;双目标定与立体校正(calibrateCamera, stereoCalibrate and stereoRectify) 文章目录 1. 杂话2. 单目标定2.1 先看代码2.2 一点解释2.3 calibrateCamera参数 3. 双目标定3.1 先看代码3.2 stereoCalibrate参数 4. 立体校正4.1 先看代码4.2 一点解…

Spring Security 授权

基于request的授权 HttpSecurity 权限配置 Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize -> {authorize// 放行请求:针对含有 admin 权限的用户放行 /user/get 接口.requestMatchers("/us…

训练营第十一天 | 150. 逆波兰表达式求值

150. 逆波兰表达式求值 做题思路 遇到操作符&#xff0c;出栈&#xff0c;从栈口取出俩元素&#xff1b;遇到数字&#xff0c;入栈 栈的应用场景&#xff1a;相邻元素的消除 逆波兰表达式&#xff1a;即后缀表达式 来自二叉树的后序遍历&#xff1a;左右中 代码细节 class …

有限元中弱形式的一些数学基础

有限元方法在求解PED时&#xff0c;一般先将控制方程转化为等效的若积分形式&#xff0c;本文试图总结一下这一过程的一些数学基础&#xff0c;本文主要从工程的角度出发和理解&#xff0c;不探讨严谨的数学证明过程。 PDE强形式 强形式是PDE及其边界条件的原始形式。求解强…

Java巅峰之路---基础篇---综合练习(面向对象)

目录 文字版格斗游戏 基础版 souf输出语句 进阶版 键盘录入的说明 复杂对象数组练习 需求&#xff1a; 添加和遍历 删除和遍历 修改和遍历 文字版格斗游戏 基础版 格斗游戏&#xff0c;每个游戏角色的姓名&#xff0c;血量&#xff0c;都不相同&#xff0c;在选定人…

[BJDCTF2020]Mark loves cat

黑盒直接扫 dirsearch -u http://bba9a212-64d3-4a16-88b4-3605fe3ef749.node5.buuoj.cn:81/ -w /home/kali/Desktop/dirsearch/db/dicc.txt我们用GitHack拿一下源码 没有的去下载一下&#xff0c;开源代码 cd GitHackpython GitHack.py http://bba9a212-64d3-4a16-88b4-3605…

排序算法3_冒泡排序、快速排序

一、冒泡排序 1.1 冒泡排序定义和思路 冒泡排序的基本思想是&#xff1a;通过相邻两个元素之间的比较和交换&#xff0c;使较大的元素逐渐从前面移向后面&#xff08;升序&#xff09;&#xff0c;就像水底下的气泡一样逐渐向上冒泡&#xff0c;所以被称为“冒泡”排序。  在…

垃圾收集篇

文章目录 垃圾收集算法垃圾的概念对象存活的判断引用计数器法可达性分析算法 算法标记清除算法复制算法标记压缩算法 垃圾收集的相关概念STW安全点安全区域 垃圾收集器重要指标吞吐量停顿时间 垃圾收集器的分类Serial 收集器&#xff1a;串行回收ParNew 收集器&#xff1a;并行…