美文网首页
vuejs自定义插件并上传至npmjs官网

vuejs自定义插件并上传至npmjs官网

作者: 南罔 | 来源:发表于2022-02-24 20:27 被阅读0次

    1、初始化项目

    首先,使用vue-cli初始化项目,项目初始化以后目录结构如下:


    初始化以后目录的项目目录结构

    在项目根目录下创建components文件夹(名称自己定义)用于存放插件。

    2、开发插件

    在创建好的用于存放插件的文件夹下新建index.js文件,此文件用于导出全局组件。 此时在插件目录下再次新建文件夹,在此文件夹下新增index.vue和index.js文件。index.vue文件用于组件开发,index.js用于导出组件,后续按需引入。 在此以倒计时countdown插件为例,目录结构如下:


    插件目录结构

    components/countdown/index.vue文件是组件的开发文件,需要注意的是必须声明组件的标签name属性!!!具体代码如下:

    <template>
       <span :style="[style]">  {{sum}}  </span> 
    </template>
    <script>
    export default {
       name: 'countdown',
       props: {
           count: {  type: Number, default: 60  },
           step: {  type: Number,   default: 1 },
           abort: {  type: Number,  default: 0   },
           fontSize: {   type: String, default: '16px'   },
           fontWeight: {  type: String,   default: '600'   },
           color: {  type: String,  default: '#000000'  }
       },
       computed: {
           style() { return {   color: this.color, fontSize: this.fontSize,   fontWeight: this.fontWeight  }  }
       },
       data() {
        return {  
           sum: this.count  
         }
       },
       methods: {
           countDown(options) {
               const config = { 
                  count: options.count ?? 60,  step: options.step ?? 1,  abort: options.abort ?? 0  
               }
               setTimeout(() => { 
                    if (config.count == config.abort) { 
                        this.$emit('count-done', config); 
                     } else {
                       config.count --;  
                       this.sum = config.count;   
                       this.$emit('counting', config)        
                       this.countDown(config)
                     }     
                 }, config.step * 1000)
           },
           start() {    
             const config = {
                count: this.count, 
                 step: this.step,
                 abort: this.abort
             };     
             this.countDown(config)   
           }
       }
    }
    </script>  
    

    components/countdown/index.js,用于导出单个组件,用做按需引入,具体代码如下:

    // 导入组件,组件必须声明 name
    import CountDown from './index.vue'
    //为组件添加install方法
    CountDown.install = Vue => {
    //注册组件
        Vue.component(CountDown.name, CountDown)
    }
    //最后导出组件,用于按需引入
    export default CountDown;
    

    3、组件的全局注册和导出

    编辑components/index.js文件,配置全局注册和导出,这里解释下 require.context(明白的大佬请忽略):
    require.context函数接受三个参数:
    1. directory {String} -读取文件的路径
    2. useSubdirectories {Boolean} -是否遍历文件的子目录
    3. regExp {RegExp} -匹配文件的正则
    require.context函数执行后返回的是一个函数,并且这个函数有3个属性:
    1. resolve {Function} -接受一个参数request,request为test文件夹下面匹配文件的相对路径,返回这个匹配文件相对于整个工程的相对路径
    2.keys {Function} -返回匹配成功模块的名字组成的数组
    3. id {String} -执行环境的id,返回的是一个字符串
    具体注册以及导出源码如下:

    const requireComponent = require.context('./', true, /\.vue$/)    
    //定义全局install方法
    const install = Vue => {
        if (install.installed) return;
        install.installed = true;
        // 遍历并注册全局组件
        requireComponent.keys().map(filename => {
            const module = requireComponent(filename);
            Vue.component(module.default.name, module.default)
        })
    }
    window && window.Vue&&install(window.Vue)
    export default install;
    

    到此,插件开发、注册和导出基本已经完成,接下来测试一下。

    4、测试插件

    两种方式导入插件,第一种是在main.js里面全局导入,调用Vue.use方法全局注册,第二种是在组件中按需导入。这里采用第二种方式,截图如下:



    启动项目,看看运行结果是否能计时,结果如下:


    计时效果

    5、打包插件

    打包插件需要以下四个参数:
    target: 默认为构建应用,改为lib启用构建库模式
    name: 输出文件名
    dest: 输出目录,改为** lib**
    entry: 入口文件路径,改为components/index.js
    在package.json添加命令


    执行yarn lib或者npm run lib命令,开始编译插件。

    6、发布到npm官网

    如果你还没有注册账号,则需要前往npmjs官网注册,注册完成以后修改package.json编辑插件信息,如下:


    注意private必须为false,main入口文件,即你编译的文件路径,其他的按照自己的信息填写。
    在项目根目录下执行npm publish发布到npmjs官网。
    至此,搞定!!!如有什么地方有纰漏的请指正。

    相关文章

      网友评论

          本文标题:vuejs自定义插件并上传至npmjs官网

          本文链接:https://www.haomeiwen.com/subject/qrkfrrtx.html