npmに公開するvueコンポーネントライブラリを実装する

著者:マイル

新たなプロジェクト

vueプロジェクトを初期化する

src、index.jsファイルの下にプラグインフォルダを作成します。このファイルはコンポーネントのエクスポートファイルです。

npm install @/vue-cli -g

npm create vue-components

cd vue-components

npm run serve

コンポーネントライブラリを作成する

srcの下に新しいプラグインフォルダを作成します

次に、トーストコンポーネント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/index.vueを作成します

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

2つのコンポーネントは非常に単純なコンポーネントです。コンポーネントの内容についてはここでは詳しく説明しません。以下のvueのエントリファイルmain.jsのように、この効果を実現したいと考えています。プラグインをインポートするだけで、Vue.use()はトーストコンポーネントとボタンコンポーネントをグローバルに使用できます。

したがって、これら2つのコンポーネントはグローバルに登録する必要があり、登録プロセスは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')

上記の効果を実現するには、プラグインでindex.jsファイルを作成する必要があります。このファイルはオブジェクトを公開する必要があり、オブジェクトにはインストールメソッドがあります。

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コンポーネント。

コンポーネントが正常に表示されていることがわかります。どこでも使用できます。

プラグインに多くのコンポーネントがある場合は、インポートしたコードをたくさん記述してから、それらを1つずつ登録する必要があります。これを書くのは簡単です。

ここでは、requireAPIを使用して導入を自動化できます。

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
};

このように見ると、自分が何をしているのかわからない場合があります。次の2つの値を見ると、上記のコードが何をしているのかがわかります。

requireComponent.keys()はたまたまファイルへのパスです

 console.log(requireComponent.keys())

1648377110722.jpg

requireComponent(path)の戻り値には、コンポーネントのインスタンス情報のみが含まれます

console.log(config)

1648377175654.jpg

パッケージの展開

次に、プロジェクトをパッケージ化してリリースします。

package.jsonファイルスクリプトを調整します

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

npm run lib

プロダクションパッケージディレクトリ

1648377365518.jpg

package.jsonファイルのこれらのプロパティは不可欠です

1648377414690.jpg

npmにログインします

npm公開

使用する

npm i vue-toast-maile

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

プロジェクトで使用できます。

{{o.name}}
{{m.name}}

おすすめ

転載: my.oschina.net/u/3620858/blog/5504575