LoginSignup
14
13

More than 3 years have passed since last update.

Vue2系のプロダクトをVue3へアップデート

Last updated at Posted at 2020-07-18

vue-js.jpg

前書き

Vue 3のbeta版がリリースされてしばらく経ったし、
丁度手元にVue 3へアップデートしたいプロジェクトがありますので、手順を記録します。

アップデートしたいプロジェクトを軽く紹介

キャプチャ1.PNGキャプチャ.PNG

バージョン
vue 2.6.11
typescript 3.7.5

剣盾ランクバトルにハマった頃作りかけたものです。

Vue Cliの更新

古いVueCliが入ってる場合、先ずは削除します。

$ npm uninstall vue-cli -g

最新のvue-cliをインストール。

$ npm install @vue/cli -g

インストール後のバージョンを確認します。

$ vue -V
@vue/cli 4.4.6

Vueプロジェクトのアップデート

非常に簡単です、下記のコマンドを実行します。

$ cd [プロジェクトのpath]
$ vue add vue-next

実行後、既存の依存パッケージは更新される、また一部の文法も修正されました。

アップデート完了後、package.jsonの中身を見てみます。

package.json
  "dependencies": {
    ...
    "vue": "^3.0.0-beta.1",
    "vue-router": "^4.0.0-alpha.6",
    "vuex": "^4.0.0-alpha.1"
  },

vuevue-routervuexが更新されたようです。

プロジェクトを実行します。

$ cd [プロジェクトのpath]
$ npm run serve

ブラウザを開いてhttp://localhost:8080/loginにアクセスすると、画面が真っ白です、
コンソールに以下のエラーが表示されてます。
キャプチャ.PNG

調べたら、Vue2系で使用していた関数がいくつか廃止されて、また、型の定義を漏れていたので、直していきます。

shims-vue.d.ts

先ずはタイプの宣言ファイルから修正してきます。
修正前。

shims-vue.d.ts

declare module '*.vue' {
  import Vue from 'vue'
  export default Vue
}

修正後。

shims-vue.d.ts

declare module '*.vue' {
    import { ComponentOptions } from 'vue'
    const component: ComponentOptions;
    export default component
}

.vueのscriptブロック

Vue2系では以下のように書きます。

<script lang="ts">
import { Component, Vue, Provide } from "vue-property-decorator";
import NavFooter from "@/components/NavFooter.vue";
import LoginFormSlot from "@/components/LoginFormSlot.vue";

@Component({
    components: {
      NavFooter,
      LoginFormSlot 
    }
})
export default class Login extends Vue{
   constructor() {
       super();
   }
    @Provide() password:string = '';
    @Provide() email:string = '';
    @Provide() showForm:boolean = true;
    formChange(e:any) {
        let type:string = e.toElement.innerText;
        if (type == '新規登録'){
            this.showForm = false
        } else {
            this.showForm = true
        }
    }
}]
</script>

Vue3の記述方に直すと下記のようになります。

<script lang="ts">
import NavFooter from "@/components/NavFooter.vue";
import LoginFormSlot from "@/components/LoginFormSlot.vue";
import { defineComponent } from "vue"

const Login = defineComponent({
    setup(){
     let showForm = true;
     const formDate = {
       email: "",
       password: "",
     };
     const formChange = (e:any)=>{
        let type:string = e.toElement.innerText;
        if (type == '新規登録'){
            showForm = false
        } else {
            showForm = true
        }
     };
     components: {
       NavFooter,
       LoginFormSlot
     }
     return {
       showForm,
       formChange
     }
    },
});
export default Login
</script>

template

Vue2系では以下のような記述も廃止されました。

<template>
 <div>
    ...
    {{this.xxx}}
    ...
 </div>
</template>

修正後。

<template>
 <div>
    ...
    {{xxx}}
    ...
 </div>
</template>

再度ページを読み込みします。
キャプチャ.PNG
表示はうまくいきました、コンソールにエラーもありません。

14
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
13