CDNでjQueryを利用して、HTMLでちょっとした処理をするのは、とても便利です。
ですが、今さらjQueryって……というのもあるので、ReactやVueでも、ちょろっとできないかな? と思い、トライしてみました。
サンプルなので、簡単なJSONレコードをループで表示しているだけですが、jQuery、React、Vueで、それぞれ同じ挙動ができました。
jQuery
まずは、ベースとなるjQuery版です。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JQuery</title>
</head>
<body>
<!-- JSファイル読み込み -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<!-- スクリプト -->
<script>
// JSONレコード作成
const recs = [
{id: 1, value: "Test1"},
{id: 2, value: "Test2"},
{id: 3, value: "Test3"},
{id: 4, value: "Test4"},
{id: 5, value: "Test5"},
];
// 変数の宣言
let reactMessage = "";
let reactRecs = [];
// マウント時
$(function(){
// 変数の初期化
initReactVariables();
// 変数の表示
dispReactVariables();
})
// 変数の初期値を設定
const initReactVariables = () => {
// メッセージ設定
reactMessage = "Test CDN JQuery";
// JSONレコード設定
reactRecs = recs;
}
// DOM作成と表示
const dispReactVariables = () => {
// メッセージ作成
const divMessage = $("<div></div>");
divMessage.text(reactMessage);
// JSONレコード作成
const divRecs = $("<div></div>");
// レコード数分ループ
reactRecs.forEach(it => {
// DOM作成
const pRow = $("<p style='margin: 0'></p>");
const spanId = $(`<span>ID: ${it.id}</span>`);
const spanValue = $(`<span style='margin-left: 10px;'>Value: ${it.value}</span>`);
pRow.append(spanId, spanValue);
divRecs.append(pRow);
})
// Appに追加
const divApp = $("#app");
divApp.append(divMessage);
divApp.append(divRecs);
}
</script>
<!-- HTML -->
<div id="app"></div>
</body>
</html>
これ実行すると、下記が表示されます。

React
次はReact版です。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>React</title>
</head>
<body>
<!-- JSファイル読み込み -->
<script crossorigin src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<!-- スクリプト -->
<script type="text/babel">
// JSONレコード作成
const recs = [
{id: 1, value: "Test1"},
{id: 2, value: "Test2"},
{id: 3, value: "Test3"},
{id: 4, value: "Test4"},
{id: 5, value: "Test5"},
];
// モジュール取得
const { useEffect, useState } = React;
// Reactインスタンス作成
const App = () => {
// リアクティブ変数の宣言
const [ reactMessage, setreactMessage ] = useState("");
const [ reactRecs, setreactRecs ] = useState([]);
// ライフサイクルフック(マウント)
useEffect(() => {
// リアクティブ変数の初期化
initReactVariables();
}, [])
// リアクティブ変数の初期値を設定
const initReactVariables = () => {
// メッセージ設定
setreactMessage("Test CDN React");
// JSONレコード設定
setreactRecs([...recs]);
}
// 戻り値の設定(JSX)
return(
<>
<div>{reactMessage}</div>
<div>
{ reactRecs.map(it => {
return(
<p style={{ margin: 0 }}>
<span>ID: { it.id }</span>
<span style={{ marginLeft: '10px' }}>Value: { it.value }</span>
</p>
)
}) }
</div>
</>
);
}
// Appに追加
const app = document.querySelector("#app");
ReactDOM.render(<App />, app);
</script>
<!-- HTML -->
<div id="app"></div>
</body>
</html>
これを実行すると、下記が表示されます。jQuery版と同じですねw

Vue
最後はVue版です。こちらは、Vue3のCompositionAPIです。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vue</title>
</head>
<body>
<!-- JSファイル読み込み -->
<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<!-- スクリプト -->
<script type="module">
// JSONレコード作成
const recs = [
{id: 1, value: "Test1"},
{id: 2, value: "Test2"},
{id: 3, value: "Test3"},
{id: 4, value: "Test4"},
{id: 5, value: "Test5"},
];
// モジュール取得
const { createApp, ref, reactive, onMounted } = Vue;
// Vueインスタンス作成
const App = createApp({
setup() {
// リアクティブ変数の宣言
const reactMessage = ref("");
const reactRecs = reactive([]);
// ライフサイクルフック(マウント時)
onMounted(() => {
// リアクティブ変数の初期化
initReactVariables();
})
// リアクティブ変数の初期値を設定
const initReactVariables = () => {
// メッセージ設定
reactMessage.value = "Test CDN Vue3 with Composition API";
// JSONレコード設定
reactRecs.push(...recs);
}
// 戻り値の設定
return {
reactMessage,
reactRecs,
};
},
});
// Appに追加
App.mount("#app");
</script>
<!-- HTML -->
<div id="app">
<div>{{ reactMessage }}</div>
<div>
<p style="margin: 0" v-for="it in reactRecs" :key="it.id">
<span>ID: {{ it.id }}</span>
<span style="margin-left: 10px;">Value: {{ it.value }}</span>
</p>
</div>
</div>
</body>
</html>
これを実行すると、下記が表示されます。見た目は変わらないですねw

この程度ですと、どれを使ってもコード量は、それほど変わりません。
であれば、jQueryでも全然良いのかもしれませんw
ただし、jQueryだと、動的なDOM作成がちょっと面倒な部分があり……
Reactは、useStateとJSXが、微妙に気持ち悪いんだよな……
そして、Vueは、refとreactiveが、少し分かりずらいし……
と、それぞれの愚痴をこぼしつつ、まあ、できたから良いかな? という感じです。
たぶん、慣れなんだと思います……
というわけで、一応githubにも公開しておきましたので、興味があれば覗いてみてください。