SlideShare a Scribd company logo
C#勉強会 2018/10
山本礼貴

 入門編
 Blazor基礎知識
 開発環境を作ろう
 プロジェクトを作ろう
 メリットとデメリット
 実践編
 最近書いたコード
 世間の取り組み
 まとめ(妄想含む)
アジェンダ

入門編

Blazor基礎知識
なんで使ってみたいと思ったか

 名称由来:Browser + Razor = Blazor
 なんでLなのかは不明
 Razor構文 は html の中にC#の式/構文を書くことができる
ASP.NET(Core)のhtmlのサーバーサイドの拡張
(拡張子: cshtml ← C# + html)
 vbhtmlでVBも書けます
 旧いASP.NETのぐちゃぐちゃな構文よりは好まれている(私見)
 <% ... %> でタグ内にC#書くよりは、 @ 1文字の方が良いよね
Blazorって何?

 × C#のコンパイラー
 × C#→JavaScriptへのトランスレーター
 ○ ブラウザー(Web Assembly)上で動くNET CLR環境
 IE以外の最新ブラウザでは動く(asm.jsを使えばIEでも動くかもという憶測
があるが未確認)
 .NET Core用にビルドしたDLLを、そのまま参照/実行できる
 Ex) EF.NET Core とかNuGetしてそのまま使える
 実行環境には何もインストールしないで良い(Progressive Web Application
とかに向いていそう)
 最新のC#をそのまま使える(当然ながらVB/F#も大丈夫のはず)
Blazorの仕組み

 Blazorは画面の制御がある程度できる
 WebAssemblyはDOMや各APIに触れないのでは?
 BlazorのフレームワークがDOMとの間で仲立ちするJavaScriptを持っている
ソースコード的には見えないところにある
 非同期処理などを使うと、画面への反映を自動的にやってくれる
 同期的に書き換えた時は画面の変更を通知するメソッドを呼ぶ
Blazorの仕組み

 ジェネリックcshtmlが書ける
 XAMLみたいにDataTemplateっぽくできる(ただしC#でゴリゴリ)
 htmlにデータバインディングできる
 async /await できる
 ラムダ式も全くそのままC#として使える
 ボタンのOnClickとかをC#のActionでペタペタ貼り付け可能(Indexを付与
した id とか名前とか付けなくても使えるのは結構良い)
 ただのモジュールではなくBlazor自体を1つのフレームワークと呼んで
も良いレベルではなかろうか
只者ではない

開発環境を作ろう
最低限のものが最大限…

 NET Core 2.1 SDKの最新版をインストール
 SDKの詳細なバージョン番号がビルドに必要 なことがある
2.1.403 とか。(表示する方法はあるので忘れても大丈夫)
環境構築(SDK)

 ASP.NET Core Blazor Language Services
 プロジェクトテンプレート
 インテリセンス
環境構築(VS2017(ver15.8)以降)

プロジェクトを作ろう
多くの人がハマる

 ASP.NET Core Webアプリケーションを新規作成
プロジェクト名を入力してOK
プロジェクトを作ろう

 Blazor(ASP.NET Core hosted)を選択
次の選択
SDKバージョンは
ここにも表示される

 プロジェクトテンプレートでは3つのプロジェクトに分かれる
 *.Client
 cshtml(View)群
 C#記述部はクライアントサイドでWebAssenbly化して動作する
 *.Server
 Controller群
 ASP.NETを使っている人ならおなじみのもの
 *.Shared
 両方で共有するDTO/Entityクラス群
 JSONシリアライズ可能なら(循環参照などが無いなら)Entityのクラスをそのまま配
置してもOK
 (2重管理しないでいいのは素晴らしい)
Blazorのプロジェクト構造

 まだ正式版じゃないので、環境によってビルドがフリーズすることがあ
ります。それを回避するために、*.Server.csproj を以下のように変更し
ます。
フリーズしない人はほっといて大丈夫。
これをやると直る人と直らない人がいるのでダメだったら諦め(そのう
ち直るでしょう)
プロジェクトを少し変更(1)

 global.json に .NET Core SDK のバージョンを書き込みます。
これも、何もせずに動いたらほっといて大丈夫
プロジェクトを少し変更(2)

F5(ビルド+デバッグ実行)
ASP.NET Coreが動いて
WebAssemblyが動いて
ちゃんと動く画面ができる
JavaScriptは一行も書いてない

 BlazorStrap
 NuGetから *.Client プロジェクトに追加しよう
 Bootstrap 4のラッパー群
 BootstrapをBlazorコンポーネント化してくれている
(危うく自分で作ってしまうところだった…)
 インテリセンスをcshtmlで有効化するために、using と addTagHelper を
追記しましょう
お勧めのパッケージ

メリットとデメリット
C#が得意ならおさえておいた方が良い技術
されど今すぐ使うかは…

 サーバーからクライアントまでC#
 EntityなどもC#(しかもClient/Serverで共用できる)
 htmlとC#を上手にミックスできる
 磨き抜かれたBlazorアプリケーションはどんどんMVVMっぽくなる気がする(こち
らまだ修行中ですが…)
 .NET のマネージド空間がWebAssemblyの空間だと考えると良い
 html とWebAssemblyを融和させるためのフレームワーク
つまり、htmlを出力するコードとそれを動かすためのWebAssemblyをビルドして
くれている。
 今までWebAssemblyでDOMを触れなかったことからするとかなり画期的。(言う
までもなくこの部分にはJavaScriptが間に挟まっています。開発環境から見えない
だけで)
C#大統一論的には凄い

 CSSでテーマを作れるので、通常のWebアプリを作るためのノウハウは
生きる
 サーバーサイドのビジネスロジックとモデルはC#で、クライアントサ
イドの基本的なロジックはC#で、表示上の詳細な制御が必要な部分の
みJavaScriptで。
という住み分けが今のところ最良と思える
既存技術と喧嘩しない

 選択肢が狭い
今日紹介したものを組み込む以外の選択肢がどうも思いつかない程度に
マイナー
 強いて言えば面白そうなのはBlazorCanvasExtensionsくらい
 cshtml 内の継承をサポートしているのにC#プロパティの[Parameter]属
性が継承されない
これがとても惜しい
なぜ先にジェネリックをサポートしたのか…
まだ発展途上

 DOMやWebGLに直接触れるようにしてくれたらいいなぁ
 現在は一部のプロパティにバインディングできるという程度
 JavaScriptでラッパーを書けばやれることは増える (←いまのところ現実的
な解)
 Blazorのコンセプト的には、ビジネスアプリケーションが作れれば十分
という雰囲気がビシビシと伝わってくる
 だから、できないことをやろうとするとマーシャリングが行われてパ
フォーマンスは犠牲になる
 なんとかしたいですよね(|)
対応してくれたら嬉しいところ

 JavaScriptとC#の相互運用は癖が強すぎる
https://learn-blazor.com/architecture/interop/
まだ書きにくい
 今までJavaScriptで書いていたものをRazorで書きまくることでかなりの事
はできるので、徹底してC#にすれば良いともいえるが…
 大まかに言うと、global / static なメソッド間でしか相互運用ができない
現時点で良くないところ

 JavaScriptではないのでブレークポイントが張れない
 Google Chromeで例外発生時のコールスタックは出る
 こりゃ確かにWebAssemblyだ
現時点で良くないところ

 起動時間が長い
 WebAssemblyは現在モジュール単位のコンパイルであるため
 ブラウザ側が実行コードをコンパイルしてくれるようになったら突然速く
なる
現時点で良くないところ

実践編

最近書いたコード
論より証拠といいます

 cshtml内で外部から情報を受け取る際に使用します
 C#でプロパティにできるものなら何でもできる
 ActionとかFunc<T>もできる
 親画面から処理を受け取るときに活躍
 Commandみたいなクラスを作るとMVVMっぽくて良いかも
[Parameter]

 Ajaxを使うところではこれを書く
 こんな風にかける
_partners = await Http.GetJsonAsync<Partner[]>("/api/Partners/");
@inject HttpClient Http

 ViewModelの型に応じてコントロールを変えたかったので作ってみた
 XAMLのとはちょっと毛色が違うけどこれはこれで良い
DataTemplate.cshtml

 ジェネリックのリストボックスを作ってみた
 ContentControlは内部でDataTemplateを用いて勝手に展開してくれる
ようにした
 Tを object にすると、DataTemplateがサポートしているものなら何でも
並べられるようになる
Listbox<T>

 ServerとClientで共用するクラスはここに配置
 通信はJSONで勝手にやってくれるので、うっかり循環参照にならない
ようにだけ気を付けよう
*.Sharedに配置するクラス

 サーバーサイドはASP.NET Coreのほぼ普通の書き方
Controller

 static の値がちゃんと保持されている
 シングルページだから
 セキュリティ的に問題のないものなら色々置ける
static

世間の取り組み

 少しずつ増えていますがまだ多くない
https://github.com/BlazorExtensions
 Canvas
 SignalR
e.t.c…
Blazor Extensions

まとめ
妄想含む

 現在は未完成感があるが、とても強力なフレームワークに成長する可能
性を秘めている
 WebAssemblyの進化とともに進化していく
 モジュールサイズとかコンパイル速度とか…
 サーバーサイドでwasmにコンパイルした方が良くない?とは思わんでも
ない
 開発環境の進歩には期待
 API系全般にアクセスする拡張が待たれる
 Canvasはもうあるけど、WebGL触りたい
来年くらいに多分面白くなる

 https://1drv.ms/u/s!Au2k6fUO0Z_Qgec1Y2wde1q-Pvbb7w
作りかけのものをデモで出したのであまり綺麗でないのはご海容くださ
い。
デモのソースコード

More Related Content

PPTX
最速C# 7.x
PPTX
C#で速度を極めるいろは
PDF
今日からできる!簡単 .NET 高速化 Tips
PDF
Inside FastEnum
PDF
async/await不要論
PPTX
C# 7.2 with .NET Core 2.1
PPTX
.NET Core 2.x 時代の C#
PDF
C++でCプリプロセッサを作ったり速くしたりしたお話
最速C# 7.x
C#で速度を極めるいろは
今日からできる!簡単 .NET 高速化 Tips
Inside FastEnum
async/await不要論
C# 7.2 with .NET Core 2.1
.NET Core 2.x 時代の C#
C++でCプリプロセッサを作ったり速くしたりしたお話

What's hot (20)

PDF
今からでも遅くないC#開発
PDF
SignalRブートキャンプ
PDF
【Unite Tokyo 2019】Understanding C# Struct All Things
PDF
Bluetoothでgo!
PDF
.NET Coreから概観する.NETのOSSへの取り組み
PPTX
C# 8.0 Preview in Visual Studio 2019 (16.0)
PDF
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
PDF
Async DeepDive basics
PPTX
C# 8.0 非同期ストリーム
PPTX
C#/.NETがやっていること 第二版
PDF
Final LINQ extensions III
PDF
良い?悪い?コードコメントの書き方
PDF
Flutterで単体テストを行う方法とGitHub Actionsを使った自動化
PDF
これからの「async/await」の話をしよう
PDF
Final LINQ Extensions
PDF
hooks riverpod + state notifier + freezed でのドメイン駆動設計
PDF
The History of Reactive Extensions
PDF
linq.js - Linq to Objects for JavaScript
PPTX
C#や.NET Frameworkがやっていること
PDF
An Internal of LINQ to Objects
今からでも遅くないC#開発
SignalRブートキャンプ
【Unite Tokyo 2019】Understanding C# Struct All Things
Bluetoothでgo!
.NET Coreから概観する.NETのOSSへの取り組み
C# 8.0 Preview in Visual Studio 2019 (16.0)
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Async DeepDive basics
C# 8.0 非同期ストリーム
C#/.NETがやっていること 第二版
Final LINQ extensions III
良い?悪い?コードコメントの書き方
Flutterで単体テストを行う方法とGitHub Actionsを使った自動化
これからの「async/await」の話をしよう
Final LINQ Extensions
hooks riverpod + state notifier + freezed でのドメイン駆動設計
The History of Reactive Extensions
linq.js - Linq to Objects for JavaScript
C#や.NET Frameworkがやっていること
An Internal of LINQ to Objects
Ad

Similar to Blazor0.6.0を用いたスクリプトレスWebアプリ開発の可能性 (20)

PDF
Blazor 触ってみた
PPTX
Blazor Web Assembly (C#) を触ってみた
PDF
C# で Single Page Web アプリを 開発できる Blazor ― その魅力
PDF
Mvc conf session_2_shibamura
PDF
C# で Single Page Web アプリが開発できるフレームワーク&開発環境 「Blazor」 ― その概要と Web アプリ開発者にもたらす利点
PDF
New Features of DotNet 6 Blazor WASM
PDF
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
PDF
Riotでサーバレスにした話
PPTX
モノづくりBlazor勉強会1回目資料_Blazorについて.pptx
PPTX
C# CloudScript Azure Functions との連携
PPTX
C++ AMPを使ってみよう
PDF
7/7 WordBench kobe dreamweaver seminar
PDF
C・C++用のコードカバレッジツールを自作してみた話
PDF
ASP.NETの進化とASP.NET Core Blazorの凄さ
PDF
141115 making web site
PPTX
(ゲームじゃない方の)switchで遊びたい話
PDF
Application development with c#, .net 6, blazor web assembly, asp.net web api...
ODP
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
PPTX
LambdaでHello, World(2017/07/21 サーバレスアーキテクチャ勉強会)
PPTX
20141017 introduce razor
Blazor 触ってみた
Blazor Web Assembly (C#) を触ってみた
C# で Single Page Web アプリを 開発できる Blazor ― その魅力
Mvc conf session_2_shibamura
C# で Single Page Web アプリが開発できるフレームワーク&開発環境 「Blazor」 ― その概要と Web アプリ開発者にもたらす利点
New Features of DotNet 6 Blazor WASM
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
Riotでサーバレスにした話
モノづくりBlazor勉強会1回目資料_Blazorについて.pptx
C# CloudScript Azure Functions との連携
C++ AMPを使ってみよう
7/7 WordBench kobe dreamweaver seminar
C・C++用のコードカバレッジツールを自作してみた話
ASP.NETの進化とASP.NET Core Blazorの凄さ
141115 making web site
(ゲームじゃない方の)switchで遊びたい話
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
LambdaでHello, World(2017/07/21 サーバレスアーキテクチャ勉強会)
20141017 introduce razor
Ad

Blazor0.6.0を用いたスクリプトレスWebアプリ開発の可能性