# 一、创建vue项目
这里我使用脚手架搭建,原因:不用自己一个个引入组件库,节省了配置文件的时间。
在
components
下Dialog.vue
和index.js
Dialog.vue
:定义组件index.js
:将组件注册为全局组件|--components |--Dialog.vue |--index.js
1
2
3
# 二、添加组件结构样式
一般做项目
UI
组件是复用率最高的,所以为了减少copy
次数,组件功能尽量完整。
- 结构大致分为:背景、主体、主体头、主体内容、主体底
- 样式看具体需求
# 三、注册全局组件
如果想在
vue
中注册全局组件,就需要使用vue.use()
,需要在调用new Vue()
之前使用。
在index.js
中引入组件,并注册组件(Vue.component('名字','对象)
),暴露install
方法。分为三步:
- 引入组件
- 定义
install
方法并注册为全局组件 - 暴露
install
方法
import Dialog from './Dialog'
const install = (Vue) => {
Vue.component(Dialog.name, Dialog)
}
export default {
install
}
2
3
4
5
6
7
8
9
在main
中进行全局引入
import Vue from 'vue'
import App from './App.vue'
import LxjUI from './components'
Vue.config.productionTip = false
Vue.use(LxjUI)
new Vue({
render: h => h(App),
}).$mount('#app')
2
3
4
5
6
7
8
9
10
组件测试
在
App
中测试组件<template> <div id="app"> <xj-dialog title='你好!'> <h3>这是我的dialog组件</h3> </xj-dialog> </div> </template> <script> export default { name: 'App' } </script>
1
2
3
4
5
6
7
8
9
10
11
12
13到这里
dialog
组件就封装完毕了
# 四、打包
什么是打包?
我理解的打包是
js
、css
、html
合并,将多个文件打包成一个文件并解决浏览器兼容问题。 以webpack为例:
1. 提高性能,压缩体积。模块化开发有很多引用关系,打包后会变成一个js,减少了http请求。 2. 将高版本js语法转为低版本。开发过程中可能会使用ES6语法,打包后能将语法转为ES5. 3. 能将Less、Sass编译成css
1
2
3为什么要打包?
组件封装完成,现在只是自己的项目可以使用,但是我们需要让别人的项目也能使用,所以需要打包成
js
文件。
vue
文件会打包成dist
文件,不仅节约资源,还能让其他浏览器也能解析这里使用
webpack
打包,需要配置package.json
文件的scripts
,新增build
命令。由于我是用脚手架创建的
vue
项目,所以默认初始化了package.json
。
初始化
package.json
在
package.json
中新增一行命令"scripts": { "serve": "vue-cli-service serve", "build": "vue-cli-service build", "lib": "vue-cli-service build --target lib ./src/components/index.js" // 新增命令 }
1
2
3
4
5执行打包命令:
npm run lib
项目就生成了
dist
- 在
dist
路径下会有多个js
文件,这是因为打包生成了多种js
规范的文件。 - 发布时,因为
js
文件较多,用户不可能全部使用,需要指定入口文件
- 在
这样我们的打包部分就完成了
# 五、发布到npm
发布到
npm
有很多注意点,学习发包的时候注意不到很多问题,以为简单的npm publish
就行。自己发包的时候才发现原来还有那么多细节。
第一步:设置
package.json
中的配置项如果想把包发布到
npm
上,package.json
中的private
必须是false
,需要将其设置为公用包:"private":false
name
必须为npm
上没有的包,否则不能上传同时我们可以指定入口文件
"main":"dist/lxj-ui-upload.umd.min.js"
我们可以添加其他个人信息:
{ "name": "shang-utils", // 包名,必须要独一无二 "version": "1.0.0", // 版本号 "author": "xxx", // 作者 "description": "common toolkit", // 描述信息 "keywords": ["utils", "format", "money", "phone"], // 关键词,提升SEO "repository": { // 代码托管位置 "type": "git", "url": "https://github.com/xxx/shang-utils" }, "license": "ISC", // 许可证 "homepage": "https://your-package.org", // 包的主页或者文档首页 "bugs": "https://github.com/xxx/shang-utils/issues", // 用户问题反馈地址 "main": "index.js", // 入口文件 "scripts": { // 存放可执行脚本 "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { // 运行依赖 }, "devDependencies": { // 开发依赖 } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
第二步:根目录下增加一个
.npmignore
文件这个文件的作用是将一些不需要上传到
npm
的路径、文件进行忽略,我们在上传时就不会上传这部分了(类似.gitignore
)。因为我们已经将项目打包好了,所以我们只需要上传dist
路径下的打包文件,不需要上传源码。# 忽略目录 examples/ packages/ public/ # 忽略指定文件 vue.config.js babel.config.js *.map
1
2
3
4
5
6
7
8
9第三步:上传到
npm
如果安装了
nrm
,需要保证当前的源是npm
,不能是淘宝源镜像修改为npm原镜像
npm config set registry=https://registry.npmjs.org
1修改为淘宝源镜像
npm config set registry https://registry.npm.taobao.org
1添加
npm
用户- 进入
dist
目录,添加npm
用户,执行命令: npm adduser
- 第一次发包需要设置
- 进入
使用
npm login
登录上传的包不是立马显示出来的,需要过一段时间
- 在dist目录下执行命令:
npm publish
- 发布失败的原因:
npm
中包名可能已经存在 - 发布完成,
npm
包显示会有延迟
# 六、测试npm
进入
npm
官网直接搜索name
属性的名字,如果能搜到就可以使用,如果搜不到可能是发包失败或者还没更新
将组件下载到本地项目
npm i lxj-ui //将我们包下载下来,就可以在项目的node-modules路径下找到这个包了
1使用
lxj-ui
在main中导入组件和组件依赖的样式
import LxjUi from 'lxj-ui' import 'lxj-ui/dist/lxj-ui.css' Vue.use(LxjUi)
1
2
3
在
App.vue
中测试一下<xj-dialog title='你好!'> <h3>这是我的dialog组件</h3> </xj-dialog>
1
2
3到这里我们的自定义
ui
组件库就封装完成了。
# 七、更新包
// 自动更改版本号,并且commit
// npm version xxx
// 控制台会返回下一个小版本号 如v1.0.1
npm version patch
// 重新发布
npm publish
2
3
4
5
6
7
8
// patch:补丁号,修复bug,小变动,如 v1.0.0->v1.0.1
npm version patch
// minor:次版本号,增加新功能,如 v1.0.0->v1.1.0
npm version minor
// major:主版本号,不兼容的修改,如 v1.0.0->v2.0.0
npm version major
2
3
4
5
6
7
8
# 总结
这篇文章只是简单的封装
Vue
组件并发布到npm
仓库,加强了Vue
的install
方法使用,加深了传参、插槽的使用,了解了打包相关知识。一个好的组件,应该具有很高的复用性和广泛的适用范围、极强的扩展性。