Vue 2 组件发布到 npm

news2024/10/3 4:36:24

本教程使用官网教程中指示的 Rollup 作为打包工具,并尽量遵循官网教程的指引进行实践;组件项目的初始化创建方式亦是使用官网提倡的 Vue CLI 工具简便生成。另外组件打包发布到 npm 还可以使用 webpack 作为打包工具,但不在本文讨论范围。

前期准备及版本信息

node: v18.14.2

@vue/cli: 5.0.8

使用 @vue/cli 初始化创建项目,项目生成后,其中依赖包版本信息为:

  "dependencies": {
    "core-js": "^3.8.3",
    "vue": "^2.6.14",
    "vue-router": "^3.5.1",
    "vuex": "^3.6.2"
  },
  "devDependencies": {
    "@babel/core": "^7.12.16",
    "@babel/eslint-parser": "^7.12.16",
    "@vue/cli-plugin-babel": "~5.0.0",
    "@vue/cli-plugin-eslint": "~5.0.0",
    "@vue/cli-plugin-router": "~5.0.0",
    "@vue/cli-plugin-vuex": "~5.0.0",
    "@vue/cli-service": "~5.0.0",
    "eslint": "^7.32.0",
    "eslint-plugin-vue": "^8.0.3",
    "sass": "^1.32.7",
    "sass-loader": "^12.0.0",
    "vue-template-compiler": "^2.6.14"
  }

安装 Rollup 相关开发时依赖

npm install rollup -D

npm install rollup-plugin-vue@5.1.9 -D

npm install @rollup/plugin-buble -D

npm install @rollup/plugin-commonjs -D

npm install @rollup/plugin-image -D

安装完成后的 devDependencies 如下

留意各依赖版本号。根据作者之前的经验,Vue 官网教程中使用的旧版 Rollup 与较新版 Vue 2 存在一些兼容性问题,导致无法编译。故建议读者可以使用当前最新的 Rollup 相关依赖库。但要特别注意的是:rollup-plugin-vue 必须安装 5.x.x 版本,当前最新的 6.x.x 据说只与 Vue 3 兼容,经作者测试,6.x.x 版本在编译项目时的确会报错。

如果仍然出现无法正常编译的问题,可使用和本教程一样的 Vue 和 Rollup 以及相关的各依赖库版本。

  "devDependencies": {
    "@babel/core": "^7.12.16",
    "@babel/eslint-parser": "^7.12.16",
    "@rollup/plugin-buble": "^1.0.2",
    "@rollup/plugin-commonjs": "^24.0.1",
    "@rollup/plugin-image": "^3.0.2",
    "@vue/cli-plugin-babel": "~5.0.0",
    "@vue/cli-plugin-eslint": "~5.0.0",
    "@vue/cli-plugin-router": "~5.0.0",
    "@vue/cli-plugin-vuex": "~5.0.0",
    "@vue/cli-service": "~5.0.0",
    "eslint": "^7.32.0",
    "eslint-plugin-vue": "^8.0.3",
    "rollup": "^3.18.0",
    "rollup-plugin-vue": "^5.1.9",
    "sass": "^1.32.7",
    "sass-loader": "^12.0.0",
    "vue-template-compiler": "^2.6.14"
  }

编写自己的将要发布的组件

在项目 src/components 下新建 my-component.vue

 my-component.vue 内容如下

<template>
  <div class="my-component">
    <img :src="logoSrc" />
  </div>
</template>
<script>
import LOGO from "../assets/logo.png";
export default {
  data() {
    return {
      logoSrc: LOGO,
    };
  },
};
</script>
<style lang="scss" scoped>
.my-component {
  width: 100px;
  height: 100px;
  img {
    width: 100%;
    height: 100%;
  }
}
</style>

 以上代码还展示了如何在组件中引入图片资源,得益于之前安装的 @rollup/plugin-image 依赖,可用 import 方式直接引入图片资源,图片在编译阶段会转换为 Base64 格式。需要特别主要的是需要用相对路径方式引入图片资源,Vue CLI 生成的项目所支持的 @ 路径引入方式实测无效

编写 wrapper.js

wrapper.js 负责组件导出(export)组件及将组件自动注册到 Vue

 在项目 src 文件夹下新建 wrapper.js

wrapper.js 内容如下

// Import vue component
import component from './components/my-component.vue';

// Declare install function executed by Vue.use()
export function install(Vue) {
    if (install.installed) return;
    install.installed = true;
    Vue.component('MyComponent', component);
}

// Create module definition for Vue.use()
const plugin = {
    install,
};

// Auto-install when vue is found (eg. in browser via <script> tag)
let GlobalVue = null;
if (typeof window !== 'undefined') {
    GlobalVue = window.Vue;
} else if (typeof global !== 'undefined') {
    GlobalVue = global.Vue;
}
if (GlobalVue) {
    GlobalVue.use(plugin);
}

// To allow use as module (npm/webpack/etc.) export component
export default component;

编写 rollup.config.js

在项目根目录新建 build 文件夹,文件夹内新建 rollup.config.js

rollup.config.js 内容如下

import commonjs from '@rollup/plugin-commonjs'; // Convert CommonJS modules to ES6
import vue from 'rollup-plugin-vue'; // Handle .vue SFC files
import buble from '@rollup/plugin-buble'; // Transpile/polyfill with reasonable browser support
import image from '@rollup/plugin-image';

export default {
    input: 'src/wrapper.js', // Path relative to package.json
    output: {
        name: 'MyComponent',
        exports: 'named',
    },
    plugins: [
        commonjs(),
        image(),
        vue({
            css: true, // Dynamically inject css as a <style> tag
            compileTemplate: true, // Explicitly convert template to render function
        }),
        buble({
            objectAssign: true,
            transforms: {
                asyncAwait: false,
                forOf: false,
            }
        }), // Transpile to ES5
    ],
};

 修改 package.json

内容如下

{
  "name": "my-component",
  "version": "0.1.0",
  "keywords": [
    "buble",
    "publish",
    "example",
    "vue"
  ],
  "author": "your name",
  "main": "dist/my-component.umd.js",
  "module": "dist/my-component.esm.js",
  "unpkg": "dist/my-component.min.js",
  "browser": {
    "./sfc": "src/components/my-component.vue"
  },
  "type": "module",
  "private": false,
  "files": [
    "dist/*"
  ],
  "scripts": {
    "serve": "vue-cli-service serve",
    "lint": "vue-cli-service lint",
    "build": "npm run build:umd & npm run build:es & npm run build:unpkg",
    "build:umd": "rollup --config build/rollup.config.js --format umd --file dist/my-component.umd.js",
    "build:es": "rollup --config build/rollup.config.js --format es --file dist/my-component.esm.js",
    "build:unpkg": "rollup --config build/rollup.config.js --format iife --file dist/my-component.min.js"
  },
  "dependencies": {
    ...
  },
  "devDependencies": {
    ...
  }
}

对其中一些字段的解释(详见 package.json 官方解释)

字段名解释
name发布npm的必须项。组件在npm上的名称,需要在npm中全局唯一。如果 name 在 npm 上已被其它组件占用,发布组件时将报错,但只会提示操作被禁止,不会提示名字被占用,因为 npm 认为你在向同名的那个组件提交新版本,但你本人的账号当然是无权向他人发布的组件提交新版的
version发布 npm 的必须项。组件的版本号。每次再次发布新版组件,版本号需要递进
keywords在 npm 上可以通过这些关键字搜索到本组件
author组件的作者名称
type可取值 commonjs 或 module,前者则无扩展名的文件和 .js 结尾文件将被视为 commonjs,后者则无扩展名的文件和 .js 结尾文件将被视为 ES 模块。由于上述组件项目中使用 import 语法加载模块文件,故要指明 type 为 module,否则编译时报错
private是否私有项目。只有设为 false,才允许将本组件发布到 npm

注册 npm 账号

略。读者请自行解决。

命令行登录 npm

使用 npm adduser 指令登录 npm,根据提示输入上一步得到的用户、密码、邮箱等信息。

编译组件

在指向组件项目根目录的命令行下,运行 npm run build 指令,组件会根据 package.json 中的配置进行编译,编译结果在项目根目录的 dist 文件夹中。

发布组件到 npm

运行 npm publish,组件将发布到 npm 上。此后,npm 上可以搜索到你的组件。

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

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

相关文章

YOLOv5s网络模型讲解(一看就会)

文章目录前言1、YOLOv5s-6.0组成2、YOLOv5s网络介绍2.1、参数解析2.2、YOLOv5s.yaml2.3、YOLOv5s网络结构图3、附件3.1、yolov5s.yaml 解析表3.2、 yolov5l.yaml 解析表总结前言 最近在重构YOLOv5代码&#xff0c;本章主要介绍YOLOv5s的网络结构 1、YOLOv5s-6.0组成 我们熟知YO…

openFoam中cellZone的使用及编程

简介 通常在流体计算中需要对某个特定区域进行处理&#xff08;比如添加源项,可参考这篇文章OpenFOAM编程&#xff1a;VOF法与多孔介质模型相结合)&#xff0c;这是就需要用到cellZone. 通常有两种产生cellZone的方式&#xff1a; &#xff08;1&#xff09;从其他划分网格的…

一文带你看透通用文字识别 OCR

什么是 OCR&#xff1f; OCR技术指的是 Optical Character Recognition 或光学文字识别技术&#xff0c;即从图像中识别文字&#xff0c;并将其转换为电子文本或机器可读格式。它可以被广泛应用于图像处理&#xff0c;文字处理&#xff0c;自然语言处理&#xff0c;计算机视觉…

Kubernetes学习(五)持久化存储

Volume 卷 容器中的文件在磁盘上是临时存放的&#xff0c;这给容器中运行的特殊应用带来了一些问题。首先&#xff0c;当容器崩溃时&#xff0c;kubectl将重新启动容器&#xff0c;容器中的文件将会丢失--应为容器会以干净的状态重建。其次&#xff0c;当在一个Pod中运行多个容…

【算法题目】【Python】彻底刷遍DFS/BFS的算法题目

文章目录参考资料树的前序、中序、后序遍历树的层次遍历回溯与剪枝组合组合总和 III电话号码的字母组合组合总和组合总和 II参考资料 参考这里面的一些讲解&#xff1a; https://github.com/youngyangyang04/leetcode-master。 树的前序、中序、后序遍历 看完 树的种类 之后…

网络 | UDP与TCP协议讲解 | TCP可靠性是怎样实现的?

文章目录前置知识查看网络状态的工具查看进程idUDP协议协议格式UDP只有接收缓冲区基于UDP的应用层协议TCP协议流的理解协议格式确认应答机制缓冲区序号的作用流量控制超时重传机制6位标志位紧急数据的处理三次握手listen的第二个参数全连接和半连接队列都维护了什么信息&#x…

史上最全若依管理系统修改页面标题和logo

整理若依框架去除 若依标题、logo及其他内容。一&#xff1a;网页上的logo进入ruoyi-ui --> public --> favicon.ico&#xff0c;把这个图片换成你自己的logo二&#xff1a;页面中的logo进入ruoyi-ui --> src --> assets --> logo --> logo.png&#xff0c;把…

Git版本控制工具(详解)

Git版本控制工具 Git常见命令速查表 集中式版本控制 cvs和svn都是属于集中式版本控制系统 他们的主要特点是单一的集中管理服务器 保存所有文件的修订版本协同开发人员通过客户端连接到这台服务器 取出最新的文件或者提交更新 优点每个人都可以在一定程度上看到项目中的其他…

动态规划——子序列、编辑距离、回文子串

目录 子序列问题 300.最长递增子序列 674.最长连续递增序列 718.最长重复子数组 1143.最长公共子序列 1035.不相交的线 53.最大子序和 编辑距离 392.判断子序列 115.不同的子序列 583.两个字符串的删除操作 72.编辑距离 回文子串 647.回文子串 516.最长回文子序列…

使用sapply函数改写for循环并绘制迟滞温度与污染物效应图

For循环应该是我们在R语言使用得最普遍的循环了&#xff0c;优势就是简单、易上手&#xff0c;缺点就是慢&#xff0c;特别对于跑数据量比较大的数据。Apply家族函数使用C来编写&#xff0c;运行得非常快&#xff0c;非常适合代替for循环。今天介绍一下sapply函数改写for循环并…

abp.net 5.0 部署IIS10

今天遇到了abp.net 5.0部署iis10被卡住的问题&#xff0c;网上找了一些资料&#xff0c;都不是我要的&#xff0c;最后我总结一下我用的是 5.0的版本&#xff0c;所以我需要给服务器安装 iis5.0的相关运行环境 1&#xff1a;https://dotnet.microsoft.com/zh-cn/download/dotne…

html--学习

javascrapt交互&#xff0c;网页控制JavaScript&#xff1a;改变 HTML 图像本例会动态地改变 HTML <image> 的来源&#xff08;src&#xff09;&#xff1a;点亮灯泡<script>function changeImage() {elementdocument.getElementById(myimage) #内存变量&#xff0…

Linux---基本指令

专栏&#xff1a;Linux 个人主页&#xff1a;HaiFan. 基本指令ls 指令pwd命令cd 指令touch指令mkdir指令&#xff08;重要&#xff09;rmdir指令 && rm 指令&#xff08;重要&#xff09;man指令&#xff08;重要&#xff09;cp指令&#xff08;重要&#xff09;mv指令…

win10 C++调用conda的python

普通 比如说是conda的DL环境&#xff0c;路径是D:\Miniconda3\envs\DL VC目录->包含目录里加入D:\Miniconda3\envs\DL\include VC目录->库目录里加入D:\Miniconda3\envs\DL\libs 链接器->输入->附加依赖项里加入D:\Miniconda3\envs\DL\libs\python37.lib 在l…

“ 寻友之旅 “ 的三种解决办法

题目来源于&#xff1a;稀土掘金 " 寻友之旅 " 的三种解决办法&#xff01; 本文将分别讲解如何使用BFS、双向BFS以及 Dijsktra堆优化的方法来解决此题~ 一起来看看吧&#xff01; 附Java题解代码&#xff01; 文章目录" 寻友之旅 " 的三种解决办法&#…

如何将两个或多个PDF文件合并成一个?这3个方法可以看看

在工作中&#xff0c;有时候我们需要把两个或多个PDF文件合并成一个&#xff0c;这样一来&#xff0c;可以方便阅读、修改&#xff0c;还能快速打印文件。 下面分享3个工具&#xff0c;看看如何将两个或多个PDF文件合并成一个文件。 方法一&#xff1a;使用美图工具 如果PDF文…

【Spring AOP】如何统一“拦截器校验、数据格式返回、异常返回”处理?

目录 一、Spring 拦截器 1.1、背景 1.2、实现步骤 1.3、拦截原理 二、 统一url前缀路径 2.1、方法一&#xff1a;在系统的配置文件中设置 2.2、方法二&#xff1a;在 application.properies 中配置 三、统一异常处理 四、统一返回数据返回格式处理 4.1、背景 4.2、…

PTA:L1-025 正整数A+B、L1-026 I Love GPLT、L1-027 出租(C++)

目录 L1-025 正整数AB 问题描述&#xff1a; 实现代码&#xff1a; L1-026 I Love GPLT 问题描述&#xff1a; 实现代码&#xff1a; L1-027 出租 问题描述&#xff1a; 实现代码&#xff1a; 原理思路&#xff1a; 出租那道题有点意思哈 L1-025 正整数AB 问题描述…

【Java学习笔记】13.Java StringBuffer 和 StringBuilder 类

Java StringBuffer 和 StringBuilder 类 当对字符串进行修改的时候&#xff0c;需要使用 StringBuffer 和 StringBuilder 类。 和 String 类不同的是&#xff0c;StringBuffer 和 StringBuilder 类的对象能够被多次的修改&#xff0c;并且不产生新的未使用对象。 在使用 St…

Tomcat8安装

1、前置环境 Tomcat 8 对应jdk 1.8 版本&#xff1b;如果你的jdk版本是8以上&#xff0c;则安装对应的tomcat版本。 jdk8 官方下载安装时&#xff0c;先安装jdk版本&#xff0c;最后单独安装jre。所以电脑会有两套jre&#xff0c;一套是jdk中的jre&#xff0c;位于 \jre 目录下…