Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ASP.NET CoreやTypeScriptの力を借りてレガシー寄りの環境に立ち向かいたかった話

ASP.NET CoreやTypeScriptの力を借りてレガシー寄りの環境に立ち向かいたかった話

2019/07/20開催のわんくま同盟 大阪勉強会 #76 の資料です。

masanori_msl

July 20, 2019
Tweet

More Decks by masanori_msl

Other Decks in Programming

Transcript

  1. 開発(サーバーサイド) 発行時に必要なファイル( .NET Core 含む)を一緒に出力することで、 実行環境に .NET Core がインストールされてなくても実行可能に。 (Self-contained

    .NET Core Applications) 必要なことは① .csproj ファイルへの RuntimeIdentifier 追加と ② publish コマンドへのオプション追加。
  2. 開発(サーバーサイド) <Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>netcoreapp2.2</TargetFramework> <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel> <RuntimeIdentifier>win-x86</RuntimeIdentifier> </PropertyGroup> <ItemGroup> <PackageReference

    Include="Microsoft.AspNetCore.App" /> <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" /> </ItemGroup> </Project> ① .csproj ファイルへの RuntimeIdentifier 追加
  3. 開発(サーバーサイド) 参照 .NET Core application deployment – .NET Core –

    Microsoft Docs https://docs.microsoft.com/en-us/dotnet/core/deploying/ How to create a self contained .Net core application? https://dotnetthoughts.net/how-to-create-a-self-contained-dotnet-core-application/
  4. 開発(サーバーサイド) 課題 プロジェクトフォルダー > bin > Release > netcoreapp2.2 >

    win-x86 > publish に 発行したファイルが出力される。
  5.  HTML5  Razor  TypeScript  PostCSS  webpack

     Polyfillあれこれ 技術選定(クライアントサイド) 主に使ったもの
  6. JavaScript の Framework は? Angular 、 React 、 Vue(ABC 順)

    どれも人気があるが、 下記の点が気になって今回は選択せず。  基本的に Node.js を使って動作するため、実行環境にも Node.js が必要。  半年でメジャーバージョンアップデートする Angular をはじめ(LTSはあるが)、 更新が速い。(ASP.NET Coreについては目をつぶる方針で。。。)  自分をはじめ、メンバーの中で開発経験が少ない。
  7. PostCSS 選択の理由  Autoprefixer (CSS のベンダープレフィックスを自動でつけてくれる)が 使いたかった。  @import も便利(※)。

     CSS 変数も便利(※)。 ※PostCSSの機能ではないが、コンパイル時1つのファイルにまとめてくれるため、 ブラウザ間の対応の違いなどを気にせず使えた。
  8. webpack 選択の理由  きっかけは Pikaday(https://pikaday.com/ シンプルなデートピッカー。 IE7から対応しているらしい) を使うのに、 import /

    export が必要になったため。  TypeScript -> ES3 の JavaScript に変換、というのは tsc で可能だが、 import / export は別途ツールが必要。
  9. Razorを使う  TypeScript( JavaScript )にデータが渡しづらい。 (ViewData などは Razor でしか扱えないため、 HTML

    から TypeScript に データを渡す処理を別途書く必要がある)  複数人で開発する時に、クライアントサイドを分割しづらい。 課題
  10. TypeScript を使う  TypeScript  tsc (コンパイラ)  InversifyJS (Dependency

    Injection)  reflect-metadata (InversifyJS で使用)  pikaday (デートピッカー)  moment (日付を良い感じに扱えるようにする)  jest (テストツール) 主に使ったもの
  11. TypeScript でハマったところ export function doSomething(){ let numbers = [10, 5,

    3, 44, 1]; for(let n of numbers.sort()){ console.log(n); } } Sort 結果は 1 -> 10 -> 3 -> 44 -> 5 となる。 これは引数無しで sort() を実行すると辞書順でソートされる、という JavaScript の 挙動がそのまま反映されるため。
  12. TypeScript でハマったところ export function doSomething(){ let numbers = [10, 5,

    3, 44, 1]; for(let n of numbers.sort((a, b) => a - b)){ console.log(n); } } 数値順でソートするには引数を指定する。
  13. TypeScript の好きなところ Non-Nullable Null になり得るかどうかが指定できる(ただし undefined にはなる)。 かつ Kotlin でいう

    Smart cast のように扱われる。 (Nullable であっても Null チェック後は Non-Nullable として扱われる)
  14. TypeScript の好きなところ Non-Nullable export class User{ public name: string =

    “”; // Non-Nullable public nickname: string| null = null; // Nullable } export function doSomething(){ let newUser = new User(); newUser.name = null; // ERROR let nickname = newUser.nickname.toString(); // ERROR if(newUser.nickname !== null){ let nickname2 = newUser.nickname.toString(); // OK } }
  15. IEでエラーがでない Promise を使ったコードを IE11 で実行すると、 Promise が見つからない、といった エラーが発生する。 しかし、 Array.prototype.find()

    を使うと、エラーが表示されず、 かつ処理がそこで止まってしまうため問題を発見しづらい。
  16. Polyfill  Promise: https://www.promisejs.org/  fetch: https://github.com/github/fetch  Array.prototype.find() :

    https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/find  Array.prototype.findIndex() : https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex  url-search-params-polyfill: https://github.com/jerrybendy/url-search-params-polyfill fetch と ur—search-params-polyfill は npm install 、他はファイルを用意して _Layout.cshtml で読み込みました。
  17. PostCSS を使う 設定ファイル module.exports = { plugins: [ require("autoprefixer")({ "grid":

    true }), require("precss") ] } postcss.config.js というファイルを作り(多分ファイル名は何でも良さそう)、 有効にするプラグイン、 ( Autoprefixer の場合) 有効にする CSS の種類 ( CSS grid など)を指定する。
  18. PostCSS を使う 設定ファイル { ~省略~ "browserslist": [ "last 2 version",

    "> 1%", "maintained node versions", "not dead" ], ~省略~ } 対応するブラウザバージョンは、以前 postcss.config.js に書いていたが、 現在は package.json に書くよう変更されている。
  19. PostCSS を使う 課題 正直設定ファイルの書き方よくわかりません (^o^)\ (grid の場合は postcss.config.js で true

    にすると有効になるが、 flexbox は browserlist を指定する必要があるとか)
  20. PostCSS を使う ともあれコンパイル npx postcss 変換前の PostCSSファイルパス -c postcss.config.js -d

    出力先のディレクトリパス ※出力先ディレクトリパスに元のファイル名でコンパイル済みの CSS が出力される。 ※ オプションとして -w をつけると、 CSS ファイルを監視して変更のたびに自動コンパイルしてくれる。
  21. PostCSS を使う package.json の script に追加する ~省略~ "scripts": { “css”:

    “npx postcss 変換前の PostCSSファイルパス -c postcss.config.js -d 出力先のディレクトリパス -w" } } npm run css を実行するとコンパイルを実行してくれる。 webpack も同じことができるが、両方いっぺんに監視する、というのは難しそう。
  22. PostCSS の良いところ  何といっても Autoprefixer が便利!  @import や CSS

    変数などもコンパイル時に解決してくれるので、 IE でも心配せずに使える。  プラグインが豊富なので、Autoprefixer 以外もあれこれ試すと良さそう。
  23. License  Google Noto Fonts http://www.google.com/get/noto/ Copyright(c) Google Inc SIL

    Open Font License (https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL )