详解如何制作并发布一个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 相关文章推荐
JS取得绝对路径的实现代码
Jan 16 Javascript
浅谈javascript 函数内部属性
Jan 21 Javascript
jQuery三级下拉列表导航菜单代码分享
Apr 15 Javascript
JS实现超简洁网页title标题跑动闪烁提示效果代码
Oct 23 Javascript
JS制作适用于手机和电脑的通知信息效果
Oct 28 Javascript
Bootstrap如何激活导航状态
Mar 22 Javascript
微信小程序视图控件与bindtap之间的问题的解决
Apr 08 Javascript
基于JavaScript获取base64图片大小
Oct 18 Javascript
vue实现简单图片上传
Jun 30 Javascript
vue-列表下详情的展开与折叠案例
Jul 28 Javascript
JavaScript JSON使用原理及注意事项
Jul 30 Javascript
解决removeEventListener 无法清除监听的问题
Oct 30 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检测字符串是否为UTF8编码的常用方法
2014/11/21 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
2018/10/14 PHP
JS 有名函数表达式全面解析
2010/03/19 Javascript
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
2013/01/23 Javascript
ComboBox 和 DateField 在IE下消失的解决方法
2013/08/30 Javascript
CheckBoxList多选样式jquery、C#获取选择项
2013/09/06 Javascript
jQuery把表单元素变为json对象
2013/11/06 Javascript
一些实用性较高的js方法
2016/04/19 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
2017/01/22 Javascript
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
jquery+php后台实现省市区联动功能示例
2019/05/23 jQuery
通过原生vue添加滚动加载更多功能
2019/11/21 Javascript
原生js实现拖拽移动与缩放效果
2020/08/24 Javascript
python中精确输出JSON浮点数的方法
2014/04/18 Python
用Python中的字典来处理索引统计的方法
2015/05/05 Python
使用Python脚本生成随机IP的简单方法
2015/07/30 Python
python 网络爬虫初级实现代码
2016/02/27 Python
教大家玩转Python字符串处理的七种技巧
2017/03/31 Python
python编程实现随机生成多个椭圆实例代码
2018/01/03 Python
python实现在图片上画特定大小角度矩形框
2018/10/24 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
2018/12/02 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
2019/01/17 Python
python3实现zabbix告警推送钉钉的示例
2019/02/20 Python
Pycharm中Python环境配置常见问题解析
2020/01/16 Python
Python实现Word表格转成Excel表格的示例代码
2020/04/16 Python
matplotlib 对坐标的控制,加图例注释的操作
2020/04/17 Python
python 自动识别并连接串口的实现
2021/01/19 Python
微信小程序之html5 canvas绘图并保存到系统相册
2019/06/20 HTML / CSS
FOREO官方网站:LUNA露娜洁面仪
2016/11/28 全球购物
定制iPhone和Macbook保护壳:Slick Case
2018/11/21 全球购物
北京华建集团SQL面试题
2014/06/03 面试题
客服部班长工作责任制
2014/02/25 职场文书
师德师风建设方案
2014/05/08 职场文书
实习公司领导推荐函
2014/05/21 职场文书
统计学教授推荐信
2014/09/18 职场文书
2016年九九重阳节活动总结
2016/04/01 职场文书