🐥
JavaScriptアプリケーションプロジェクトの作り方(基礎編): 2020年10月版
2020年のフロントエンド開発で最低限求められるであろう条件を満たすようなJavaScriptアプリケーションプロジェクトを作る方法を、出来る限り一次情報と合わせてまとめました。
求められる条件
- ソースコードをTypeScriptで書けること
-
src/...
にソースコードを置く -
yarn dev
でメインエントリーポイントを実行 -
yarn watch
でホットリロード
-
- node.js v12でアプリケーションを実行できること
-
yarn build
でTypeScriptからJavaScript(node.js v12が対象)へトランスパイル - ビルド結果は
out/...
に置かれる
-
- Prettierでフォーマットできること
-
yarn prettier:fix
でコードフォーマットを実行
-
- ESLintを実行できること
-
yarn eslint:fix
でLintを実行
-
- ユニットテストコードをTypeScriptで書けて、Jestで実行できること
-
__tests__/...
にテストコードを書く -
yarn test
でユニットテストを実行
-
最終結果だけ見たい方はこちらをご覧ください: https://github.com/kn3ny/js-app-boilerplate/tree/basic
どうやって環境を組み立てるか興味のある方に向けて、以下にまとめました。
事前準備
これらの手順はこの記事では省略します。
プロジェクトのディレクトリ構成はこのようにします。
js-app-boilerplate
├── __tests__ // テストコード
├── coverage // テストコードのカバレッジ
├── out // トランスパイル結果
└── src // ソースコード
以下、全てのコマンドはプロジェクトのディレクトリのルートで行うものとします。
ソースコードをTypeScriptで書けるようにする
package.json
を作成 [1]
yarn init -yp
[2]
TypeScriptを導入yarn add -D typescript
ts-node
と@types/node
をこのタイミングで入れておきます。こちらについては一次情報が見つからなかったので、普段私がやっているやり方です。
yarn add -D ts-node @types/node
[3]
TypeScriptの初期設定node.js v12用のtsconfigをインストールします。
yarn add -D @tsconfig/node12
その後、tsconfig.json
を配置します。
tsconfig.json
{
"extends": "@tsconfig/node12/tsconfig.json",
}
Hello Worldを作成
src/app.ts
export class App {
greeting(): string {
return "Hello world!";
}
}
src/index.ts
import { App } from "./app";
const main = () => {
console.log(new App().greeting());
};
main();
yarn dev
でHello Worldを実行できるようにする [4]
package.json に追加する部分
+ "scripts": {
+ "dev": "ts-node ./src/index.ts"
+ }
yarn watch
でホットリロードできるようにする [5]
yarn add -D ts-node-dev
package.jsonに追加する部分
"scripts": {
+ "watch": "ts-node-dev --respawn --transpile-only ./src/index.ts"
node.js v12でアプリケーションを実行できるようにする
./out
に出力するようにtsconfigの設定を修正 [6]
トランスパイルの結果をtsconfig.jsonに追加する部分
+ "compilerOptions": {
+ "outDir": "./out"
+ }
yarn build
でトランスパイル出来るようにする [7]
package.jsonに追加する部分
"scripts": {
+ "build": "tsc"
トランスパイル後は以下でアプリケーションを実行できます。
node ./out/index.js
Prettierでフォーマットできるようにする
[8]
Prettierを導入yarn add -D prettier
[8:1][9]
Prettierの初期設定.prettierignore
out
coverage
.prettierrc.js
module.exports = {};
Prettier CLI will ignore files located in node_modules directory.
とあるように、node_modules
は自動で除外される[10]ので、.prettierignore
に書かなくても大丈夫です。
yarn prettier:fix
でフォーマットできるようにする [8:2]
package.jsonに追加する部分
"scripts": {
+ "prettier:fix": "prettier --write ."
ESLintを実行できるようにする
[11]
ESLintを導入yarn add -D eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin
PrettierとESLintを組み合わせるため以下も導入します。
yarn add -D eslint-config-prettier
[11:1][12]
ESLintの初期設定.eslintignore
node_modules
out
coverage
.eslintrc.js
module.exports = {
root: true,
parser: "@typescript-eslint/parser",
plugins: ["@typescript-eslint"],
extends: [
"eslint:recommended",
"plugin:@typescript-eslint/recommended",
// Prettierと組み合わせるため
"prettier",
// Prettierと組み合わせるため
"prettier/@typescript-eslint",
],
// node.js v12をターゲットにしたソースコードを対象にするため
parserOptions: {
ecmaVersion: 2019,
},
// node.jsをターゲットにしたソースコードを対象にするため
env: {
node: true,
},
};
yarn eslint:fix
でESLintを実行できるようにする [11:2]
package.json
"scripts": {
+ "eslint:fix": "eslint . --ext .js,.jsx,.ts,.tsx --fix"
yarn fix
でPrettierとESLintを実行できるようにする
2つのタスクを実行できるようにnpm-run-allを導入します。こちらについては一次情報が見つからなかったので、普段私がやっているやり方です。
yarn add -D npm-run-all
package.jsonに追加する部分
"scripts": {
+ "fix": "run-s prettier:fix eslint:fix"
ユニットテストコードをTypeScriptで書けて、Jestで実行できるようにする
[13]
Jestとts-jestを導入yarn add -D jest ts-jest @types/jest
[13:1]
Jestの初期設定yarn ts-jest config:init
Hello Worldのテスト
__tests__/app.test.ts
import { App } from "../src/app";
describe("App", () => {
test("greeting()", () => {
expect(new App().greeting()).toStrictEqual("Hello world");
});
});
yarn test
でユニットテストを実行できるようする [14]
package.jsonに追加する部分
"scripts": {
+ "test": "jest --coverage"
To be continued...
需要と時間があれば、この続きで以下を書くかもしれません。
- Webブラウザをターゲットにしたビルド編 (Webpack + Babel)
- Production-readyなHTTP API編 (Fastify, Observability)
- Universal App編 (next.js / nuxt.js)
- Dockerイメージ作成編 (Multi-stage build)
- CI/CD編
- Storybook編
- E2Eテスト編 (Codeceptjs + Puppeteer)
一次情報を元にした誰でも再現可能なドキュメントが世の中に増えると良いなと思います。
Discussion