从零开始在NPM上发布一个Vue组件的方法步骤


Posted in Javascript onDecember 20, 2018

TL;DR 本文细致讲解了在NPM上发布一个Vue组件的全过程,包括创建项目、编写组件、打包和发布四个环节。

创建项目

这里我们直接利用@vue/cli来生成项目。如果没有安装@vue/cli的话,可以使用以下方法进行安装:

# 如果喜欢npm
npm i -g @vue/cli

# 如果喜欢yarn
yarn global add @vue/cli

此外,如果安装了npx(高版本的nodejs发行版会自带这一工具)的话,还可以很方便地通过npx vue这一方式实现免安装使用。

接下来就可以创建项目了,这里我们创建一个my-banner项目,里面将会包含一个Banner组件:

vue create my-banner

@vue/cli会提示你选择一个预置(preset)的配置,这里我们直接选择“default”(babel, eslint)就可以,之后@vue/cli会自动调用yarn或npm来进行依赖的下载。下载完成后就可以进入项目目录了:

cd my-banner

此时的目录结构为:

├── README.md
├── babel.config.js
├── node_modules
├── package.json
├── public
│  ├── favicon.ico
│  └── index.html
├── src
│  ├── App.vue
│  ├── assets
│  ├── components
│  └── main.js
└── yarn.lock

下面启动开发环境本地服务器:

yarn serve

打开localhost:8080,就可以看到默认的首页:

从零开始在NPM上发布一个Vue组件的方法步骤

@vue/cli 3.0自动生成的默认首页

编写组件

我们现在开始编写一个非常简单的Banner组件。

<!-- src/components/Banner.vue -->

<template>
 <div class="banner" :style="bannerStyles" :class="`banner__${position}`">
  <slot></slot>
 </div>
</template>
<script>
const defaultStyles = {
 left: 0,
 right: 0,
};
export default {
 props: {
  position: {
   type: String,
   default: 'top',
   validator(position) {
    return ['top', 'bottom'].indexOf(position) > -1;
   },
  },
  styles: {
   type: Object,
   default: () => ({}),
  },
 },
 data() {
  return {
   bannerStyles: {
    ...defaultStyles,
    ...this.styles,
   },
  };
 },
};
</script>
<style lang="scss" scoped>
.banner {
 padding: 12px;
 background-color: #fcf6cd;
 color: #f6a623;
 text-align: left;
 position: fixed;
 z-index: 2;
}
.banner__top {
 top: 0;
}
.banner__bottom {
 bottom: 0;
}
</style>

我们将Banner.vue置于src/components目录下,同时在该目录下新建一个index.js文件,用来注册Vue组件。

// src/components/index.js

import Vue from "vue";
import Banner from "./Banner.vue";

const Components = {
  Banner
};

Object.keys(Components).forEach(name => {
  Vue.component(name, Components[name]);
});

export default Components;

接下来我们修改一下@vue/cli自动生成的src/components/HelloWorld.vue文件,引用一下我们刚刚编写的Banner组件:

<!-- src/components/HelloWorld.vue -->

<template>
 <div class="hello">
  <!-- 下面插入了我们刚刚编写的Banner组件 -->
  <Banner>This is a banner!</Banner>
  <h1>{{ msg }}</h1>
  <p>
   For a guide and recipes on how to configure / customize this project,<br>
   check out the
   <a href="https://cli.vuejs.org" rel="external nofollow" target="_blank" rel="noopener">vue-cli documentation</a>.
  </p>
  <!-- 省略部分内容 -->
 </div>
</template>

<script>
  <!-- 省略有关内容 -->
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
  <!-- 省略有关内容 -->
</style>

修改一下项目的主入口main.js

// src/main.js

import Vue from 'vue';
import App from './App.vue';

// 引用我们的自定义组件
import "./components";

Vue.config.productionTip = false;

new Vue({
  render: h => h(App),
}).$mount('#app');

因为前面定义style时使用了scss,所以还需要安装两个开发环境依赖项

yarn add sass-loader node-sass -D

最后执行

yarn serve

就可以在localhost:8080看到效果了:

从零开始在NPM上发布一个Vue组件的方法步骤

添加Banner后的页面效果

可以看到,我们编写的Banner组件已经成功在页面上渲染出来了。

打包

接下来,我们需要对这个组件进行打包。这里我们可以使用@vue/cli 3.0自带的打包功能。打开package.json文件,在scripts中增加一项:

{
 "scripts": {
   "package": "vue-cli-service build --target lib --name my-banner ./src/components/index.js"
 }
}

然后执行yarn package,会在dist目录下生成下列文件:

├── demo.html
├── my-banner.common.js
├── my-banner.common.js.map
├── my-banner.css
├── my-banner.umd.js
├── my-banner.umd.js.map
├── my-banner.umd.min.js
└── my-banner.umd.min.js.map

接下来,需要将package.json中的main字段指向刚刚生成的库文件。这里以commonjs为例(umd应该也是没问题的):

{
 "main": "./dist/my-banner.common.js"
}

然后,我们需要在package.json的files字段中声明这个组件库项目需要包含的文件:

{
 "files": [
  "dist/*",
  "src/*",
  "public/*",
  "*.json",
  "*.js"
 ]
}

这样就可以打包阶段就算是完成了。

发布

注册NPM账号并创建组织

首先登陆NPM官网

 从零开始在NPM上发布一个Vue组件的方法步骤

 npmjs.com

注册账号,都是常规操作,需要填写的有全名、邮箱、用户名和密码。之后邮箱会收到确认邮件,标题为“Verify your npm email address”,发件人是“npm, Inc.”,点击邮件中的链接就可以激活账户了。

登录账号,点击右上角的头像,选择“Create an Organization”,就可以创建你自己的组织了。

从零开始在NPM上发布一个Vue组件的方法步骤

创建组织

组织有两种选项,支持私有发布的需要缴纳每月7刀的“管理费”,而我们现在只需要发布一个公共的包,那就可以选择免费版本。

 从零开始在NPM上发布一个Vue组件的方法步骤

选择公开组织

本地命令行登陆npm

npm login

之后按提示输入用户名和密码即可。

可以使用

npm whoami

来检查登陆是否成功。如果成功的话,这条命令会返回你的用户名。

给你的组件库命名

你需要给你的这个组件库起一个名字,这里用到的是package.json中的name字段。注意@后的名称就填写你刚刚创建的组织的名称。

{
 "name": "@abc/my-banner"
}

最终步骤:再次构建与发布

最后,使用yarn package重新构建一遍这个组件库,然后使用:

npm publish --access public

来发布这个组件库。

注意这里可能会报下面的错误

npm ERR! This package has been marked as private
npm ERR! Remove the 'private' field from the package.json to publish it.

解决办法很简单,按照提示删除package.json中的private字段,或将其设置为false都可以。

成果

顺利发布后,就可以在你的组织页面看到刚刚发布的这个包了。

 从零开始在NPM上发布一个Vue组件的方法步骤

发布成功

在此之后,你可以新建一个项目,然后

yarn add @abc/my-banner

来把你刚刚发布的这个包添加为依赖项。由于我们之前已经在src/components/index.js中对组件进行了全局注册,所以你现在可以直接在template中调用<Banner>。

总结

以上,我们就从零开始实现了一个Vue组件在npm上发布的流程,是不是很简单呢?那么,现在就开始发布一个你自己的组件吧!希望对大家的学习有所帮助,也希望大家多多支持三水点靠木

参考文章

How to create and publish your own VueJS Component library on NPM using @vue/cli 3.0

Javascript 相关文章推荐
Javascript 继承机制的实现
Aug 12 Javascript
再谈javascript面向对象编程
Mar 18 Javascript
javascript完美拖拽的实现方法
Sep 29 Javascript
JavaScript splice()方法详解
Sep 22 Javascript
Javascript call和apply区别及使用方法
Nov 14 Javascript
jQuery实现获取table表格第一列值的方法
Mar 01 Javascript
基于Javascript实现二级联动菜单效果
Mar 04 Javascript
JavaScript实战之菜单特效
Aug 16 Javascript
Javascript之图片的延迟加载的实例详解
Jul 24 Javascript
[js高手之路]图解javascript的原型(prototype)对象,原型链实例
Aug 28 Javascript
使用Vue 自定义文件选择器组件的实例代码
Mar 04 Javascript
js实现3D旋转相册
Aug 02 Javascript
微信小程序实现swiper切换卡内嵌滚动条不显示的方法示例
Dec 20 #Javascript
微信小程序实现的点击按钮 弹出底部上拉菜单功能示例
Dec 20 #Javascript
vue+Vue Router多级侧导航切换路由(页面)的实现代码
Dec 20 #Javascript
微信小程序module.exports模块化操作实例浅析
Dec 20 #Javascript
JavaScript类的继承操作实例总结
Dec 20 #Javascript
vue返回上一页面时回到原先滚动的位置的方法
Dec 20 #Javascript
详解Vue.js自定义tipOnce指令用法实例
Dec 19 #Javascript
You might like
PHP数字格式化
2006/12/06 PHP
PHP通过COM使用ADODB的简单例子
2006/12/31 PHP
Laravel创建数据库表结构的例子
2019/10/09 PHP
去除链接虚线全面分析总结
2006/08/15 Javascript
基于jquery的多功能软键盘插件
2012/07/25 Javascript
返回顶部按钮响应滚动且动态显示与隐藏
2014/10/14 Javascript
angularjs中的e2e测试实例
2014/12/06 Javascript
JavaScript学习笔记之内置对象
2015/01/22 Javascript
jQuery实现移动 和 渐变特效的点击事件
2015/02/26 Javascript
使用mock.js随机数据和使用express输出json接口的实现方法
2018/01/07 Javascript
Node.js命令行/批处理中如何更改Linux用户密码浅析
2018/07/22 Javascript
一文了解vue-router之hash模式和history模式
2019/05/31 Javascript
jQuery HTML获取内容和属性操作实例分析
2020/05/20 jQuery
浅谈Vue static 静态资源路径 和 style问题
2020/11/07 Javascript
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
python sort、sorted高级排序技巧
2014/11/21 Python
在Django的URLconf中使用命名组的方法
2015/07/18 Python
Python手机号码归属地查询代码
2016/05/04 Python
Python列出一个文件夹及其子目录的所有文件
2016/06/30 Python
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
2018/01/07 Python
解决Django后台ManyToManyField显示成Object的问题
2019/08/09 Python
python程序中的线程操作 concurrent模块使用详解
2019/09/23 Python
Python实现栈的方法详解【基于数组和单链表两种方法】
2020/02/22 Python
Python定义一个函数的方法
2020/06/15 Python
Vrbo西班牙:预订您的度假公寓(公寓、乡村房屋…)
2020/04/27 全球购物
新西兰最大、占有率最高的综合性药房:PharmacyDirect药房中文网
2020/11/03 全球购物
新加坡最早生产电动滑板车的制造商之一:FunsToTheFore
2020/09/08 全球购物
就业推荐表自我鉴定
2014/03/21 职场文书
信息管理与信息系统专业求职信
2014/06/21 职场文书
2015年初中生自我评价范文
2015/03/03 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
一文读懂go中semaphore(信号量)源码
2021/04/03 Golang
React Hook用法示例详解(6个常见hook)
2021/04/28 Javascript
SpringBoot整合MongoDB的实现步骤
2021/06/23 MongoDB
Python中time标准库的使用教程
2022/04/13 Python
webpack介绍使用配置教程详解webpack介绍和使用
2022/06/25 Javascript