一个vue组件库发布到npm的完整实现过程

2022-10-14

工作的时候总是使用别人的npm包,然而我有时心底会好奇自己如何发布一个npm包呢,什么时候自己的包能够被很多人喜欢并使用呢,下面这篇文章主要给大家介绍了关于一个vue组件库发布到npm的相关资料,需要的朋友可以参考下

目录
  • 新建项目
    • 创建组件库
  • 打包部署
    • 使用
      • 总结

        新建项目

        初始化一个vue项目

        src下面创建一个plugins文件夹,index.js文件,这个文件是组件的出口文件。

        npm install @/vue-cli -g
        npm create vue-components
        cd vue-components
        npm run serve

        创建组件库

        src下新建一个plugins文件夹

        然后创建toast组件toast/index.vue

        这里为了能够展示模版,div标签后面的>去掉了。

        <template>
          <div class="hello"
            <div class="toast" :class="{active: toastStatus}"
                <div class="toast-wrapper"{{text}}</div
            </div
          </div
        </template>
         
        <script>
        export default {
          name: 'vue-toast',
          data() {
            return {
              toastStatus: false,
              text:''
            }
          },
          methods: {
            handlerToast(toastInfo,time) {
              this.text = toastInfo;
              this.toastStatus = true;
              time = time || 2000
              setTimeout(() => {
                this.toastStatus = false;
              }, time)
            }
          },
        }
        </script>
         
        <!-- Add "scoped" attribute to limit CSS to this component only -->
        <style scoped >
            .toast {
                position: absolute;
                left: 50%;
                top: 30%;
                transform: translate(-50%, 50%);
                min-width: 0px;
                min-height: 0;
                table-layout: center;
                background: rgba(0,0,0,0.5);
                display: none
         
            }
            .active {
                display: block
            }
         
        </style>

        再创建一个button组件button/index.vue

        <template>
          <div class="hello"
            <button这里是button组件</button
          </div
        </template>
         
        <script>
        export default {
          name: 'vue-button',
          props: {
            msg: String
          },
          data() {
            return {
          
            }
          },
          methods: {
          },
        }
        </script>

        两个组件都是很简单的组件,这里对于组件的内容不做详细解释,我们要达到这样的效果,如下面的vue的入口文件main.js。只需要引入plugins,然后Vue.use()一下就可以在全局使用toast组件和button组件。

        所以这两个组件一定是全局注册的,注册的过程就在Vue.use()调用的过程中。

        import Vue from 'vue'
        import App from './App.vue'
        import router from './router'
        import store from './store'
        import './registerServiceWorker'
        import plugins from './plugins'
         
        Vue.config.productionTip = false
        Vue.mixin({
          mounted() {
            console.log('组件加载完成')
          }
        })
        Vue.use(plugins)
         
        new Vue({
          router,
          store,
          render: h => h(App)
        }).$mount('#app')

        如果要实现上面效果,就需要在plugins中创建一个index.js文件,这个文件需要暴露一个对象,对象中有install方法。

        import Toast from './toast'
        import Button from './button'
        const install = (Vue) => {
            console.log(Vue, Toast, Button)
        }
        export default {
            install
        };

        在这个方法中,接收到一个参数是Vue,我们就可以在这个方法中把所有需要的组件注册好。

        import Toast from './toast'
        import Button from './button'
        const install = (Vue) => {
            console.log(Vue, Toast, Button);
            Vue.component(Toast.name, Toast);
            Vue.component(Button.name, Toast);
        }
        export default {
            install
        };

        这样就可以在在任何一个组件中使用你写好的组件了。

        来试一下, 把 HelloWorld组件替换为vue-button。

        可以看到组件已经可以正常展示了。并且可以在任意的地方使用。

        如果plugins里面组件比较多,就需要写很多引入的代码,然后再一个一个的去注册,写起来有是一件无脑化的事情。

        这里可以借用require这个api做到自动化引入。

        plugins/index.js

        const requireComponent = require.context('./', true, /\.vue$/);
        console.log(requireComponent.keys())
        const install = (Vue) => {
            if(install.installed) return;
            install.installed = true;
            requireComponent.keys().map(path => {
                const config = requireComponent(path);
                console.log(config)
                const componnetName = config.default.name;
                Vue.component(componnetName, config.default || config)
            })
        }
         
        export default {
            install
        };

        就这么看可能不知道在做什么,来看下下面两个值,你就能明白上面代码在做什么了。

        requireComponent.keys()刚好是文件的路径

        console.log(requireComponent.keys())

        requireComponent(path)的返回值,正好包含了组件的实例信息

        console.log(config)

        打包部署

        接下来对项目打包发布。

        调整package.json文件 scripts

        "lib": "vue-cli-service build --target lib --name vue-toast --dest lib src/plugins/index.js"

        npm run lib

        生产打包目录

        package.json文件这几个属性不可缺少

        登陆npm

        npm publish发布

        使用

        npm i vue-toast-maile

        import plugins from 'vue-toast-maile'
        import "../node_modules/vue-toast-maile/lib/vue-toast.css"
        Vue.use(plugins)

        就可以在项目中使用了。

        总结

        到此这篇关于一个vue组件库发布到npm的文章就介绍到这了,更多相关vue组件库发布npm内容请搜索北冥有鱼以前的文章或继续浏览下面的相关文章希望大家以后多多支持北冥有鱼!

        您可能感兴趣的文章:

        • Vue cli3 库模式搭建组件库并发布到 npm的流程
        • Vue组件库发布到npm详解

        《一个vue组件库发布到npm的完整实现过程.doc》

        下载本文的Word格式文档,以方便收藏与打印。