Chapter 02無料公開

各章のベースとなるプロジェクト作成

榊原昌彦
榊原昌彦
2021.09.24に更新

プロジェクト作成

本書では、全ての章をひとつのプロジェクトで実装します。blankテンプレートをトップにして、それぞれの章はPUSH遷移先のページをつくり、そこで実装する形で進めていきます。

では、プロジェクトをつくりましょう。ここでは、 ionic-pro というプロジェクト名として作成します。テンプレートは blank を選択してください。

% ionic start ionic-pro --type=angular

? Starter template: (Use arrow keys)
  tabs         | A starting project with a simple tabbed interface
  sidemenu     | A starting project with a side menu with navigation in the content area
❯ blank        | A blank starter project
  list         | A starting project with a list

また、Capacitorも最初からインストールしておきます。

? Integrate your new app with Capacitor to target native iOS and Android? (y/N) Y

開発環境の設定

このままでもいいのですが、開発を進めるにあたって少し設定まわりを行いましょう。

prettier で自動フォーマッタのある開発

ファイルの自動整形フォーマッタ prettier なしで手動で行うと開発効率が落ちるので、設定しましょう。 huskylint-staged と組み合わせて、コミット時に自動的にフォーマットするようにします。

% cd ionic-pro
% npm i husky lint-staged pre-commit prettier --save-dev

続いて、 package.json に以下を追記します。書き方がわからない人は GitHub上のコード をご参考ください。

+ "lint-staged": {
+   "*.ts": [
+     "prettier --parser typescript --write",
+     "git add"
+   ],
+   "*.html": [
+     "prettier --parser angular --write",
+     "git add"
+   ]
+ },
+ "husky": {
+   "hooks": {
+     "pre-commit": "lint-staged"
+   }
+ }

また手動でも prettier を使えるようにしましょう。npmスクリプトに以下を追加します。

  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
-   "e2e": "ng e2e"
+   "e2e": "ng e2e",
+   "fmt": "prettier --parser typescript --write \"./src/**/*.ts\" &&  prettier --parser angular --write \"./src/**/*.html\""
  },

これで自動整形できるようになりました。では、一度実行してみて、ファイルの差異をみてみましょう。

% npm run fmt

本書ではSourceTreeを利用していますが、各々それぞれのGitクライアントを利用ください。

このように差異がでています。ただ、少し一行あたりの文字数の制限が厳しかったりしますので、好みの設定がある人は prettier.config.js を追加してカスタマイズしてください。ちなみに私が現在利用している設定は以下の通りです。

module.exports = {
  /**
   * 1行80文字は狭すぎるので120文字に拡張
   */
  printWidth: 120,
  
  /**
   * TypeScriptはシングルクォーテーション(')に統一
   */
  singleQuote: true,
  
  /**
   * 末尾のカンマはすべてにいれるように
   */
  trailingComma: 'all',
  
  /**
   * アロー関数の単一パラメーターは常にカッコ書きに
   */
  arrowParens: 'always',
};

再度 npm run fmt をいれると、カスタマイズされたルールに沿って整形が行われます。

npmスクリプトでコマンドをショートカット

毎回、個別コマンドでプロジェクトをビルドしてCapacitor CLIコマンドを使うと面倒なのです。ビルドする度に以下を入力するのはちょっと・・・。

% ng build --configuration=production
% npx cap copy

ですので、これもnpmスクリプトにいれるようにします。 npm run cap で、ビルドとコピーを同時に行うようにします。

  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e",
-   "fmt": "prettier --parser typescript --write \"./src/**/*.ts\" &&  prettier --parser angular --write \"./src/**/*.html\""
+   "fmt": "prettier --parser typescript --write \"./src/**/*.ts\" &&  prettier --parser angular --write \"./src/**/*.html\"",
+   "cap": "ng build --configuration=production && cap copy"

Capacitorプラグインを追加したあとに実行する cap update を忘れがちな人は、 cap copy ではなく、copyとupdateを同時に実行する cap sync にするのもいいと思います。

これで、 npm run cap を行えるようになりました。

ブラウザのサポートを決める

Angularでは、AutoprefixerでCSSにどのベンダープレフィックスを付けるかなどを決めるbrowserslistの機能があります。初期設定は npx browserslist でみることができます。

% npx browserslist

これをみると、EdgeやFirefoxなど幅広い対応をしていることがわかります。しかしIonicプロジェクトで、特にCapacitorでビルドしてネイティブアプリとして提供する場合はここまで広いサポートは必要ありません。そこで、デフォルトの .browserslistrc.browserslistrc_default としてコピーして、元ファイルは以下のように編集してしまいましょう(他の記述はすべて削除)

last 8 iOS versions
last 8 ChromeAndroid versions

これで以下のもののみのサポートとなりました。

and_chr 93
ios_saf 14.5-14.7
ios_saf 14.0-14.4
ios_saf 13.4-13.7
ios_saf 13.3
ios_saf 13.2
ios_saf 13.0-13.1
ios_saf 12.2-12.4
ios_saf 12.0-12.1

時代的にios_safariはもうちょっと切って、 last 5 とかにしてもいいかもしれませんね。Web向けに幅広いサポートで別ビルドする場合は、以下のスクリプトをCIで実行するようにしましょう。 npmスクリプトにいれて実行することもできます。
.browserslistrc_default.browserslistrc を上書きします。

mv -f .browserslistrc_default .browserslistrc

iOS12に対応する場合

上記のbrowserlistsでは、 ios_saf12が対象となっています。しかし、これに対応するためには、Angularにpolyfillsを入れて、 grobal-this を使えるようにする必要があります。もしサポートする場合は以下を行います。

% npm i @ungap/global-this

続いて、 src/polyfills.ts にインポートください。

  /***************************************************************************************************
   * APPLICATION IMPORTS
   */
+ import '@ungap/global-this';

これを行わないと、iOS12で ReferenceError: Can't find variable: globalThis とエラーがでるので注意ください。

これで各章のベースとなるプロジェクトが完成しました。