详解如何制作并发布一个vue的组件的npm包


Posted in Javascript onNovember 10, 2018

前提:1.会vue基础,以及vue的组件(官网:https://cn.vuejs.org/v2/guide/components.html)相关的基础。

因为本文主要是讲如何把一个vue组件做成npm包并发布。

分为2大步骤:

一.按照相应格式写我们的vue代码(就如同写一个jquery插件时、有其固定的格式一样)。

二.发布到npm上的流程

一、书写一个vue组件

不用脚手架,我们自己从头开始做起,因为脚手架会附带很多没用的东西。

就做一个最简单的vue组件:就是传入用户名字,页面打印出‘hello,用户名'的组件。

比如,我的预期目标是其他vue项目中,npm install本组件后,可以如此使用该组件:

<template>
 <div class="index">
 
  <div class="demo1">
   <Msg :data="myData"></Msg>
  </div>
 
 </div>
</template>
<script>
 import Msg from 'npm-study-hamupp';
 export default {
  components: {
   Msg
  },
  data(){
   return {
    myData: {
     name: '天天',
     country: 'china'
    }
   }
  }
 }
</script>

然后网页上会显示:

详解如何制作并发布一个vue的组件的npm包

OJBK,现在开搞:

1.新建一个空文件夹,进入到根目录下。执行

npm init

初始化项目。然后会让你填一些项目相关的信息,跟着提示填就是了。没啥说的。注意name不要和现有的其他npm包重名了,不然一会儿发Npm包的时候会失败,可以先去npmjs.com搜一下有没有重名的。

这一步完成后,会生成package.json文件。

2.由于本例是一个vue的组件包,而且使用了es6和webpack,所以在devDependencies字段中,应该至少加入以下依赖:

package.json

{
	"name": "npm-study-hamupp",
	"version": "1.0.3",
	"description": "",
	"main": "dist/helloMsg.min.js",
	"scripts": {
		"test": "echo \"Error: no test specified\" && exit 1",
		"start": "webpack-dev-server --hot --inline",
		"build": "webpack --display-error-details --config webpack.config.js"
	},
	"repository": {
		"type": "git",
		"url": "git+https://github.com/hamuPP/npmStudy.git"
	},
	"author": "",
	"license": "ISC",
	"bugs": {
		"url": "https://github.com/hamuPP/npmStudy/issues"
	},
	"homepage": "https://github.com/hamuPP/npmStudy#readme",
	"devDependencies": {
		"babel-core": "^6.26.0",
		"babel-loader": "^7.1.2",
		"babel-plugin-transform-object-rest-spread": "^6.26.0",
		"babel-plugin-transform-runtime": "^6.23.0",
		"babel-polyfill": "^6.26.0",
		"babel-preset-es2015": "^6.24.1",
		"css-loader": "^0.28.7",
		"es6-promise": "^4.1.1",
		"less": "^2.7.3",
		"less-loader": "^4.0.5",
		"style-loader": "^0.19.0",
		"url-loader": "^0.6.2",
		"vue": "^2.5.9",
		"vue-hot-reload-api": "^2.2.4",
		"vue-html-loader": "^1.2.4",
		"vue-loader": "^13.5.0",
		"vue-router": "^3.0.1",
		"vue-style-loader": "^3.0.3",
		"vue-template-compiler": "^2.5.9",
		"vuex": "^3.0.1",
		"webpack": "^3.9.1",
		"webpack-dev-server": "^2.9.5"
	}
}

这些依赖的用处分别都是啥,自己查。

3.执行npm install,下载这些依赖包。

4.新建2个文件夹:dist和src,名字按照个人习惯吧。我习惯dist代表发布时的目录,src是开发目录。dist里面的js是到时候通过webpack打包后的文件。待会只会提交dist目录到npm官网上,src不提交。

src里:我们比较常规的写一个vue组件

详解如何制作并发布一个vue的组件的npm包

样式就不说了,照常写。

app.vue(写法上也很常规):

<style scoped lang="less">
 @import 'styles/common.less';
</style>
<template>
 <div class="msg-wrapper">
  <span>hello!</span>
  <span class="account">{{data.name}}</span>
 </div>
</template>
<script>
 export default {
  name:'Msg',
  data () {
   return {}
  },
  props:{
   data:{
    type:Object
   }
  },
  methods: {
 
  },
  created(){
   let that = this;
  }
 }
</script>

index.js(这里的写法就与普通vue项目有所不同了,主要要把它export出去):

import Msg from './app.vue'
export default Msg;

5.加入webpack打包配置,并把src中的内容打包进dist目录内:

根目录下新增weppack.config.js文件

const path = require("path");
const webpack = require("webpack");
const uglify = require("uglifyjs-webpack-plugin");
 
module.exports = {
 devtool: 'source-map',
 entry: "./src/index.js",//入口文件,就是上步骤的src目录下的index.js文件,
 output: {
  path: path.resolve(__dirname, './dist'),//输出路径,就是上步骤中新建的dist目录,
  publicPath: '/dist/',
  filename: 'helloMsg.min.js',
  libraryTarget: 'umd',
  umdNamedDefine: true
 },
 module: {
  rules: [{
    test: /\.vue$/,
    loader: 'vue-loader'
   },
   {
    test: /\.less$/,
    use: [
     { loader: "style-loader" },
     { loader: "css-loader" },
     { loader: "less-loader" }
    ]
   },
   {
    test: /\.js$/,
    exclude: /node_modules|vue\/dist|vue-router\/|vue-loader\/|vue-hot-reload-api\//,
    loader: 'babel-loader'
   },
   {
    test: /\.(png|jpg|gif|ttf|svg|woff|eot)$/,
    loader: 'url-loader',
    query: {
     limit: 30000,
     name: '[name].[ext]?[hash]'
    }
   }
  ]
 },
 plugins: [
  new webpack.DefinePlugin({
   "process.env": {
    NODE_ENV: JSON.stringify("production")
   }
  })
 ]
};

然后执行npm run build,就会在dist目录下生成helloMsg.min.js。这即是我们这个npm包的主文件。

6.修改package.json中的main字段中指向的主文件信息

package.json

{
	...
	"main": "dist/helloMsg.min.js",

7.新建一个文件,名为.npmignore,是不需要发布到npm的文件和文件夹,规则和.gitignore一样。如果你的项目底下有.gitignore但是没有.npmignore,那么会使用.gitignore里面的配置。

例如我的:

.npmignore

.*
*.md
*.yml
build/
node_modules/
src/
test/
gulpfile.js

至此,一个npm组件包就做完了,剩下的,只是提交到npm官网去。

(如果要严谨点,当然还需要加入单元测试通过后再发包。。。但是。。。)

二、发布到npm上的流程

1.前提,得有个npm账号,没有就新注册一个账号,

https://www.npmjs.com/signup?utm_source=house&utm_medium=package%20page&utm_campaign=free%20orgs&utm_term=Sign%20up%20for%20npm

2.进入到项目的根目录下,运行 npm login

它会让你输入你的用户名,密码和邮箱,若登录成功,会显示:

Logged in as 你的名字 on https://registry.npmjs.org/.

3.然后执行npm publish,即可将这个npm包发布到npm官网上拉。

4.更新、发新包。

需要发新包时,需要自己手动修改package.json中的version版本号,惯例是+1啦,比如1.0.0-->1.0.1。然后npm login,npm publish。即可。

三、结语:

1.发包时的常见错误:

name名重名、name名还有大写字母。。。

2.本项目的git地址:

https://github.com/hamuPP/npmStudy,如果你对本文说的不太明白,可以下载这个项目,自己随便改一下app.vue里面的东西,然后修改package.json中的name和version(一定要改哦),提交到npm上试试

3.我还按照该项目结构,做了一个基于vue 的同步树的npm组件包。

https://github.com/hamuPP/t-vue-tree

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery contains过滤器实现精确匹配使用方法
Apr 12 Javascript
对table和ul实现js分页示例分享
Feb 24 Javascript
javascript 应用小技巧方法汇总
Jul 05 Javascript
jquery遍历table的tr获取td的值实现方法
May 19 Javascript
深入理解Javascript中的自执行匿名函数
Jun 03 Javascript
JS图片放大效果简单实现代码
Sep 08 Javascript
BootStrap 实现各种样式的进度条效果
Dec 07 Javascript
给vue项目添加ESLint的详细步骤
Sep 29 Javascript
vue.js 嵌套循环、if判断、动态删除的实例
Mar 07 Javascript
vue源码学习之Object.defineProperty 对数组监听
May 30 Javascript
jQuery实现模拟搜索引擎的智能提示功能简单示例
Jan 27 jQuery
React通过redux-persist持久化数据存储的方法示例
Feb 14 Javascript
如何在基于vue-cli的项目自定义打包环境
Nov 10 #Javascript
Vue项目报错:Uncaught SyntaxError: Unexpected token
Nov 10 #Javascript
node+express框架中连接使用mysql(经验总结)
Nov 10 #Javascript
vue axios请求频繁时取消上一次请求的方法
Nov 10 #Javascript
微信小程序实现跑马灯效果
Oct 21 #Javascript
微信小程序使用scroll-view标签实现自动滑动到底部功能的实例代码
Nov 09 #Javascript
vue.js自定义组件directives的实例代码
Nov 09 #Javascript
You might like
浅析php插件 Simple HTML DOM 用DOM方式处理HTML
2013/07/01 PHP
php断点续传之如何分割合并文件
2014/03/22 PHP
PHP中实现获取IP和地理位置类分享
2015/02/10 PHP
php简单实现查询数据库返回json数据
2015/04/16 PHP
关于php中的json_encode()和json_decode()函数的一些说明
2016/11/20 PHP
php读取本地json文件的实例
2018/03/07 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
详解php伪造Referer请求反盗链资源
2019/01/24 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
YII2框架中添加自定义模块的方法实例分析
2020/03/18 PHP
PHP 扩展Memcached命令用法实例总结
2020/06/04 PHP
eval与window.eval的差别分析
2011/03/17 Javascript
jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果
2013/06/27 Javascript
jQuery中after的两种用法实例
2013/07/03 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
2016/05/24 Javascript
浅谈javascript中new操作符的原理
2016/06/07 Javascript
bootstrap fileinput 插件使用项目总结(经验)
2017/02/22 Javascript
angular.js实现列表orderby排序的方法
2018/10/02 Javascript
vue防止花括号{{}}闪烁v-text和v-html、v-cloak用法示例
2019/03/13 Javascript
基于node简单实现RSA加解密的方法步骤
2019/03/21 Javascript
node.js的http.createServer过程深入解析
2019/06/06 Javascript
vue.js路由mode配置之去掉url上默认的#方法
2019/11/01 Javascript
JS实现手风琴特效
2020/11/08 Javascript
[57:59]EG vs Secret 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
Python单例模式实例分析
2015/01/14 Python
python实现转圈打印矩阵
2019/03/02 Python
Linux上使用Python统计每天的键盘输入次数
2019/04/17 Python
python2 中 unicode 和 str 之间的转换及与python3 str 的区别
2019/07/25 Python
python异常处理和日志处理方式
2019/12/24 Python
python中怎么表示空值
2020/06/19 Python
Cotton On南非:澳洲时尚平价品牌
2018/06/28 全球购物
中东奢侈品购物网站:Ounass
2020/09/02 全球购物
《跨越海峡的生命桥》教学反思
2014/02/24 职场文书
烹饪自我鉴定
2014/03/01 职场文书
环保标语大全
2014/06/12 职场文书
销售合作意向书范本
2015/05/08 职场文书