はじめに
僕はJSフレームワークに乗り遅れている感じがするので、今回はAngularJSを触ってみることにした。
今まではRails+CoffeScript+jQuery
で大体の事は対応できていたが、今後を考えるとSPA(Single Page Application)が弾頭に上がってくる事はほぼ間違い無いと思う。
(RailsもTurboinksを使っているので、ある意味SPAとも言える。Rails5のTurboinksはかなりSPAを意識しているっぽい。)
そう思って以前BackboneJS
を触った事があるが、コード量の多さに辟易した経験がある。
(BackboneJS
は固すぎる・・・)
今回のAngularJS
がどんなものかわからないが、何はともあれ使ってみる事にする。
この記事では、Angular2クイックスタートをやってみる。
※僕は英語が苦手なので、フィーリングでサイトを読んでいきます。謝ってる箇所などがありましたらご指摘ください。
ファイルの配置
クイックスタートに書かれている通り
mkdir angular2-quickstart
cd angular2-quickstart
を行う。
そしてJSファイルとHTMLファイルを作成してみる。
import {bootstrap, Component} from 'angular2/angular2';
@Component({
selector: 'my-app',
template: '<h1>My First Angular 2 App</h1>'
})
class AppComponent { }
bootstrap(AppComponent);
JSファイルだと思ったが、拡張子を見るとts
になっている。
どうやらTypeScript
で書かれているようだ。
TypeScript
は初めて触った。
CoffeeScript
と同じポジションらしいが、次のコードを見て驚愕する。
<html>
<head>
<title>Angular 2 QuickStart</title>
<script src="https://code.angularjs.org/tools/system.js"></script>
<script src="https://code.angularjs.org/tools/typescript.js"></script>
<script src="https://code.angularjs.org/2.0.0-alpha.44/angular2.dev.js"></script>
<script>
System.config({
transpiler: 'typescript',
typescriptOptions: { emitDecoratorMetadata: true }
});
System.import('./app.ts');
</script>
</head>
<body>
<my-app>loading...</my-app>
</body>
</html>
HTML内部でTypeScript
のコードであるSystem.import('./app.ts');
を直接インポートしているのだ。
CoffeeScript
ではコンパイルしたJSファイルをメインに使用するのだが、ここでは直接TypeScript
のコードを呼び出している。
これが驚愕した点だ。
もちろんだが、このファイルを直接開いてもloading...
と表示されるだけだ。
live-server
この環境を動かすためには静的ファイルサーバー
が必要になるようです。
なので、こちらを入れます。
$ npm install -g live-server
入れてたと思ったけどnode.js
を入れてなかったのでそこからスタートです。
$ brew install node
$ npm install -g live-server
インストールが終わったらサーバーを起動します。
$ live-server
ブラウザでlocalhost:8080
にアクセスしたところMy First Angular 2 App
が表示されました。
中身を変えてみる
app.ts
の中身を変えてみると、自動的にデータを読み込んでくれました。
てっきり一部分だけの切り替えかと思ったのですが、ページ全てを再読み込みされました。
仕組みはわからないのですが、101 Switching Protocols
というリクエストを投げているのでこれをlive-server
が監視しているのかもしれません。
また、chrome
とfirefox
の両方で開いている場合は一方のブラウザはloading...
と表示されてしまいました。
ここはクイックスタートを進めたいので、無視して進めます。
Ctrl+c
でlive-server
を止めます。
構成を変えます
どうやら、この構成はあまりよろしくないとの事なので構成を変えます。
$ mkdir -p src/app
以下の構成に変更します。
angular2-quickstart
└── src
├── app
│ └── app.ts
└── index.html
コマンドは以下のとおりです。
$ mv app.ts src/app/
$ mv index.html src/
で、パッケージをインストールします。
$ npm init -y
これはGemfile
やpom.xml
などと同じようなパッケージ管理をするためのpackage.json
を入れてくれるようです。
いつだかに使ったBower
はフロントエンド用の管理ソフトでしたが、今回のはどうなのでしょうか?
気にせず進みますw
npm i angular2@2.0.0-alpha.44 systemjs@0.19.2 --save --save-exact
package.json
に以下が追加され、node_modules
が作成されました。
"dependencies": {
"angular2": "2.0.0-alpha.44",
"systemjs": "0.19.2"
}
続けてlive-server
を入れていきます。
$ npm i typescript live-server --save-dev
さらに以下の内容が追加されました。
"devDependencies": {
"live-server": "^0.9.0",
"typescript": "^1.7.3"
}
クイックスタートにscript
部分を以下のように書き換えろと書かれているので、package.json
の中身を書き換えます。
{
"scripts": {
"tsc": "tsc -p src -w",
"start": "live-server --open=src"
}
}
ファイルのパスを書き換えます
構成が変わったのでファイルを書き換えます。
<html>
<head>
<title>Angular 2 QuickStart</title>
<script src="../node_modules/systemjs/dist/system.src.js"></script>
<script src="../node_modules/angular2/bundles/angular2.dev.js"></script>
<script>
System.config({
packages: {'app': {defaultExtension: 'js'}}
});
System.import('app/app');
</script>
</head>
<body>
<my-app>Loading...</my-app>
</body>
</html>
これで全てローカルファイルをみるようになりました。
また、js
ファイルを読み込むようになりました。
TypeScript
を読み込めなくなったので、tsconfig.json
をsrc
以下に配置します。
{
"compilerOptions": {
"target": "ES5",
"module": "commonjs",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": false,
"noImplicitAny": false
}
}
コンパイル情報でしょうか?
とりあえず以下の構成になっていればOKです。
angular2-quickstart
├── node_modules
├── src
│ ├── app
| │ └── app.ts
│ ├── index.html
│ └── tsconfig.json
└── package.json
JSのコンパイル
JSのコンパイルを行います。
以下のコマンドはルートで実行します。
$ npm run tsc
実行するとコンパイル監視状態になります。
なのでsrc/app/
の中をみるとapp.js
ができており、app.ts
を書き換えるとapp.js
が書き換わります。
tsc -p src -w
とpackage.json
で指定しているため常駐されるようです。(-w
をとれば常駐されません。)
ctrl+c
で終了します。
実行
では、実際に実行します。
$ npm start
これでローカル内で動きました。
ただ、コンパイルは動いてないのでapp.ts
を変更しても反映されません。
また、ルートへアクセスするとフォルダ情報が見えてしまいます。
最後に
とりあえず、いろいろ問題がありつつもクイックスタートを終えました。
(最後のおまけはやってませんが。)
これだけだと実運用には耐えれないですが、なんとなくの構想は理解できました。
引き続きチュートリアルを進める事で理解を深めていこうと思います。
RESTでデータを取り出して動的にページの情報を切り替えれないとAngularの恩恵はないですからね・・・。(まだ、理解してないだけかもしれませんが・・・)