窓を作っては壊していた人のブログ

この謎のブログタイトルの由来を知るものはもういないだろう

Blazor ComponentsをVue.jsから使うためのコードのGeneratorを作った

Qiitaで過去に公開した

qiita.com

この記事では、AngularとReactからBlazor Componentsを使うためのコード生成のサンプルを紹介した。

まとめのところで書いたようにオレオレテンプレートを作り上げることで、Reactのコード生成を拡張出来ることの例をあげたが、同様にテンプレートを書き換えることでVue.js向けのGeneratorも作ることが出来たので紹介する。

github.com

Blazor側で使用するアノテーションや、C#JavaScriptの型の対応付のような共通処理に関しては前述した記事に記載してあるので省略し、ここではVue.js依存の処理の紹介をする。

https://github.com/yamachu/aspnet-samples/commit/e2f216267fa6201071a426e016cded16ef93a4be#diff-060eba5642108539fcc4d415774c915df08792683a2903a397ec3ed23c6183d8

もともとのComponentsの生成コードを追ったことがわかる人に取っては一目瞭然だが、なんてことのないReact向けのコードをVue.js向けに移植しただけである。 Vue.jsの3からReactのCustom Hooksみたいな処理が書けるComposition APIが導入されたので、その微妙な差異を吸収するだけでVue.js向けのコードが移植できる。

Vue.jsの3.2(?)から導入された<script setup> SFCと組み合わせることによってよりComponentのPropsも記述しやすくなり、またReactで使用していたコード生成のものに似せやすくなっている。

実際に使う側は

<script setup lang='ts'>
import { getCurrentInstance } from 'vue';
import { useBlazor } from './blazor-vue';
interface Props {
  title: string;
  incrementAmount: number | undefined;
  customObject: object;
  customCallback: (_: object) => void;
}
const props = defineProps<Props>();
const instance = getCurrentInstance();
const Counter = useBlazor(instance, 'counter', props)
</script>

<template>
    <Counter />
</template>

これだけで済む。


と、またBlazorの依存から逃げることの出来ていない内容を紹介したが

runtime/src/mono/sample/wasm/browser-es6 at main · dotnet/runtime · GitHub

こんな感じでBlazor非依存でC# のコードを実行するサンプルも紹介されている。 実際に試してコードを追って見たところ、main関数やstatic methodは実行できるが、class methodはまだ駄目そう(?)な様に見えるので引続きwatchしていこう。

メモ: 関連PR

[draft][wasm] JSImport/JSExport prototype by pavelsavara · Pull Request #64493 · dotnet/runtime · GitHub

.NET InteractiveがC# のREPLとして便利だった

ちょっとしたC# のコードを一部変えてメンバを確かめたいとか言う時、以前はXamarin Workbooks (https://teitoku-window.hatenablog.com/entry/2017/11/16/205737 で前紹介したやつ) を使ってC# のコード片を実行していた。 最近は.NET 6 で Main メソッドを作らなくてもスクリプト的に実行できる top-level statements がサポートされ、雑にコードを書いて試すのも少しは楽になった感じはあるが、Jupyter Notebookで味わえるような、ほんと一部だけを変えて実行する、みたいのは叶わなかった。

ということでまたXamarin Workboosに戻ろうかと思ったら、既に更新は止まっていて、では Try.NET か?と思ったけど、何か違う…

GitHub - dotnet/try: Try .NET provides developers and content authors with tools to create interactive experiences.

そんな中探し求めている物に出会えた。

そう、.NET Interactive である。

詳しくはリポジトリのgifを見て欲しいのだけれども、要はいい感じにipynb上にC# のコードを書いていい感じにJupyterの良いところを使えるツールみたいに捉えてもらっていいだろう。 VSCodeはJupyterサポートをしているが、もちろん.NET InteractiveもExtensionを導入すると使うことが可能である。

marketplace.visualstudio.com

f:id:yamachu_co:20211208024044p:plain

こんな感じで.NET 6な環境で良い感じにスクリプトの一部を書き換えてメンバなどを確かめることが出来ている。 技術検証に非常に便利なので使ってみて欲しい。