在vue项目开发中,我们会将经常用到的逻辑或模块抽象成组件,对于那些多个项目都有用到的组件,可以考虑封装成组件库,发布到npm。每次要到只需要npm install xx
一下,就不用来回拷贝了。下面我们就从0开始来打包一个vue组件库。
使用vue组件库的常见方式
- 1、通过
script
标签引入
<body>
<div id="app">
<hello></hello>
</div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <!--在组件库之前引入vue-->
<script src="../dist/my-lib.js"></script>
<script>
new Vue({
el: '#app'
})
</script>
- 2、通过
import
引入
import Vue from "vue"
import App from "./App.vue"
import MyLib from "my-lib"
Vue.use(MyLib)
new Vue({
name: "root",
el: '#root',
render: h => h(App)
})
这样引入后,在需要使用组件库的项目组件中,直接使用,比如:
<template>
<div id="app">
<hello></hello>
</div>
</template>
组件在使用之前都需要注册组件,注册组件可以局部注册和全局注册,从上面组件库的使用,我们可以看出,组件库的组件都是全局注册的。
在第一种通过script
标签引入的方式中,我们在组件库内部完成了全局注册,所以引入组件库就可以直接使用。
在第二种通过import
引入的方式中,我们通过Vue.use(MyLib)
完成组件的全局注册。
组件库的项目结构如下,在src/index.js
中定义install方法
。
// src/index.js
import Hello from "./components/Hello.vue"
function install(Vue){ //外部的Vue.use(MyLib)会执行该方法,完成组件的全局注册。
Vue.component(Hello.name, Hello)
}
if(window && window.Vue) { //通过`script`标签引入的情况,在组件内部完成组件注册。
Vue.use(install)
}
export default install
webpack打包
webpack的基础使用: webpack由浅入深系列(一) 、webpack由浅入深系列(二)
现在我们的组件库就一个hello组件
,我们将通过webpack,将它打包成可以通过上述两种方式使用的组件库。
webpack打包vue组件库,跟打包普通的vue项目的配置绝大部分是一样的。只是output
有所不同,如下所示,增加了libraryTarget
等。
//webpack.config.js
const path = require('path')
const { VueLoaderPlugin } = require('vue-loader')
module.exports = {
mode: 'none',
entry: './src/index.js',
output: {
path: path.join(__dirname,"/dist"),
filename: 'my-li