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

news2024/12/26 22:57:06

目录

第一章 前言

第二章 准备工作

第三章 封装组件

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Docker】Docker-harbor私有仓库部署与管理

目录 一.Harbor 概述 1.什么是Harbor 2.Harbor的特性 3.Harbor的构成 二.Harbor 部署 1.部署 Docker-Compose 服务 2.部署 Harbor 服务 3.启动 Harbor 4.创建新项目 5.创建用户 6.本地上传镜像 7.从Harbor下载镜像 三.镜像同步 1.定时拉取 2.主动推送 四.管理 …

掌握这些技巧,让你成为画册制作高手

在数字化的时代背景下&#xff0c;电子画册以其便捷的传播方式、丰富的视觉表现形式&#xff0c;赢得了大众的喜爱。它不仅能够在个人电脑上展现&#xff0c;还能通过智能手机、平板电脑等多种移动设备随时随地被访问和浏览。这种跨平台的支持&#xff0c;使得无论你身处何地&a…

基于STM32智能电子锁设计

1.简介 随着时代的高速发展&#xff0c;家居安全也成为人们日常生活中的一个安全问题。目前传统的门锁使用的是机械密码&#xff0c;在安全性方面表现不佳。这些缺点可以通过改用智能电子密码锁来弥补。智能电子锁是一种使用了现代电子技术的高科技产品&#xff0c;它的出现解决…

【iOS】类对象的结构分析

目录 对象的分类object_getClass和class方法isa流程和继承链分析isa流程实例验证类的继承链实例验证 类的结构cache_t结构bits分析实例验证属性properties方法methods协议protocolsro类方法 类结构流程图解 对象的分类 OC中的对象主要可以分为3种&#xff1a;实例对象&#xf…

江协科技51单片机学习- p27 I2C AT24C02存储器

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

动手学深度学习——5.卷积神经网络

1.卷积神经网络特征 现在&#xff0c;我们将上述想法总结一下&#xff0c;从而帮助我们设计适合于计算机视觉的神经网络架构。 平移不变性&#xff08;translation invariance&#xff09;&#xff1a;不管检测对象出现在图像中的哪个位置&#xff0c;神经网络的前面几层应该对…

C++从入门到起飞之——类的定义/实例化 全方位剖析!

个人主页&#xff1a;秋风起&#xff0c;再归来~ C从入门到起飞 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 目录 1.类的定义 1.1、类定义格式 1.2、访问限定符 1.3、类域 2.实例化 2.…

基于Vue CLI 3构建Vue3项目(Vue2也可参考)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

基于嵌入式Linux的高性能车载娱乐系统设计与实现 —— 融合Qt、FFmpeg和CAN总线技术

随着汽车智能化的发展&#xff0c;车载娱乐系统已成为现代汽车的标配。本文介绍了一个基于Linux的车载娱乐系统的设计与实现过程。该系统集成了音视频娱乐、导航、车辆信息显示等功能&#xff0c;旨在提供安全、便捷、丰富的驾驶体验。 1. 项目概述 随着汽车智能化的发展&…

基于Java的在线考试系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java MySQL B/S架构 SpringBoot框架 工具&#xff1a;Eclipse、MySQL环境配置工具 系统展示 首…

备忘录删除了怎么恢复 备忘录误删恢复办法

备忘录作为我们日常生活中的得力助手&#xff0c;帮助我们记录重要事项和灵感&#xff0c;然而&#xff0c;使用中偶尔会出现误删的情况。若不能及时找回误删的内容&#xff0c;可能会造成重要信息的丢失&#xff0c;给我们的工作和生活带来不必要的麻烦。 如果你也担心备忘录…

【权威发布】2024年金融科技与信息技术国际会议(ICFTIT 2024)

2024年金融科技与信息技术国际会议 2024 International Conference on Financial Technology and Information Technology 【1】会议简介 2024年金融科技与信息技术国际会议将在中国成都隆重举行。本次会议围绕“金融创新”、“金融科技”与“信息技术”等核心议题&#xff0c;…

【STC89C51单片机】定时器中断系统

中断概念 中断是一种重要的硬件机制&#xff0c;用于在处理器正在执行程序时&#xff0c;能够及时响应某些外部或内部事件。中断可以临时中止当前正在执行的指令序列&#xff0c;转而去执行专门的中断服务程序&#xff08;ISR&#xff0c;Interrupt Service Routine&#xff0…

navicat15已连接忘记密码

1.导出链接 2.使用文本打开 connections.ncx UserName"root" PasswordXXXX 3.复制加密密码&#xff0c;在线解密 代码在线运行 - 在线工具 php解密代码 <?php class NavicatPassword {protected $version 0;protected $aesKey libcckeylibcckey;protected…

沙尘传输模拟教程(基于wrf-chem)

沙尘传输模拟教程(基于wrf-chem) 文章目录 沙尘传输模拟教程(基于wrf-chem)简介实验目的wrf-chem简介 软件准备wps、wrf-chem安装conda安装ncl安装ncap安装 数据准备气象数据准备下垫面数据准备 WPS数据预处理namelist.wps的设置geogrid.exe下垫面处理ungrib.exe气象数据预处理…

ppt文本框复制到word自动缩进的问题

ppt里的字是无缩进的&#xff1a; 复制粘贴到word中&#xff0c;突然出现2字符缩进&#xff1a; 微软官方嘴硬说没问题我也是无语&#xff01;&#xff01;word保留原格式复制后&#xff0c;出现莫名其妙的缩进 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直…

C++ | Leetcode C++题解之第239题滑动窗口最大值

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {int n nums.size();vector<int> prefixMax(n), suffixMax(n);for (int i 0; i < n; i) {if (i % k 0) {prefixMax[i] num…

阿里云短信PHP集成api类

无需安装sdk扩展包&#xff0c;直接引入类即可使用 V3版本请求体&签名机制:自研请求体和签名机制 - 阿里云SDK - 阿里云 模版内容&#xff1a; <?phpnamespace common\components;use common\constant\UserConst; use common\models\bee\SmsReferer; use common\mode…

git镜像链接

镜像链接https://registry.npmmirror.com/binary.html?pathgit-for-windows/ CNPM Binaries Mirror 1.git init 2.克隆 IDEA集成git git分支

WSL-Ubuntu20.04部署环境配置

1.更换Ubuntu软件仓库镜像源 为了在WSL上使用TensorRT进行推理加速&#xff0c;需要安装以下环境&#xff0c;下面将按以下顺序分别介绍安装、验证以及删除环境&#xff1a; #1.C环境配置 gcc、gdb、g #2.gpu环境 cuda、cudnn #3.Cmake环境 CMake #4.OpenCV环境 OpenCV #5.Ten…