npm上传vue组件
大约 4 分钟
封装vue组件打包上传到npm
一、创建 vue2 的项目
二、创建目录及封装组件
项目文件结构

1. dist 文件夹
这个是打包后上传到 npm 上面的
2. node_modules 文件夹
node_modules 项目依赖包
3. public 文件夹
项目的静态问价文件
4. src 中
(1)src 中的 components
components 中的文件夹是存放封装的组件,每一个组件是一个单独的文件夹
例如:wangxiao-btn
- index.vue
<template>
<div>
<div>
<slot></slot>
</div>
</div>
</template>
<script>
export default {
name: "WangxiaoBtn",
}
</script>
- index.js
import WangxiaoBtn from "./index.vue";
WangxiaoBtn.install = (Vue) => {
Vue.component(WangxiaoBtn.name, WangxiaoBtn)
}
export default WangxiaoBtn;
(2)src 中的 index.js
import WangxiaoTable from "./components/wangxiao-table/index.js";WangxiaoBtn
import WangxiaoBtn from "./components/wangxiao-btn/index.js";
const components = [ WangxiaoTable, WangxiaoBtn ];
// 指令
// const directives = [xxxx]
// 过滤器
// const filters = [xxxx]
// 定义 install 方法,Vue 作为参数
const install = Vue => {
// 判断是否安装,安装过就不用继续执行
if (install.installed) return;
install.installed = true;
// 遍历注册所有组件
components.map((component) => Vue.component(component.name, component));
// 遍历注册所有指令
// directives.map(directives => Vue.use(directives))
// 遍历过滤器
// filters.map(filters => Vue.use(filters))
};
// 检测到 Vue 再执行
if (typeof window !== "undefined" && window.Vue) {
install(window.Vue);
}
export { WangxiaoTable, WangxiaoBtn } // 按需引入 导出
export default {
install,
// 所有组件,必须具有 install 方法才能使用 Vue.use()
WangxiaoTable,
};
(3)src 中的 main.js
import Vue from 'vue'
import App from './App.vue'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import wangXiaoUi from "./index";
Vue.config.productionTip = false
Vue.use(ElementUI);
Vue.use(wangXiaoUi);
new Vue({
render: h => h(App),
}).$mount('#app')
三、配置 package.json 文件
1. 配置打包命令 lib
"scripts": { "serve": "vue-cli-service serve", "build": "vue-cli-service build", "lint": "vue-cli-service lint", "lib": "vue-cli-service build --target lib --name 168-wangxiao-ui-table -dest lib src/index.js" },
配置打包命令介绍
- --target lib 关键字 指定打包的目录
- --name 打包后的文件名字
- -- dest 打包后的文件夹的名称
2. 配置搜索关键字
"keywords": [ "基于element二次封装表格" ],
3. 配置入口文件(main)
"main": "./dist/168-wangxiao-ui-table.common.js", "module": "./dist/168-wangxiao-ui-table.umd.js",
文件介绍
- 168-wangxiao-ui-table.umd.js 文件
- 打包之后会生成 168-wangxiao-ui-table.umd.js 这个文件,他是封装的组件被打包之后编译的文件
- 168-wangxiao-ui-table.common 文件
- 打包之后会生成 168-wangxiao-ui-table.common 这个文件,他是封装的组件被打包之后的配置文件
4. 输出文件(exports)
"exports": { ".": { "import": "./dist/168-wangxiao-ui-table.umd.js", "require": "./dist/168-wangxiao-ui-table.common.js" } },
5. 上传的文件(files)
"files": ["dist/*"],
注意!
keywords, main, module,exports,files 与 scripts 平级
6. 完整配置
package.age完整代码
{
"name": "168-wangxiao-ui-table",
"version": "0.1.8",
"description": "基于element-ui二次封装",
"author": "spoony-z",
"private": false,
"license": "MIT",
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint",
"lib": "vue-cli-service build --target lib --name 168-wangxiao-ui-table -dest lib src/index.js"
},
"keywords": [
"基于element二次封装表格"
],
"main": "./dist/168-wangxiao-ui-table.common.js",
"module": "./dist/168-wangxiao-ui-table.umd.js",
"exports": {
".": {
"import": "./dist/168-wangxiao-ui-table.umd.js",
"require": "./dist/168-wangxiao-ui-table.common.js"
}
},
"files": ["dist/*"],
"dependencies": {
"core-js": "^3.6.5",
"element-ui": "^2.15.13",
"vue": "^2.6.11"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.5.19",
"@vue/cli-plugin-eslint": "~4.5.19",
"@vue/cli-service": "~4.5.19",
"babel-eslint": "^10.1.0",
"eslint": "^6.7.2",
"eslint-plugin-vue": "^6.2.2",
"vue-template-compiler": "^2.6.11"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/essential",
"eslint:recommended"
],
"parserOptions": {
"parser": "babel-eslint"
},
"rules": {}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
]
}
四、上传到 npm
注册账号
1. 登录npm官网,2. 将封装好的组件打包
# 项目根目录下回生成 dist 文件夹
npm run lib
Banana
Orange
3. 上传到 npm
# 使用命令上传
npm publish
注意!
如果报错为 403 ,出现 You do not have permission to publish "lixiang". 可能是与已有包重名。
五、使用
1. 下载上传到 npm 的包
npm install --save 168-wangxiao-ui-table
2. 在 main.js 中引入
/** 全部引入 */
import wangXiaoUi from '168-wangxiao-ui-table';
Vue.use(wangXiaoUi);
/** 按需引入 */
import { wangXiaoUi } from '168-wangxiao-ui-table';
Vue.use(wangXiaoUi);
3. 组件中使用
<wangxiao-table :data="data" :columns="columns"></wangxiao-table>
六、更新 npm 包
- 修改 package.json 中的版本(version)
- npm publish 重新发布即可
七、常见错误
1. npm publish 发布时报403
更改package.json的name字段
出现You do not have permission to publish "lixiang". 报错原因就可能是与已有包重名。
八、npm 命令
# 查看 npm 当前镜像
npm config get registry
# 更换 npm 当前镜像为 npm 官方镜像
npm config set registry https://registry.npmjs.org
# 更换 npm 当前镜像为npm淘宝镜像
npm config set registry https://registry.npm.taobao.org
# 通过 cnpm 使用
npm install -g cnpm --registry=https://registry.npm.taobao.org
# 登录 npm
npm login
# 发布包 到 npm
npm publish
# 添加用户
npm adduser
# 删除 npm 包
npm unpublish 包名 --force
# 检查包名是否重复
npm view 包名