从零开始在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 相关文章推荐
jquery photoFrame 图片边框美化显示插件
Jun 28 Javascript
关于Mozilla浏览器不支持innerText的解决办法
Jan 01 Javascript
Javascript开发之三数组对象实例介绍
Nov 12 Javascript
Javascript模块化编程(一)AMD规范(规范使用模块)
Jan 17 Javascript
jquery操作HTML5 的data-*的用法实例分享
Aug 17 Javascript
JavaScript获取当前网页最后修改时间的方法
Apr 03 Javascript
JavaScript实现相册弹窗功能(zepto.js)
Jun 21 Javascript
js生成随机数方法和实例
Jan 17 Javascript
jQuery设计思想
Mar 07 Javascript
Javascript中绑定click事件的四种方式介绍
Oct 26 Javascript
Node.js从字符串生成文件流的实现方法
Aug 18 Javascript
NestJs使用Mongoose对MongoDB操作的方法
Feb 22 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
多文件上传的例子
2006/10/09 PHP
收集的php编写大型网站问题集
2007/03/06 PHP
mysql 查询指定日期时间内sql语句实现原理与代码
2012/12/16 PHP
PHP将HTML转换成文本的实现代码
2015/01/21 PHP
php和editplus正则表达式去除空白行
2015/04/17 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
Web跨浏览器进程通信(Web跨域)
2013/04/17 Javascript
jQuery中filter()和find()的区别深入了解
2013/09/25 Javascript
js传中文参数controller里获取参数乱码问题解决方法
2014/01/03 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
Bootstrap4一次重大更新 几乎涉及每行代码
2016/05/16 Javascript
JS批量替换内容中关键词为超链接
2017/02/20 Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
2017/03/30 Javascript
详解node nvm进行node多版本管理
2017/10/21 Javascript
vue单页缓存存在的问题及解决方案(小结)
2018/09/25 Javascript
微信小程序实现简易table表格
2020/06/19 Javascript
vue父组件触发事件改变子组件的值的方法实例详解
2019/05/07 Javascript
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
2020/06/06 jQuery
js+css3实现炫酷时钟
2020/08/18 Javascript
python在多玩图片上下载妹子图的实现代码
2013/08/13 Python
Python编程实现使用线性回归预测数据
2017/12/07 Python
代码分析Python地图坐标转换
2018/02/08 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
2018/10/22 Python
对dataframe数据之间求补集的实例详解
2019/01/30 Python
Python实现堡垒机模式下远程命令执行操作示例
2019/05/09 Python
python线程安全及多进程多线程实现方法详解
2019/09/27 Python
Tensorflow: 从checkpoint文件中读取tensor方式
2020/02/10 Python
python statsmodel的使用
2020/12/21 Python
利用CSS3实现圆角的outline效果的教程
2015/06/05 HTML / CSS
兰蔻英国官网:Lancome英国
2019/04/30 全球购物
CHARLES & KEITH台湾官网:新加坡时尚品牌
2019/07/30 全球购物
俄罗斯女装店:12storeez
2019/10/25 全球购物
2014年法务工作总结
2014/12/11 职场文书
写给医生的感谢信
2015/01/22 职场文书
环保建议书范文
2015/09/14 职场文书
护理培训心得体会
2016/01/22 职场文书