webpackでTypeScriptチュートリアル環境を構築
TypeScriptをwebpackと組み合わせて動かしてみたいので、webpack + TypeScriptの環境を構築する。
流れとしては、最初は純粋にTypeScriptコンパイラを使ってtsファイルをコンパイルして動作させる環境を作り、その後でwebpackを使った環境を作る。
TypeScriptコンパイラを使った環境構築
Node.jsをインストール
公式サイト からインストーラを入手。 もしくは、nodenvを使ってインストール。
$ nodenv version 12.18.3
yarnをインストール
$ brew install yarn $ yarn -v 1.17.3
TypeScriptをインストール
プロジェクトフォルダを作成して、TypeScriptをローカルインストール。
$ mkdir tutorial && cd tutorial $ yarn init -y $ yarn add typescript
以降はtutorialフォルダ下でコマンドを実行する。
TypeScript 動作確認
tsファイルを作成し、コンパイルして動かす。
$ vi index.ts
const message:string = 'Hello! TypeScript!'; console.log(message);
$ vi package.json
{
"name": "tutorial",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"scripts": {
"dev": "tsc" // 追加
},
"dependencies": {
"typescript": "^4.0.3"
}
}
$ yarn dev index.ts // コンパイル $ node index.ts // Hello! TypeScript!
webpackを使った環境構築
ビルドに必要なモジュールをインストール
$ yarn add -D webpack webpack-cli webpack-dev-server ts-loader --save-dev
TypeScriptコンパイラの設定ファイルを作成
設定ファイルを作成し、必要な設定を入れる。
$ ./node_modules/typescript/bin/tsc --init $ vi tsconfig.js
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
/* コンパイルに使用する組み込みライブラリを指定する。このオプションが設定されない場合は、targetの値に応じたデフォルトライブラリが使われる。 https://www.typescriptlang.org/docs/handbook/compiler-options.html */
// "lib": [],
/* ビルドファイルにコメントを含めない */
"removeComments": true,
/* コンパイルエラーがあれば、ビルドファイルを出力しない */
"noEmitOnError": true,
/* すべての厳密なタイプチェックオプションを有効にする。*/
"strict": true,
/* 未使用のローカル変数が存在する場合にエラーを発生させる */
"noUnusedLocals": true,
/* 未使用のパラメータが存在する場合にエラーを発生させる */
"noUnusedParameters": true,
/* 関数内のすべてのコードパスが値を返さない場合にエラーを発生させる */
"noImplicitReturns": true,
/* switch文のフォールスルーケースが存在する場合にエラーを発生させる。(フォールスルーケース:switch文のcase内でbreakが無い場合に、その下のcaseの処理も実行されること) */
"noFallthroughCasesInSwitch": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
},
"exclude": [
// デフォルトで node_modules/ は除外されるため、この設定はしなくてよい。挙動の説明のために書いているだけ。
"./node_modules"
],
"include": [
// ./src 配下のうち、excludeオプションに含まれるものを除いたtsファイルのみコンパイル
"./src/**/*"
]
}
webpackでビルドするための設定
$ vi webpack.config.js
const path = require('path');
module.exports = {
// モード値を production に設定すると最適化された状態で、
// development に設定するとソースマップ有効でJSファイルが出力される
mode: 'development', // "production" | "development" | "none"
// メインとなるJavaScriptファイル(エントリーポイント)
entry: './src/index.ts',
output: {
path: path.join(__dirname, "dist"),
filename: "index.js",
publicPath: "/dist"
},
module: {
rules: [{
// 拡張子 .ts の場合
test: /\.ts$/,
// TypeScript をコンパイルする
use: 'ts-loader'
}]
},
// import 文で .ts ファイルを解決するため
resolve: {
modules: [
"node_modules", // node_modules 内も対象とする
],
extensions: [
'.ts',
'.js' // node_modulesのライブラリ読み込みに必要
]
},
devServer: {
contentBase: './', // 公開するリソースのドキュメントルート
}
};
$ vi package.json
"scripts": {
"dev": "webpack-dev-server --config webpack.config.js", // 開発環境用ビルドコマンドを追加
"build": "webpack --config webpack.config.js --mode production" // 本番環境用ビルドコマンドを追加
},
実行ファイルを作成
$ vi ./src/index.ts
const message:string = 'Hello! TypeScript!'; console.log(message);
$ vi inde.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
Hello! TypeScript!
<script src="./dist/index.js"></script> // ビルドしたjsファイルを読み込み
</body>
</html>
ビルド・動作確認
開発環境用にビルド
$ yarn dev
webpack-dev-serverが動作しているアドレス http://localhost:8080/ にアクセス。すると、index.html の内容が表示されてコンソールにHello! TypeScript!が表示され、動作していることが確認できる。
また、webpack-dev-serverのホットリロードが有効になっているので、index.ts を編集するとブラウザが自動でリロードされる。
本番環境では、
$ yarn build
を実行し、ビルドファイル ./dist/index.js を作成することで、index.html に絶対パスでブラウザアクセスすると、同じように動作することが確認できる。