最近数カ月に一回程度の頻度で、TypeScript のライブラリを書く機会があるのですが、毎回初期のセットアップを忘れているので、 備忘録として残します。
※ フロントエンドは、ほぼ素人なので、もっと良い方法を知っている方がいましたら、是非教えてください。
開発環境の前提条件
- OS : Windows 11
- エディタ : Visual Studio Code
- その他 : WSL2 (Ubuntu)
VSCode Dev container でコンテナの環境を立ち上げる
ts で開発する際、Windows の環境を極力汚したくないので、VSCode の Dev container を使用します。
VSCode を開き、ctrl + shift + p
でコマンドパレットを開きます。
コマンドパレットで devcontainer
等と入れると、
Remote-Containers: Add Development Container Configuration Files...
が表示されるので、そちらを選択します。
コンテナの種別を聞かれるので、Node.js & TypeScript
を選択します。
お好みの Node.js のバージョンを選択
今回は、デフォルトの 16-bullseye
を選択します。
その他、入れたいツールを選択します。
今回は、特に何もいれませんでした。
これで、Dev container の設定ファイルが生成されます。
設定ファイルが生成されると、右下に、コンテナでフォルダを開きなおすか聞かれるので
Reopen in Container
を選択して、コンテナでフォルダを開きなおします。
VSCode が再起動すると、フォルダがコンテナ内で開かれている状態になります。
ctrl + shift + `
でターミナルを開きます。
これで、コンテナ内に初期の環境が立ち上がりました。
TypeScript をインストール
yarn add typescript --dev
yarn run tsc--init
これで、TypeScript のインストール + デフォルトの tsconfig.json の生成が出来ました。
tsconfig.json を設定する
こんな感じ
{ "compilerOptions": { "target": "ESNext", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ "strict": true, /* Enable all strict type-checking options. */ "skipLibCheck": true /* Skip type checking all .d.ts files. */ } }
jest のインストール
書いたコードを動かすのに色々するのも面倒なので、初めにテストフレームワークとして jest を入れます
yarn add jest ts-jest @types/jest --dev
jest の設定を追加する
依存関係は、
{ "devDependencies": { ~省略~ }, "browser": "dist/index.js", "scripts": { "build": "rollup -c", "test": "jest" }, "jest": { "moduleFileExtensions": [ "ts", "js" ], "transform": { "^.+\\.ts$": "ts-jest" }, "globals": { "ts-jest": { "tsConfig": "tsconfig.json" } }, "testMatch": [ "**/test/*.test.ts" ] }, "dependencies": { ~省略~ } }
jest を動かしてみる
サンプルコードを作る
src
というフォルダを作り、index.ts
を作成
function hello(text: string) { return `hello ${text}` } export { hello }
テストコードを作る
test
というフォルダを作り、hello.test.ts
を作成
import { hello } from '../src/index' describe('hello test', (): void => { test('text', (): void => { const response = hello('world') expect(response).toBe('hello world') }) })
コマンドラインで、yarn test
を実行
テストがパスしたら、設定完了です
rollup.js を導入する
色々入れるものがあるので、下のものを yarn でインストール
yarn add rollup rollup-plugin-terser @rollup/plugin-babel @rollup/plugin-commonjs @rollup/plugin-node-resolve @rollup/plugin-typescript tslib --dev
rollup.config.js を設定する
ルートフォルダに rollup.config.js
を作成します。
minify したものと、minify してないものを出力する設定になっています。
import pluginTypescript from "@rollup/plugin-typescript" import pluginNodeResolve from "@rollup/plugin-node-resolve" import { terser as pluginTerser, terser } from "rollup-plugin-terser" import pluginCommonjs from "@rollup/plugin-commonjs" import pkg from './package.json' export default { input: 'src/index.ts', output: [ { name: 'index.js', file: pkg.browser, format: 'iife', sourcemap: 'inline' }, { name: 'index.js', file: pkg.browser.replace('.js', '.min.js'), format: 'iife', plugins: [ terser() ] } ], plugins: [ pluginTypescript(), pluginCommonjs({ extensions: [ ".js", ".ts" ] }), pluginNodeResolve({ browser: true }) ] }
ビルドしてみる
yarn build
でビルドされます。
dist
フォルダに、index.js
と index.min.js
が出力されたら成功です。
まとめ
IDE とかでさっくり作れればいいのですが、中々そういうわけにもいかず悩ましい所ですね。
IE11 が退役したので、小規模なプロジェクトならもう babel やらは不要かなということで 今回 babel は、入れていません。