Bagaimanakah saya boleh mencipta perpustakaan yang mendedahkan satu komponen Vue yang boleh digunakan oleh fail .mjs yang diedarkan?
<p>Saya mahu mencipta komponen Vue yang digabungkan ke dalam satu fail .mjs. Projek Vue lain boleh mendapatkan fail .mjs ini melalui HTTP dan menggunakan komponen tersebut. Memasang komponen boleh pasang melalui npm tidak mungkin kerana aplikasi lain akan cuba mendapatkannya berdasarkan konfigurasi semasa masa jalan.</p>
<p>Perkara yang perlu dipertimbangkan dengan komponen boleh pasang</p>
<ul>
<li>Mungkin menggunakan subkomponen daripada rangka kerja/pustaka UI lain</li>
<li>Boleh menggunakan CSS tersuai</li>
<li>Mungkin bergantung pada fail lain, seperti imej</li>
</ul>
<hr />
<p><strong>Salin Perpustakaan</strong></p>
<p>Saya mencipta projek Vuetify baharu melalui <code>npm create vuetify</code></p>
<p>Saya memadamkan semua dalam folder src kecuali vite-env.d.ts dan mencipta komponen Renderer.vue</p>
<pre class="brush:php;toolbar:false;"><script setup lang="ts">
import { VContainer } daripada "vuetify/components"
defineProps<{ nilai: tidak diketahui }>()
</skrip>
<template>
<v-bekas>
<span class="red-text">Nilai ialah: {{ JSON.stringify(value, null, 2) }}</span>
</v-bekas>
</template>
<gaya>
.red-text { color: red }
</style></pre>
<p>dan fail index.ts</p>
<pre class="brush:php;toolbar:false;">import Renderer daripada "./Renderer.vue";
eksport { Renderer };</pre>
<p>Saya menambah mod perpustakaan dalam vite.config.ts</p>
<pre class="brush:php;toolbar:false;">bina: {
lib: {
entri: selesaikan(__dirname, "./src/index.ts"),
nama: "Penyampai",
Nama fail: "penyampai",
},
rollupOptions: {
luaran: ["vue"],
pengeluaran: {
global: {
vue: "Vue",
},
},
},
},</pre>
<p>dan memanjangkan fail package.json</p>
<pre class="brush:php;toolbar:false;">"fail": ["dist"],
"utama": "./dist/renderer.umd.cjs",
"modul": "./dist/renderer.js",
"eksport": {
".": {
"import": "./dist/renderer.js",
"memerlukan": "./dist/renderer.umd.cjs"
}
},</pre>
<p>Memandangkan saya menggunakan CSS tersuai, Vite menghasilkan fail styles.css, tetapi saya perlu menyuntik gaya ke dalam fail .mjs. Berdasarkan soalan ini, saya menggunakan plugin vite-plugin-css-injected-by-js.</p>
<p>Apabila membina, saya mendapat fail .mjs yang diperlukan yang mengandungi CSS tersuai</p>
<hr />
<p><strong>Menggunakan komponen</strong></p>
<p>Saya mencipta projek Vue baharu melalui <code>npm create vue</code></p>
<p>Untuk tujuan ujian, saya menyalin fail .mjs yang dijana terus ke dalam direktori src projek baharu dan menukar fail App.vue kepada </p>
<pre class="brush:php;toolbar:false;"><script setup lang="ts">
import { onMounted, type Ref, ref } dari "vue";
const ComponentToConsume: Ref = ref(null);
onMounted(async () => {
cuba {
const { Renderer } = tunggu import("./renderer.mjs"); // ambil komponen semasa masa jalan
ComponentToConsume.value = Renderer;
} tangkap (e) {
console.log(e);
} akhirnya {
console.log("selesai...");
}
});
</skrip>
<template>
<div>Komponen yang diimport di bawah:</div>
<div v-if="ComponentToConsume === null">"masih dimuatkan..."</div>
<komponen-untuk-dimakan v-else :value="123"
</template></pre>
<p>Malangnya, saya mendapat amaran dan ralat berikut</p>
<blockquote>
<p>[Vue warn]: Vue menerima komponen yang telah menjadi objek reaktif. Ini boleh menyebabkan prestasi yang tidak diperlukan dan harus dielakkan dengan menandakan komponen dengan <code>markRaw</code> atau menggunakan <code>shallowRef</code> dan bukannya <code>ref</code>. </p>
</blockquote>
<blockquote>
<p>[Vue warn]: Suntikan 'Symbol(vuetify:defaults)' tidak ditemui. </p>
</blockquote>
<blockquote>
<p>[Vue warn]: Ralat tidak terurus berlaku semasa pelaksanaan fungsi persediaan</p>
</blockquote>
<blockquote>
<p>[Vue warn]: Ralat tidak terurus berlaku semasa melaksanakan muat semula penjadual. </p>
</blockquote>
<blockquote>
<p>Tidak ditangkap (dalam janji) Ralat: [Vuetify] Contoh lalai tidak ditemui</p>
</blockquote>
<p>Adakah sesiapa tahu apa yang saya hilang atau bagaimana untuk membetulkannya? </p>