More Related Content
エンジニアから都庁へ~中の人が語る街のDX、都庁のDX~ JIRA / Confluence の必須プラグインはこれだ ストリーム処理を支えるキューイングシステムの選び方 PostgreSQL 14 モニタリング新機能紹介(PostgreSQL カンファレンス #24、2021/06/08) What's hot (20)
1076: CUDAデバッグ・プロファイリング入門 Java クライント実装におけるAPIスタイル頂上決戦! 野良REST vs GraphQL vs OData vs OpenAPI (Swagger) Inside vacuum - 第一回PostgreSQLプレ勉強会 ログ解析基盤におけるストリーム処理パイプラインについて pixiv サイバーエージェント共同勉強会 solr導入記 Yahoo! JAPANにおけるApache Cassandraへの取り組み PGroonga 2 - PostgreSQLでの全文検索の決定版 今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 - 統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料) Viewers also liked (20)
レスポンシブおっぱいでまなぶスケーラブルグラフィックス Haskell勉強会 14.1〜14.3 の説明資料 power-assert, mechanism and philosophy 3日時間をもらったのでTypeScriptを触ってみた Similar to TypeScriptハンズオン第1回テキスト (20)
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら! Visual Studioで始めるTypeScript開発入門 LT駆動開発04 5分では分からないTypeScriptのなんとか TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc... JavaScriptを使った開発を始めるなら!TypeScriptをはじめよう ~ ステップアップ Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用 ng-japan 2015 TypeScript+AngularJS 1.3 Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで TypeScript と Visual Studio Code "今" 押さえておきたい! Web アプリ開発の技術トレンドとツールの進化 Visual Studio Codeで始めるTypeScript TypeScriptハンズオン第1回テキスト
- 3. 自己紹介
名前 藤谷 瑞樹
所属 リクソル キャリア開発G
専攻 社会学
好きなもの P・ブルデュー、G・バシュラール、
M・ブロック、F・ジャコブズ、
V・ウルフ、J・オースティンなど
苦手なもの 人間の多い場所、人間相手に何か
すること
最近の動向 こたつでヤドカリ生活
- 4. この資料における用語法
用語 正式名 説明
JS JavaScript 言わずもがなであるが、主要Webブラウザで実行可能なスクリプ
ト言語。
ES ECMAScript JavaScriptをもとにECMA標準として定義されたスクリプト言語仕
様。JS以外にActionScriptやTypeScriptなどの実装がある。改訂に
よる言語仕様強化が繰り返されており、TS3、TS5、TS6=
TS2015、TS7=TS2016と呼称されている。
TS TypeScript ESの実装の1つであり、JSの(ほぼ)スーパーセットというべき
言語。コンパイルを通じてJSに変換(トランスパイル)される。
端末 コマンドプロン
プト、etc...
Windowsであればコマンドプロンプト、macOSであればターミナ
ル、Linuxであれば…ディストロによりけり。記述の便宜上の名称
として「端末」を用いる。
なお、本文やサンプルコードに登場するディレクトリ区切り文字は、各自
が使用しているOSに合わせて適宜読み替えてほしい。
- 6. コンテンツ
• スコープ内
• TSの紹介
• TSのメリット(とデメリット)のリストアップ
• 言語仕様の超概要の説明(ただしハイライトだけ!)
• 開発環境の構築方法の説明
• スコープ外
• 土台としてのJSの言語仕様
• AngularやReactなどとの統合
- 7. 進め方
• ツールのインストールやコーディングとその合間に言語仕様や
ツールに関する捕捉説明を行う。
• 第1回
• 開発に最低限必要になるツール群をインストールしつつ、TSの言語仕
様を中心に学んでいく。
• ゴール:TSをそれ単体としてコーディングし、トランスパイルして、
JSの既存リソースとともに使用できる状態。
• 第2回
• TSビルド&テストするためのツール群をインストールしつつ、TS開
発を現実の開発体制全体のなかに組み込む方法を学んでいく。
• ゴール:Node.jsのツールチェインを利用して、ビルド&テストを実
施でき、Java/C#のツールチェインやCI体制と統合する準備もできて
いる状態。
- 10. Node.jsインストール※1
① Node.js公式サイトにアク
セス
② OS/CPUアーキに照らして
適切なインストーラを取得
③ デフォルトの設定でインス
トール
④ インストールが終わったら
端末で"node -v"コマンド
を実行
⑤ パスが通っていることと
バージョン番号が想定通り
であることを確認※2
作業
※1 OS/サードパーティが提供するパッケージ管理システム(例:MacPorts)を通じたインストール方法もあ
るが、ここでは公式インストーラを使う前提で話をすすめる。
※2 macOSやLinuxなど複数のパッケージ管理方法が存在する環境では、先にインストールされていた異なる
バージョンが、新たにインストールされたバージョンを「隠して」しまっていることがまま起こりうる。
- 12. npmコマンド一覧
主に使ってるものだけ!
コマンド 別の書き方 説明
npm help <cmd> サブコマンドのマニュアルを表示する
npm init カレントディレクトリにnodeパッケージのプロ
ジェクトを作成する。
npm i <pkg> npm install <pkg> npmリポジトリからパッケージをインストール
する。
npm i -S <pkg> npm install --save <pkg> npmリポジトリから指定のパッケージを取得し
プロジェクトにインストールする。同時にプロ
ジェクトのpackage.jsonに実行時の依存性とし
て登録する。
npm i -D <pkg> npm install --save-dev
<pkg>
npmリポジトリから指定のパッケージを取得し
プロジェクトにインストールする。同時にプロ
ジェクトのpackage.jsonにビルド/テスト時の依
存性として登録する。
npm i -g <pkg> npm install --global
<pkg>
npmリポジトリからパッケージを取得しシステ
ムにインストールする。CLIを持つパッケージで
あればnpmコマンド同様に端末から直接実行可
能になる。
※注意:当然のことながら管理者権限(macOS
やLinuxではroot権限)が必要になる。
- 13. はじめてのnodeパッケージ
① 端末を起動
② "mkdir <path>"コマンドでサンプル・プロジェクト用ディ
レクトリを作成
③ "cd <path>"コマンドで作成したディレクトリをカレント
ディレクトリに設定
④ "npm init"コマンドを実行
⑤ いろいろ聞かれるがすべてデフォルト(Enterキーを押すだ
け)で通す
⑥ "ls"もしくは"dir"コマンドで"package.json"ファイルができ
たことを確認
作業
- 14. Gulpをインストール
① "npm i -g gulp-cli"コマン
ドでGulpのCLIをグローバ
ル・インストール
② "npm i -D gulp"コマンドで
GulpのFWをローカルかつ
開発時依存性としてインス
トール
③ "type nul > gulpfile.js"
("touch gulpfile.js")コマ
ンドでGulpのタスク定義
ファイルを作成
作業
- 21. ツールの主な選択肢
名称 無償? OS非依存? 説明
Visual Studio NO NO VS2013.2以降TSをサポートしている。開発環境として
Windows OS以外を想定していないのであれば選択肢に
入る。無償版の利用には制限がある※1。
WebStorm NO YES IntelliJファミリー。サーバサイドの開発にIntelliJを使用
しているならば選択肢に入る。
Eclipse YES YES TypEcsなどいくつかプラグインがあるが明らかに活発で
ない。しかし直近ではEclipse本体がnpmやGulpなどとの
統合を意識しているようで…ようするに今後に期待。
VS Code YES YES Microsoft社が開発するAtomベースのテキストエディタ。
VSには機能的に劣るもののTSのコンパイルなどはこなせ
る。
Atom YES YES GitHubがNode.jsランタイムをベースに開発し公開して
いるテキストエディタ。コミュニティが開発・公開して
いる各種パッケージ(プラグイン)により簡単に機能拡
張ができる。
※VS Code・Atom以外にもTSをサポートするエディタはある。
※1 この点については右の記事を参照のこと:http://www.buildinsider.net/hub/insidersbreak/2014112101
- 26. AltJSの例
言語名 開発元 説明
CoffeeScript Jeremy
Ashkenas
AltJSの嚆矢となった言語。便利な構文/ショートハンドの導入。それと不可
分のコードの曖昧性の急拡大(XML/JSONに対するYAMLのようなもの)。
ようするに状況は却って悪化。
ClojureScript Rich Hickey JVM上で稼働するLisp方言であるClojureのコードを元にJavaScriptコードを
生成する。Clojureの売りは並列分散処理のはずだが…。
Dart Google クライアントサイドにランタイムが必要。つまりJavaScriptの糖衣構文では
なく、独立した言語。
TypeScript Microsoft JavaScriptのスーパーセットであり、ECMAScript v6以降の先行実装でもあ
る。後程さらに詳しく取り上げる。
Scala.js École
polytechnique
fédérale de
Lausanne
/Typesafe
JVM上で稼働するOOP+FP言語であるScalaのコードを元にJavaScriptコー
ドを生成する。Java/C#以上に強力な型システム、高度な型推論、にも関わ
らずシンプルな記法、内部DSL、強力な標準APIといったScalaの特徴をそ
のまま移植※1。当然の結果としてものすごいファイルサイズになる。
※1 Scala.jsについてはこちらも参照のこと: http://m12i.hatenablog.com/entry/2015/07/20/104347
補足
- 27. AltJSの実行時エラー解析
• AltJSには以下の2つのコードが存在することになる:
A) もともとのソースコード(非JS)
B) コンパイル後のソースコード(JS)
• 実行時のエラーはもちろんB側で起きる。
• エラーを解析するには、B側のコードのエラー箇所がA側の
コードのどこに対応するかを知る必要がある。
• この対応付けを実現するのが、コンパイラにより生成され
る.mapファイル※1。
• .mapに対応したブラウザではエラー発生時にもともとのコー
ドの位置情報を表示してくれる。
※1 .mapファイルはjQueryなどのライブラリでも利用されている。この場合.mapはライブラリのもとのソース
コードとそれをminifyしたコードとを対応付ける(たぶん歴史的にはこの利用法が先行する)。
補足
- 29. TSのJava/C#っぽい部分
ローレベル
• classベースのOOP言語
• 静的型付け
• アクセス修飾子
• モジュール構造
• 列挙型
• ジェネリクス
ハイレベル
• ラムダ式
• 型推論※1
• async/await※2
• yield return
※1 Javaのように後方互換性を気にする必要のなかったTSでは、型推論も非常に高度なものとなっており、
コーディングの生産性向上に貢献している。
※2 async/awaitはC#ではTask<T>を核としているが、TSではPromise<T>を核としている。いずれにせよ
Ajaxを主とする非同期処理が多用されるJS/TSの世界では、必然的にコールバック関数が多様され、それがコー
ドの可読性悪化のとなる。このためasync/awaitによる同期手続きの煩雑さの解消は大きな意味を持つ。
Promise<T>の概要については http://m12i.hatenablog.com/entry/2016/12/23/234556 などを参照のこと。
- 31. Java/C#よりすごい部分
• 構造的部分型(Structural Subtyping)≠継承に基づく部分型
• いわゆる「ダックタイピング」に対する構文サポート。
• ダックタイピングが「整合性の担保はAPI開発者とAPIユーザ双方の努
力次第」なのに対して、構造的部分型は「整合性はコンパイラが保証
する」。
• デコレータ
• Pythonにもあるアレ。
• JavaのAnnotation/C#のAttributeと異なり実装部を持つ。
• いずれにせよ対象の型や型のメンバーにAOPを行うもの。
• コンストラクタ引数によるインスタンス・メンバ宣言
• Scalaにもあるアレ。
- 37. ディレクトリ構成
├── node_modules ("npm i"により自動生成)
├── src (ビルド対象ファイルセット)
│ ├── index.html (HTMLファイル。あとで作成)
│ └── js
│ ├── main.ts (TSファイル。あとで作成)
│ └── sub.ts (同上)
├── target (ビルド成果物の出力先)
├── package.json ("npm init"により自動作成)
├── tsconfig.json (TS設定。あとで作成)
└── gulpfile.js (Gulp設定。あとで作成)
※node_modulesとpackage.json、tsconfig.json、gulpfile.js以
外のパスは開発者が自由に決めるもの。
- 38. 依存性のインストール
① "npm i -D <pkg>"で以下の開発時依存性をインストール:
• gulp(すでに実施済み)
• gulp-rename
• gulp-sourcemaps
• gulp-typescript
• gulp-uglify
• merge-stream
• typescript
• @types/jquery
② "npm i -S <pkg>"で以下の実行時依存性をインストール:
• es6-promise
• jquery
• requirejs
③ "npm i -g <pkg>"で以下のCLIをインストール:
• serve
作業
- 54. ちょっと書き換えてみよう
• showMessage関数の宣言を書き換えたらどうなる?
• 前: function showMessage(g : sub.Greeter)
• 後: function showMessage(g : { greet : () => string })
• showMessage関数の呼び出しを書き換えたらどうなる?
• 前: showMessage(new sub.GreeterEn());
• 後1: showMessage(new sub.GreeterX('こんにちはみなさん'));
• 後2: showMessage({ greet : () => 'こんにちはみなさん' });
• gulpfile.jsのtypescript(...)フィルタの後ろに以下の2フィルタを
追加したらどうなる?
• .pipe(uglify()) // 圧縮・難読化
• .pipe(rename({suffix: '.min'})) // ファイル名編集
作業