質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

1回答

1295閲覧

@vue/compatで作成したcomponentライブラリをVue2プロジェクトでPluginとしてVue.useすることは可能でしょうか?

yu-na

総合スコア27

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

0クリップ

投稿2022/09/15 03:07

編集2022/09/15 03:10

質問したいこと

@vue/compat + TypeScriptでVue2の書き方(OptionsAPI)のまま移植したComponentがあります。

ex) Hogeコンポーネント

Hoge.vue

1<template> 2 <div> 3 {{ text }} 4 </div> 5</template> 6 7<script lang="ts"> 8import { defineComponent } from 'vue' 9 10export default defineComponent({ 11 name: 'Hoge', 12 props: { 13 text: { 14 type: String, 15 required: true 16 } 17 } 18}) 19</script>

上記はnpm run build実行時にindex.tsで以下のようにexportしてpluginとして登録しています。

import type { App } from 'vue' import Hoge from '@/components/Hoge.vue' export const MyHoge = Hoge const components = { Hoge } const Plugin = { install(app: App) { Object.entries(components).forEach(([name, component]) => { app.component(`my-${componentName}`, component) }) } } export default Plugin

また、 vue はviteのaliasにより、以下のように@vue/compatである旨を宣言しています。

vite.config.js

1resolve: { 2 alias: { 3 vue: '@vue/compat' 4 } 5 },

npm run build はpackage.jsonのscriptsにより以下のようにvite buildが走ります。

"build": "vite build"

結果、distディレクトリが作成され、my-component.mjs が作成されます。

次に、上記distをVue2 / Nuxt2プロジェクトで使用したいと思い、以下のようなPluginを作成しました。

MyComponent.js

1import Vue from 'vue' 2import MyComponents from 'my-component' 3Vue.use(MyComponents)

※「my-component」はpackage.jsonでinstallする際に付けれたaliasです。

package.json

1"my-component": "git+ssh://git@github.com/hogefugapiyo/my-component.git",

Pluginに登録したので、以下のように使って見ました。

pages/HogePage.vue

1 2<template> 3 <div class> 4 <section> 5 <my-hoge text="hello" /> 6 </section>

上記を実行すると、Hoge,vueはブラウザのVueDevToolでも認識されているようで、propsとして何が渡されているかも認識されていました。
しかし画面には表示されず、Hogeコンポーネントは真っ白のままです。

特にエラーが出るわけでもなく、気になるwarningは以下くらいでした。

WARN [Vue warn]: resolveComponent can only be used in render() or setup().

そもそも「vue/compat or Vue3で作成したコンポーネントをVue2で使う」ことは可能なのでしょうか?

できると思って試してましたが、あと一歩で難儀な感じとなり、皆様の意見・お知恵をお借りしたいなと思いました。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

利用できない可能性が高いです。
「vue2」と全く同じ、形式で記載されている場合は動作すると思いますが、「vue3」になり「emits」等の機能が増え、それが利用されていた場合は、アウトかと思います。
開発(リファクタリング)バージョンよりも低いバージョンでは動作しないと思っていた方が、なにかと問題が起きにくいかと思います。

詳しくは、張り付けたリンクの「破壊的変更」部の「コンポーネント」を参照すると、「vue3」で利用可能で「vue2」で利用不可なものがわかります。

はじめに

投稿2022/09/15 05:08

Matsumon0104

総合スコア1005

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu-na

2022/09/15 06:41 編集

ありがとうございます! >「vue2」と全く同じ、形式で記載されている場合 今回は一応こちらになります。基本的には元々Vue2で作っていたcomponentを丸っと移行し、defineComponentだけ書き換えたという形になります。 中には$listenersを使っている箇所などはv-bind="$attrs"に書き換えたりはしてますが 参考) https://v3.ja.vuejs.org/guide/migration/attrs-includes-class-style.html > 「emits」等の機能が増え 確かにemitなどで警告は出てます Vue2からの丸っと移行でしたが、難しそうですね。。。そろそろ諦めも肝心かもです。 ダメなら、使う側、今回ならNuxtなので、vue3 nuxt bridgeにupgradeすればいけるかもしれないですね。。労力大変そうですが、試してみようと思います!
Matsumon0104

2022/09/15 06:53 編集

移行コストと相談して、移行しても問題ないようであれば、移行した方がよいと思いますね。 もし、メジャーバージョンが突然、4になってvue4に移行しなければならなくなってしまった場合、vue 2 -> 3 -> 4といった移行手順を踏まなければならないので、可能なら移行した方がよいです。 現状の注意点としては、もしvuetifyを利用している場合、近日対応予定ですが、現在はvue3に対応していません。
yu-na

2022/09/16 09:58

どうもVue cmpatで作成したcomponent pluginはVue2のプロジェクトからは使えないようなので、切り口を変えました。 https://antfu.me/posts/make-libraries-working-with-vue-2-and-3 こちらにあるように、vue-demiを使ってcomponent pluginを作成し、Vue2/Vue3対応のpluginを作ってみることにしています。 現在検証中のため、しばらくOPENのままにしておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問