从零开始在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 相关文章推荐
共享自己写一个框架DreamScript
Jan 20 Javascript
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
Jan 21 Javascript
JavaScript定时器详解及实例
Aug 01 Javascript
javascript实现英文首字母大写
Apr 23 Javascript
javascript实现的登陆遮罩效果汇总
Nov 09 Javascript
jquery动态增加删减表格行特效
Nov 20 Javascript
理解AngularJs指令
Dec 10 Javascript
基于JS代码实现导航条弹出式悬浮菜单
Jun 17 Javascript
利用js实现前后台传送Json的示例代码
Mar 29 Javascript
Javascript实现运算符重载详解
Apr 07 Javascript
js简单实现自动生成表格功能示例
Jun 02 Javascript
Vue 请求传公共参数的操作
Jul 31 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修改数组键名的方法示例
2017/04/15 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
2017/05/02 PHP
PHP面向对象之里氏替换原则简单示例
2018/04/08 PHP
php 后端实现JWT认证方法示例
2018/09/04 PHP
对php 判断http还是https,以及获得当前url的方法详解
2019/01/15 PHP
PHP实现的微信公众号扫码模拟登录功能示例
2019/05/30 PHP
Laravel 5.1 框架Blade模板引擎用法实例分析
2020/01/04 PHP
PHP超级全局变量【$GLOBALS,$_SERVER,$_REQUEST等】用法实例分析
2019/12/11 PHP
jquery 事件执行检测代码
2009/12/09 Javascript
jquery插件制作简单示例说明
2012/02/03 Javascript
js编写trim()函数及正则表达式的运用
2013/10/24 Javascript
js控制当再次点击按钮时的间隔时间
2014/06/03 Javascript
jQuery焦点图切换简易插件制作过程全纪录
2014/08/27 Javascript
jquery 获取 outerHtml 包含当前节点本身的代码
2014/10/30 Javascript
javascript html实现网页版日历代码
2016/03/08 Javascript
AngularJS中isolate scope的用法分析
2016/11/22 Javascript
jquery pagination插件动态分页实例(Bootstrap分页)
2016/12/23 Javascript
微信小程序 轮播图swiper详解及实例(源码下载)
2017/01/11 Javascript
vue组件之Alert的实现代码
2017/10/17 Javascript
vue使用axios跨域请求数据问题详解
2017/10/18 Javascript
使用webpack5从0到1搭建一个react项目的实现步骤
2020/12/16 Javascript
用Javascript实现发送短信验证码间隔功能
2021/02/08 Javascript
通过数据库向Django模型添加字段的示例
2015/07/21 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
2019/09/23 Python
使用python-opencv读取视频,计算视频总帧数及FPS的实现
2019/12/10 Python
Tensorflow tf.tile()的用法实例分析
2020/05/22 Python
python爬虫爬取图片的简单代码
2021/01/18 Python
美国在线印刷公司:PsPrint
2017/10/12 全球购物
屈臣氏官方旗舰店:亚洲享负盛名的保健及美妆零售商
2019/03/15 全球购物
Java中compareTo和compare的区别
2016/04/12 面试题
预备党员2014全国两会学习心得体会
2014/03/10 职场文书
公司捐款倡议书
2014/05/14 职场文书
放飞梦想演讲稿800字
2014/08/26 职场文书
领导干部作风建设剖析材料
2014/10/11 职场文书
信访维稳工作汇报
2014/10/27 职场文书
酒店辞职书范文
2015/02/26 职场文书