# vue 组件发布到 npm
# 1、创建 vue 项目
vue create my-ui
1
# 2、创建组件库
在根目录下创建目录 packages
# 2.1 配置组件 package.json
进入 pakages
文件目录下,执行 npm init -y
,执行完后生成 package.json
{
"name": "my-ui",
"version": "0.0.1",
"description": "",
"main": "lib/index.js", // 入口文件
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "sanyer",
"license": "ISC"
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 2.2 创建组件
packages/lib/my-test
在 packages
下创建 lib
目录,再创建 my-test
组件目录
-packages
lib // 组件
my-test // 组件目录
src
my-test.vue
index.js // 导出当前组件
index.js // 导出所有组件
1
2
3
4
5
6
7
2
3
4
5
6
7
packages/lib/my-test/index.js
import MyTest from './src/main';
/* istanbul ignore next */
MyTest.install = function (Vue) {
Vue.component(MyTest.name, MyTest);
};
export default MyTest;
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
packages/lib/my-test/src/main.vue
<template>
<div class="my-test">{{ text }}</div>
</template>
<script>
export default {
name: 'MyTest',
data() {
return {
text: 'hello world',
};
},
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
packages/lib/index.js
import MyTest from './my-test';
const components = [MyTest];
const install = function (Vue) {
components.forEach(component => {
Vue.component(component.name, component);
});
};
/* istanbul ignore if */
if (typeof window !== 'undefined' && window.Vue) {
install(window.Vue);
}
export default {
install,
MyTest,
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 3、编写样式
packages/lib/theme-chalk/index.scss
导入全部样式
@import './hl-search.scss';
1
packages/lib/theme-chalk/hl-search.scss
单个组件样式
.hl-search {
color: rgb(255, 0, 0);
}
1
2
3
2
3
# 4、打包配置
# 打包组件
npm run build:lib
# 打包样式
npm run build:css
1
2
3
4
2
3
4
# 4.1 package.json
配置根目录下 package.json
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint",
"build:lib": "vue-cli-service build --target lib ./packages/lib/index.js --dest ./packages/dist-lib --name my-ui",
"build:css": "gulp build"
},
1
2
3
4
5
6
7
2
3
4
5
6
7
# 4.2 打包样式
这里使用 gulp 打包
(1)安装 gulp
npm i gulp gulp-sass gulp-cssmin gulp-autoprefixer -D
1
(2)配置 gulp
根目录下创建 gulpfile.js
'use strict';
const { series, src, dest } = require('gulp');
const sass = require('gulp-sass')(require('sass'));
const autoprefixer = require('gulp-autoprefixer');
const cssmin = require('gulp-cssmin');
function compile() {
return src('./packages/lib/theme-chalk/*.scss')
.pipe(sass())
.pipe(
autoprefixer({
browsers: ['ie > 9', 'last 2 versions'],
cascade: false,
}),
)
.pipe(cssmin())
.pipe(dest('./packages/dist-theme-chalk')); // 打包后的目录
}
function copyfont() {
return src('./packages/lib/theme-chalk/fonts/**')
.pipe(cssmin())
.pipe(dest('./packages/dist-theme-chalk/fonts')); // 字体文件打包
}
exports.build = series(compile, copyfont);
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
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
# 5、发布到 npm
进入 pakages 文件夹,打开 cmd 窗口
如果没有 npm 账号,登录 https://www.npmjs.com/ 官网去注册账号
切换 nrm 的地址为 npm 原地址,若果没有安装 nrm,先安装
npm i nrm -g
1
- 执行
nrm ls
查看当前的路径,执行nrm use npm
切回 npm 原路径
nrm ls
nrm use npm
1
2
2
- 执行
npm login
,输入用户名和密码
npm login
1
- 执行
npm publish
,发布到 npm
npm publish
1
- 登录官网,点击小头像进入到 packages 下看看是否有自己的包
# 6、引入自己发布的包
- 安装
npm i my-ui
1
- 在 main.js 中引入
import Vue from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';
import MyUi from 'my-ui'; // 引入入口文件
import 'my-ui/my-ui.css'; // 引入样式文件
Vue.use(MyUi); // vue使用组件
Vue.config.productionTip = false;
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 7、更新自己发布的包
若修改了组件,要更新到 npm 上,则改完后执行下面这三个命令中的一个
npm version patch // 如果说要改为1.0.x,最后一位增加了1,这个是补丁的意思,就是小小的改一下
npm version minor // 如果说要改为1.x.0,中间一位增加了1,这个是小修小改
npm version major // 如果说要改为x.0.0,第一位增加了1,这个是大改
1
2
3
2
3
然后再发布即可
npm publish
1
项目上更新包需要修改 package.json 包的组件的版本号,然后执行:
npm update my-ui
1
# 8、参考
https://blog.csdn.net/qq_47452289/article/details/122435654
← 2.1-vue组件通信 3-vue插件开发 →