Vue/Nuxt→React/Nextの共通点,差異,そして世界でのトレンド

教育関連のAIシステムをドイツで研究しているのですが、データ収集のためにインターフェースを作る必要が出てきました。そのために、React/Nextをやる必要が出てきたため、Vue/Nuxtの知識を再利用することを試みます。


# 日本と欧州でのトレンドが微妙に違う!



今ヨーロッパに留学しているのですが、ドイツではNuxtよりNextの方が圧倒的に優勢だそうです。一方、日本では、Nuxtの方もまだ耐えていると聞きます。

そのことを、Googleトレンドから定量的に見てみましょう：


東京とベルリンでの"Next.js", "Nuxt.js"の２キーワードの割合比較です。（１年間）

## ドイツでは「Nextしか勝たん？」状態


![スクリーンショット 2022-04-22 16.21.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614389/cbea3a9d-a0d0-c016-bd71-b888d26406c7.png)

## 日本でもNextが人気だが、Nuxtも頑張っている
![スクリーンショット 2022-04-22 16.18.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614389/bea249d4-f31e-d853-107b-3687f9cca499.png)

## 参考：　全世界レベルでNextが流行っている？
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614389/876cc991-60a1-0d98-acb7-56fbef835652.png">

あまりトレンドを追ってなかった自分ですが、こんな状態になっていたのですね。。。

**Nuxt/Vueを勉強した自分からすると「ぴえん」なわけですが、乗るしかない、このビッグウェーブに。**


# Nuxt→Nextへ「転移学習」する
https://nextjs.org/docs/api-reference/create-next-app

`next-create-app`で作ったプロジェクトは、`nuxt-create-app`で作ったプロジェクトと、フォルダの構成と各ファイルの中身の構成の点でも、類似性があるように思えます。ですので、from scratchからNext/Reactを学ぶのではなく、Nuxt/Vueの知識を活かそうと考えました。細かいところは、後で僕の脳内でファインチューンしたらいいので、共通点と差異をなんとなく把握するのがゴールです。

# 大まかな違いに着目

## 観察: Nextプロジェクトにあるファイルやフォルダ

いくつか気になったことだけ述べると：

- `next.config.js`
    - これはNuxtの`nuxt.config.js`に対応するようです。

- `pages/index.js`
    - ページやコンポーネントを構成するファイルがNuxtでは`.vue`であったのに対し、Nextでは`.js`（typescriptを使わない場合）になるという違いがあるようです。

- `pages/_app.js`
    - Nuxtで存在したスラグがNextでも使えるようです。このファイルを除いたところ、具体的にどのようにパラメタを渡すのかは理解してませんが、個人的にスラグは使わないのでこの程度の理解にとどめておきます。

- `pages/contents/`
    - このフォルダ、`nuxt/content`とか使ったことある場合はわかりやすいですね。つまり、 `nuxt/content`と同様に静的なWebページ等を作りたい場合は、Nextでも`content`に`.json`などのファイル格納して、スラグをいじればいいので、感覚的にはほとんど同じですね。ありがとうございます😂


## 観察: .jsファイルの構成要素


Vue/Nuxtでは`<template></template>`の中にマークアップをかき、`<script></script>`の中にVue独自のオブジェクトと`data`, `computed`, `methods`などの関数やプロパティを記述します。一方で、Nextでは、それらは`.js`ファイルの中の関数に対応します。そのファイルの、ある関数の定義の中で、ローカル変数としてNuxtで言うところの`data`で定義されいたような変数がNextでは記述されます。

さて、各`.js`ファイルの中を観察すると、関数ではテンプレート的なものを返しています。これが、Nuxtでの`<template>`に対応するものなのでしょう。これはJSXというものだそうです。


```js
return (<Sushi fish="tuna">Clickable Sushi<Sushi/>)
```

https://ja.reactjs.org/docs/jsx-in-depth.html

JSXは例えば、以下のように変換されるとのことです。

```
React.createElement(
  Sushi,
  {fish: 'tuna'},
  'Clickable Sushi'
)
```

なんか見たことがある気がしましたが、DOMの`document.createElement`と似ていますね。
VanillaJS(古き良きJavaScript)の知識を再利用できるように設計していただいてありがとうございます。

```:document.createElementの形
document.createElement('ul', { is : 'expanding-list' })
```

https://developer.mozilla.org/en-US/docs/Web/API/Document/createElement

# React独自の概念らしきものに着目

`.js`ファイル内で`react`から`import`されているものの中で気になったのが、`useState`, `useEffect`の二つです。

## 観察: useState


```:なんかよく見るやつ
const [ sushiState, setSushiState ] = useState(‘fresh’)
```

`=`の左の`[sushiState, setSushiState]`はDestructuring assignmentだそうです。似たような機能はPythonにもありましたね。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

`[]`内の左の変数`sushiState`が何らかの状態を表す値を格納する変数で、右の`setSushiState`というセッターのような関数で、状態値を書き換えれるようです。また、`useState()`のargは初期値のようです。

例えば、sushiStateを変更したいときはこんな感じなのでしょう：

```:古びた寿司の状態を変更する
setSushiState('expired')
```

また、状態に応じて分岐をしたいときは、こんな感じでしょう：

```:寿司が食べれるかどうか分岐したいとき

if ( sushiState === ‘expired’ ){
   console.log('Sorry, this sushi is already dangerous to eat.')
   console.log('Please consider buying new one at Netto.')
}

```

変数の状態を変更する作業が、Nuxt/Vueとはやや違う気がしますね。
個人的には、値の更新にsetterを作ることができて、好きな名前をつけれるのが、処理がわかりやすくていいですね。

https://reactjs.org/docs/hooks-reference.html#usestate

## 観察: useEffect
これもコードで見かけたのですが、おそらくレンダリングとは切り離したい処理を記述するのに使っていると思います。
イベントの登録等は適切に扱わないと、何度も何度もレンダリングごとに実行されてしまうので、そのためにイベント関連処理を`useEffect`で用いているようです。

Nuxt/Vueでは直接`addEventListener`を扱うことがなかったのですが、Next/Reactのコード見ている限りでは、VanilaJSのようなイベントを扱うことがありそうです。Nuxt/Vueでは、この手のことは考えることがなかったので、個人的には`useEffect`のユースケースについて、今度もう少し調べてみようと思います。

https://tyotto-good.com/blog/basic-useeffect


# 所感

- フォルダとファイル構成等は基本的に似ている。
- Next/Reactの方が、Nuxt/VueよりもVanillaJSに近い。
- JSXという概念や、stateに関する処理が、Nuxt/Vueとは異なり、注目する必要があるかもしれない。
- useEffectなどに関して、Nuxt/Vueよりもレンダリングのタイミングについて注意しないといけないのかもしれない。
    - Nuxt/Vueで考えることがなかったのは、次のどちらなんだろう？またわかったら記事書こうと思います。
      - (i)Nuxt/Vueが複雑なことをやってくれていた? or (ii)自分が浅い部分しか触ってなかった?

# あなたの思う違いはなんですか？ぜひコメントへ！

記事を書くことで、記憶に定着するのが目的ではありますが、皆さんからのアドバイス等もいただけたら幸いです。
あなたの思う、Nuxt/Vue, Next/Reactの違いは？つまりやすいところはなんでしたか？
ぜひコメントでお教えください！（学ばさせていただきます）

そして、ぜひとも各フレームワークについての愛を語ってください！