项目中经常遇到需要组件复用的情况,本文将介绍如何将 Vue 组件封装成 npm 包,并上传到 npm 私有仓库(本文不介绍 npm 私有仓库的搭建,请自行查阅相关资料)。
通过 vue-cli 创建并初始化 vue2 项目;
$ vue create app
创建src/packages
目录用来存放组件,项目整体目录结构如下;
app
├── README.md
├── babel.config.js
├── jsconfig.json
├── node_modules
├── package-lock.json
├── package.json
├── public
│ ├── favicon.ico
│ └── index.html
├── src
│ ├── App.vue
│ ├── assets
│ ├── components
│ ├── packages
│ └── main.js
└── vue.config.js
此处以简单的 HelloVue 组件为例,新建src/packages/hello-vue/index.vue
文件,内容如下:
{{ msg }}
在src/App.vue
中引入HelloVue
组件测试能否正常使用,内容如下:
测试通过后,编写打包入口 js 文件,创建src/index.js
文件,内容如下:
import HelloVue from "@/packages/hello-vue/index.vue";// 需要打包导出的组件
const components = [HelloVue
];const install = function (Vue) {components.map(component => {Vue.component(component.name, component);});
}if (typeof window !== 'undefined' && window.Vue) {install(window.Vue);
}export default {name: "HelloVue",version: "1.0.0",install
};
编写Readme.md
文件内容,如插件使用方式等等。
使用非编译的方式可以解决src/assets
文件夹下静态文件依赖的问题,但无法解决public
目录静态文件依赖问题(目前还没找到较好的解决办法)。
修改package.json
文件,修改内容如下:
{"name": "@zhy/app", // 包名"version": "0.1.0", // 版本号,后续每次更新发布都要修改"private": false, // 必须修改为 false"description": "Hello Vue!", // 包描述"main": "./src/index.js" // 包入口文件
}
添加.npmignore
文件,忽略不需要发布的文件,如配置文件等;
node_modules/public/src/components
src/App.vue
src/main.js.gitignorebabel.config.js
jsconfig.json
package-lock.json
vue.config.js.idea
登录私有仓库,此处笔者仓库地址为http://172.20.2.5:8081/repository/npm-hosted/
;
# 根据提示输入用户名密码登录
$ npm login --registry http://172.20.2.5:8081/repository/npm-hosted/
发布到私有仓库;
# 发布
$ npm publish --registry http://172.20.2.5:8081/repository/npm-hosted/# 从私有仓库删除(谨慎操作)
$ npm unpublish -f --registry http://172.20.2.5:8081/repository/npm-hosted/
编译的方式可以对代码进行编译压缩,隐藏源码,但无法解决静态文件依赖的问题。
修改package.json
文件,修改内容如下:
{"name": "@zhy/app", // 包名"version": "0.1.0", // 版本号,后续每次更新发布都要修改"private": false, // 必须修改为 false"description": "Hello Vue!", // 包描述"main": "./app/app.umd.js", // 包入口文件,对应打包后的目录"scripts": {"serve": "vue-cli-service serve","build": "vue-cli-service build","lint": "vue-cli-service lint",// 新增打包脚本,--name 打包后的名字,--dest 打包后的目录"package": "vue-cli-service build --target lib src/index.js --name app --dest app"}
}
打包编译;
# 成功后生成打包目录 app
$ npm run package
添加.npmignore
文件,忽略不需要发布的文件,如配置文件等;
node_modules/public/
src/.gitignore
.npmignorebabel.config.js
jsconfig.json
package-lock.json
vue.config.js.idea
登录私有仓库,此处笔者仓库地址为http://172.20.2.5:8081/repository/npm-hosted/
;
# 根据提示输入用户名密码登录
$ npm login --registry http://172.20.2.5:8081/repository/npm-hosted/
发布到私有仓库;
# 发布
$ npm publish --registry http://172.20.2.5:8081/repository/npm-hosted/# 从私有仓库删除(谨慎操作)
$ npm unpublish -f --registry http://172.20.2.5:8081/repository/npm-hosted/
创建并初始化 Vue 项目;
$ vue create test-app
安装依赖;
$ npm install @zhy/app --registry http://172.20.2.5:8081/repository/npm-hosted/
在src/main.js
文件中注册插件;
import HelloVue from '@zhy/app';Vue.use(HelloVue);
在App.vue
中使用插件;
参考资料: