Angular 5 (with materialize)をWindows 10で簡単にはじめる(using Ubuntu/Windows Subsystem for Linux)

2017/12/10

最近はmacが優勢だと感じることが多い中、windowsもついにlinux環境が搭載されたので、ローカルでAngular(version 5)を手軽に始めてみたいと思います。
（いままではcygwinやvirtualbox/vagrant、dockerなどで対応してきました）

## やること

0. Windows 10 のローカルPCでAngular 5の開発環境をつくってみる
0. Angular にマテリアルデザインのフレームワーク「Materialize」を導入してみる

https://github.com/n-kazuhide-takahashi/sample-materializecss-ng5

## 最初にUbuntu導入

正式名称は「Bash on Ubuntu on Windows」->「Windows Subsystem for Linux」
windows10へのUbuntu導入はこちらの記事などを参考にしてみてください。

【Windows10】 ストアアプリ「Ubuntu」のインストール方法と入手できない場合の対処方法
https://qiita.com/ayatokura/items/b9fd333dd1f19eca1ed6

Windows Subsystem for Linuxをインストールしてみよう！
https://qiita.com/Aruneko/items/c79810b0b015bebf30bb

Microsoft Store で ``WSL``で検索するとバナーが出て、その先に進むとSUSEなども出てきます。
(fedoraはどうなったのかなー？)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/216137/5f808171-6de6-9e32-f19d-648489bec113.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/216137/c0a2f854-fb71-eea6-d223-cbd26888e171.png)

この記事ではWindowsにUbuntuがインストールされたところからスタートします。

最近このターミナルを使っています。(electron動作でwindows版もあります)
https://github.com/zeit/hyper

## 準備

Angular開発を始めるのに必要なものをそろえていきます。

- nvm & node(node/npm 5)
- @angular/cli

### nvm のインストール

nvm (Installationに従って導入)
https://github.com/creationix/nvm

- インストールのコマンド

```
cd ~
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash

cat <<EOF >> ~/.profile

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm
EOF

. .profile
```

### node のインストール

``nvm ls-remote``でインストール可能なリストがたくさん表示されます。
(最新を選んでみました。npm5系統のバージョンの選択は必須と思われます)

```
nvm install v9.2.1
node -v
```

### Angular CLI のインストール

インストールはnpmで行います。
(ここではプロジェクト単位ではなくglobalにインストールします)

```
npm install -g @angular/cli
ng version
```

```
$ ng version

    _                      _                 ____ _     ___
   / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
  / △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
 / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
/_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
               |___/

Angular CLI: 1.6.0
Node: 9.2.1
OS: linux x64
Angular:
...
```

### IDE環境 (お好みで)

筆者はPhpStorm(有償)使っています。
無償だとVSCodeがメジャーなところだと思います。

IDEで下記プロジェクトを開く場合ですが、Ubuntu上のファイルはちょっと変わった場所
``C:\Users\<ユーザー名>\AppData\Local\lxss``にあります。ですが、絶対にwindows側からファイルを更新してはいけません！本投稿の後方にて説明していますが、Ubuntu側でファイルのパーミッションが飛んでしまいます。

```
windowsから見たPATHの例(githubアカウントごとにユーザーを分けると便利でした)
C:\Users\<ユーザー名>\AppData\Local\lxss\home\<ubuntuユーザー名>\develop\sample-materializecss-ng5
```

対策案としては・・・

```
PhpStorm/WebStormではDeployment機能でAuto Uploadによりファイルを同期する
VSCodeではsftpプラグインなどでファイルを同期する
```

## Angularの開発スタート

### まずはCLIでprojectの作成

```
ng new sample-materializecss-ng5
cd sample-materializecss-ng5
```

```
$ ng new sample-materializecss-ng5
  create sample-materializecss-ng5/README.md (1039 bytes)
  create sample-materializecss-ng5/.angular-cli.json (1260 bytes)
  create sample-materializecss-ng5/.editorconfig (245 bytes)
  create sample-materializecss-ng5/.gitignore (516 bytes)
  create sample-materializecss-ng5/src/assets/.gitkeep (0 bytes)
  create sample-materializecss-ng5/src/environments/environment.prod.ts (51 bytes)
  create sample-materializecss-ng5/src/environments/environment.ts (387 bytes)
  create sample-materializecss-ng5/src/favicon.ico (5430 bytes)
  create sample-materializecss-ng5/src/index.html (310 bytes)
  create sample-materializecss-ng5/src/main.ts (370 bytes)
  create sample-materializecss-ng5/src/polyfills.ts (2405 bytes)
  create sample-materializecss-ng5/src/styles.css (80 bytes)
  create sample-materializecss-ng5/src/test.ts (1085 bytes)
  create sample-materializecss-ng5/src/tsconfig.app.json (211 bytes)
  create sample-materializecss-ng5/src/tsconfig.spec.json (304 bytes)
  create sample-materializecss-ng5/src/typings.d.ts (104 bytes)
  create sample-materializecss-ng5/e2e/app.e2e-spec.ts (307 bytes)
  create sample-materializecss-ng5/e2e/app.po.ts (208 bytes)
  create sample-materializecss-ng5/e2e/tsconfig.e2e.json (235 bytes)
  create sample-materializecss-ng5/karma.conf.js (923 bytes)
  create sample-materializecss-ng5/package.json (1330 bytes)
  create sample-materializecss-ng5/protractor.conf.js (722 bytes)
  create sample-materializecss-ng5/tsconfig.json (363 bytes)
  create sample-materializecss-ng5/tslint.json (3040 bytes)
  create sample-materializecss-ng5/src/app/app.module.ts (316 bytes)
  create sample-materializecss-ng5/src/app/app.component.css (0 bytes)
  create sample-materializecss-ng5/src/app/app.component.html (1141 bytes)
  create sample-materializecss-ng5/src/app/app.component.spec.ts (986 bytes)
  create sample-materializecss-ng5/src/app/app.component.ts (207 bytes)
Installing packages for tooling via npm.

> node-sass@4.7.2 install /home/glv/sample-materializecss-ng5/node_modules/node-sass
> node scripts/install.js

Cached binary found at /home/glv/.npm/node-sass/4.7.2/linux-x64-59_binding.node

> uglifyjs-webpack-plugin@0.4.6 postinstall /home/glv/sample-materializecss-ng5/node_modules/webpack/node_
modules/uglifyjs-webpack-plugin
> node lib/post_install.js


> node-sass@4.7.2 postinstall /home/glv/sample-materializecss-ng5/node_modules/node-sass
> node scripts/build.js

Binary found at /home/glv/sample-materializecss-ng5/node_modules/node-sass/vendor/linux-x64-59/binding.nod
e
Testing binary
Binary is fine
npm WARN @schematics/angular@0.1.10 requires a peer of @angular-devkit/schematics@0.0.40 but none is insta
lled. You must install peer dependencies yourself.
npm WARN @schematics/schematics@0.0.10 requires a peer of @angular-devkit/schematics@0.0.40 but none is in
stalled. You must install peer dependencies yourself.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.1.3 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.1.3: wanted {"os":"darwi
n","arch":"any"} (current: {"os":"linux","arch":"x64"})

added 1149 packages in 278.428s
Installed packages for tooling via npm.
Successfully initialized git.
Project 'sample-materializecss-ng5' successfully created.
```

まず動かしてみましょう

```
npm start
```

その後、ブラウザで ``http://localhost:4200/`` を表示してみましょう
止めるときはCTRL+Cで

welcomeな表示を見れたらOKです

![image.png](https://qiita-image-store.s3.amazonaws.com/0/216137/4498a1a6-9dd9-6c25-6b90-742b721430fc.png)

### MaterializeCSS / angular2-materialize

次にデザインフレームワークを導入します
（最近materializeの1.0.0-alpha.2がリリースされたのでテストもしたかったので…）

angular2-materialize
https://www.npmjs.com/package/angular2-materialize

- いくつかのnpmをインストールする

```
npm install materialize-css --save
npm install angular2-materialize --save
npm install jquery@^2.2.4 --save
npm install hammerjs --save
```

- angular-cli.jsonを編集

  - stylesにmaterialize.cssを追記

```
      "styles": [
        "../node_modules/materialize-css/dist/css/materialize.css",
        "styles.css"
      ],
```

  - scriptsにjquery.js/hammer.js/materialize.jsを追加

```
      "scripts": [
        "../node_modules/jquery/dist/jquery.js",
        "../node_modules/hammerjs/hammer.js",
        "../node_modules/materialize-css/dist/js/materialize.js"
      ],
```

- src/index.htmlにGoogleIconを追記

```
  <link href="http://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
```

- app.module.tsにMaterializeModuleを追加(@NgModuleのimportsに追加する)

```
import { MaterializeModule } from 'angular2-materialize';

～省略～

  imports: [
    BrowserModule,
    MaterializeModule
  ],
```

ではサンプルとしてMaterializeのヘッダーとフッターをつけてみましょう

Materialize NavBar
http://next.materializecss.com/navbar.html

Materialize Footer
http://next.materializecss.com/footer.html

- src/app/app.component.html

```
<!--The content below is only a placeholder and can be replaced.-->
<header>
  <nav>
    <div class="nav-wrapper">
      <a href="#" class="brand-logo">Logo</a>
      <ul id="nav-mobile" class="right hide-on-med-and-down">
        <li><a href="sass.html">Sass</a></li>
        <li><a href="badges.html">Components</a></li>
        <li><a href="collapsible.html">JavaScript</a></li>
      </ul>
    </div>
  </nav>
</header>

<div style="text-align:center">
  <h1>
    Welcome to {{ title }}!
  </h1>
  <img width="300" alt="Angular Logo" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTAgMjUwIj4KICAgIDxwYXRoIGZpbGw9IiNERDAwMzEiIGQ9Ik0xMjUgMzBMMzEuOSA2My4ybDE0LjIgMTIzLjFMMTI1IDIzMGw3OC45LTQzLjcgMTQuMi0xMjMuMXoiIC8+CiAgICA8cGF0aCBmaWxsPSIjQzMwMDJGIiBkPSJNMTI1IDMwdjIyLjItLjFWMjMwbDc4LjktNDMuNyAxNC4yLTEyMy4xTDEyNSAzMHoiIC8+CiAgICA8cGF0aCAgZmlsbD0iI0ZGRkZGRiIgZD0iTTEyNSA1Mi4xTDY2LjggMTgyLjZoMjEuN2wxMS43LTI5LjJoNDkuNGwxMS43IDI5LjJIMTgzTDEyNSA1Mi4xem0xNyA4My4zaC0zNGwxNy00MC45IDE3IDQwLjl6IiAvPgogIDwvc3ZnPg==">
</div>
<h2>Here are some links to help you start: </h2>
<ul>
  <li>
    <h2><a target="_blank" rel="noopener" href="https://angular.io/tutorial">Tour of Heroes</a></h2>
  </li>
  <li>
    <h2><a target="_blank" rel="noopener" href="https://github.com/angular/angular-cli/wiki">CLI Documentation</a></h2>
  </li>
  <li>
    <h2><a target="_blank" rel="noopener" href="https://blog.angular.io/">Angular blog</a></h2>
  </li>
</ul>

<footer class="page-footer">
  <div class="container">
    <div class="row">
      <div class="col l6 s12">
        <h5 class="white-text">Footer Content</h5>
        <p class="grey-text text-lighten-4">You can use rows and columns here to organize your footer content.</p>
      </div>
      <div class="col l4 offset-l2 s12">
        <h5 class="white-text">Links</h5>
        <ul>
          <li><a class="grey-text text-lighten-3" href="#!">Link 1</a></li>
          <li><a class="grey-text text-lighten-3" href="#!">Link 2</a></li>
          <li><a class="grey-text text-lighten-3" href="#!">Link 3</a></li>
          <li><a class="grey-text text-lighten-3" href="#!">Link 4</a></li>
        </ul>
      </div>
    </div>
  </div>
  <div class="footer-copyright">
    <div class="container">
      © 2014 Copyright Text
      <a class="grey-text text-lighten-4 right" href="#!">More Links</a>
    </div>
  </div>
</footer>
```

これで動かしてみましょう ``npm start`` http://localhost:4200/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/216137/a468c26b-6a58-f26d-8689-5ffac4a80af7.png)

こんな感じで簡単にAgular 5でもMaterializeの導入は問題なさそうです。

### ここで、少々問題が…

直接windows上からubuntuのファイルを更新するとパーミッションがとんでしまいました。
このようなことがあるらしく
https://www.kaitoy.xyz/2016/11/19/bow-do-not-change-linux-files-from-windows/
https://blogs.msdn.microsoft.com/commandline/2016/11/17/do-not-change-linux-files-using-windows-apps-and-tools/

```
$ ll
合計 336
drwxrwxr-x 0 user group   4096 12月  9 17:15 ./
drwxrwxr-x 0 user group   4096 12月  9 17:28 ../
---------- 1 user group   1495 12月  9 17:35 .angular-cli.json ←ここ！(さっきeditしたもの)
-rw-rw-r-- 1 user group    245 12月  9 16:52 .editorconfig
drwxrwxr-x 0 user group   4096 12月  9 17:19 .git/
-rw-rw-r-- 1 user group    516 12月  9 16:52 .gitignore
d--------- 0 user group   4096 12月  9 17:54 .idea/ ←これも！(PhpStormのopen時に作成された)
-rw-rw-r-- 1 user group   1067 12月  9 17:17 README.md
drwxrwxr-x 0 user group   4096 12月  9 16:52 e2e/
-rw-rw-r-- 1 user group    923 12月  9 16:52 karma.conf.js
drwxrwxr-x 0 user group   4096 12月  9 17:15 node_modules/
-rw-rw-r-- 1 user group 315610 12月  9 17:14 package-lock.json
-rw-rw-r-- 1 user group   1455 12月  9 17:15 package.json
-rw-rw-r-- 1 user group    722 12月  9 16:52 protractor.conf.js
drwxrwxr-x 0 user group   4096 12月  9 16:52 src/
-rw-rw-r-- 1 user group    363 12月  9 16:52 tsconfig.json
-rw-rw-r-- 1 user group   3040 12月  9 16:52 tslint.json
```

とりあえず、下記で暫定リカバリーできました(editしたものすべてにパーミッションをつけなおし)

```
sudo chmod 775 .idea/
sudo chmod 664 .idea/*
sudo chmod 664 .git/index
sudo chmod 664 .angular-cli.json
sudo chmod 664 src/index.html
sudo chmod 664 src/app/app.module.ts
sudo chmod 664 src/app/app.component.html
```

本日はここまで m(_ _)m