経緯 & 概要
- 私はフロントエンド苦手マン(だった)
- TypeScriptを勉強したものの、マスターしてなかったので、使えるようになるために、簡単な1プロダクトを作ってみた
- TypeScript, Jest, Webpack, Yarn, GithubPages あたりを使った
- 完全にTypeScript的なプロダクトになったし、Jestのカバー率100%になったので満足
- とても ChatGPT-4 に頼った
- この記事の続編で、 Github Actions による CI (& CD?) と、難読化もしたい
- 将来的にはReact的なフレームワークも使ってみたことがある状態になりたい (扱える技術の範囲を広げるために)
勉強の経緯
- 2023年12月初めに子供が生まれた
- 生まれる7時間前にChatGPT-4 (当時のAdvancedDataAnalysis)に萌えイラストの特徴点を出させるプログラムを書かせる記事を書き上げた
- その後1ヶ月勉強休み
- 2024年1月頭から勉強再開 (今回の記事)
- 1日20分の勉強なら生後1ヶ月から再開できる
- さらに、生後2ヶ月からもっと余裕出る (1日1.5時間くらいは捻出できる)
技術選定
- JS は GithubPagesなどの無料のホスティングサービスが色々とあってお得
- もちろん、フロントエンド力を増強するのがメインの目的
(↓ごちゃごちゃ↓)
開発中の一コマ
Jest
- yarn test とコマンドを打ち込んだら、jestが実行されて、テストがされるようにした
- jest は jest コマンドのあとに テストファイルのいち部分を入れるとそれにマッチするテストファイルだけを実行するのだった
- なので、 yarn test top みたいに打つ
- 3つの .ts のファイルのカバレッジ100% (テストケース15強くらい?)で 20秒くらいJestのテスト実行にかかる
- jestはデフォルトで、↓のパターンのファイル名のファイルをテストファイルとみなして実行する
私はTypeScript のプロジェクトを作っています。 私は yarn test とコマンドをうつと、jestが実行されて、リポジトリのルートにある example.test.ts の内容がテストされます。 どこにあるテストファイルを実行するように、どの設定ファイルで設定しているか分かりますか?それとも、レポジトリの下にある *.test.ts ファイルがデフォルトで実行されるのですか? ー chatgpt-4 2024/02/19 23:10 `jest`を使用する場合、どのテストファイルが実行されるかは`jest`の設定によって決定されます。`jest`の設定は複数の方法で行うことができますが、一般的には以下のいずれかの場所に設定が記述されています: 1. `package.json`ファイル内の`jest`フィールド。 2. プロジェクトのルートにある`jest.config.js`または`jest.config.ts`ファイル。 3. 任意の名前の設定ファイルで、コマンドラインオプション`--config`を使って指定される場合。 `jest`のデフォルトの挙動としては、プロジェクトのルートから`__tests__`フォルダ内のファイル、またはファイル名が`.spec.`または`.test.`を含むファイル(例:`*.spec.ts`, `*.test.ts`)を自動的にテストファイルとして認識し、実行します。この挙動は設定を通じてカスタマイズ可能です。 たとえば、`jest.config.js`ファイルで`testMatch`プロパティを設定することにより、どのファイルをテストとして実行するかを細かく指定できます。module.exports = { testMatch: ['**/__tests__/**/*.js', '**/?(*.)+(spec|test).js'] };この設定例では、`__tests__`フォルダ内の`.js`ファイルと、ファイル名に`.spec.`または`.test.`を含む`.js`ファイルがテストとして実行されます。 `yarn test`というコマンドを実行したときに具体的にどのテストファイルが実行されるかは、プロジェクトの`package.json`に定義されている`scripts`セクションの`test`コマンドの定義、および`jest`の設定ファイルに依存します。プロジェクトの設定を確認して、どのようにテストファイルが指定されているかを見ることをお勧めします。
yarn とは
- Yarn は誰が作った?
- Yarn はいつ作られた?
- Yarn は npm に比べてどのような点が改良された?
(ChatGPT-4) Yarnは、Facebook、Exponent、Google、Tildeといったコミュニティのメンバーによって作成されたJavaScriptのパッケージマネージャーです。これはnpmの代替として開発され、より高速なパッケージインストール、より堅牢な依存関係管理、オフラインモードなどの機能を提供することを目指しています。Yarnの最初のリリースは2016年に行われました。
- なぜ彼らはnpmでは満足しなかった?
彼らがnpmに代わるものとしてYarnを開発した主な理由は、当時のnpmのパフォーマンスとセキュリティの問題、そして依存関係の管理に関連する問題に対する解決策を提供するためでした。具体的には、以下のような問題がありました。 1. **パフォーマンス**: npmは特に大規模なプロジェクトにおいて、依存関係のインストールが遅いという問題がありました。Yarnはキャッシュシステムを用いて既にダウンロードしたパッケージを再利用し、パラレルにパッケージをダウンロードすることで、パフォーマンスを大幅に向上させました。 2. **セキュリティ**: npmの旧バージョンでは、インストールプロセス中に実行されるスクリプトによってセキュリティが脅かされる可能性がありました。Yarnはより厳格なセキュリティチェックを導入し、パッケージの整合性を保証するためにチェックサムを利用しました。 3. **依存関係の管理**: npmでは`package.json`ファイルに記述された依存関係が一貫性がなく、異なる環境で異なるバージョンのパッケージがインストールされる場合がありました。Yarnは`yarn.lock`ファイルを導入して依存関係を正確にロックダウンし、開発者間や異なる環境間での一貫性を確保しました。 これらの改善により、Yarnは開発者コミュニティの間で迅速に採用され、多くのプロジェクトでnpmの代わりとして利用されるようになりました。
- Yarn の名前の由来を教えてください。
Yarn(ヤーン)という名前は、「糸」や「綱」を意味する英語から来ています。この名前は、JavaScriptのパッケージ(依存関係)を結びつけるというYarnの役割を象徴しています。つまり、プロジェクトに必要な様々なライブラリやフレームワーク(糸)を統合して、開発者が使用できるように「織り上げる」ツールであることを意味しています。この比喩は、プログラミングの世界での依存関係の管理を織物の製造になぞらえたもので、コードの「織物」を作り上げるために必要な「糸」を提供するというYarnのコンセプトを視覚的に表しています。
ChatGPT
TypeScript
- 数ファイルしかないけど、 yarn build に30秒かかることも
yarn buildで何をしているか
- package.json の scripts に "build": "webpack",
- webpack.config.js をみる
module: { rules: [ { test: /\.ts$/, use: 'ts-loader', exclude: /node_modules/, }, ], }, resolve: { extensions: ['.ts', '.js'], },
- webpackは、ts-loader で .ts ファイルを処理して、 bundle.js に合体させているんだね。さらに、
resolve: { extensions: ['.ts', '.js'], }, の意味は何ですか? ー この設定は、主にWebpackなどのモジュールバンドラーの設定ファイル内で見られるもので、モジュール解決の挙動をカスタマイズするために使用されます。具体的には、`resolve.extensions`は、モジュールを解決する際にWebpackが自動的に試みるファイルの拡張子の配列を指定します。この設定があることで、開発者はインポート時にファイルの拡張子を省略できます。 例えば、`resolve: { extensions: ['.ts', '.js'] }`という設定がある場合、`.ts`または`.js`拡張子を持つファイルをインポートするときに拡張子を指定する必要がありません。Webpackは自動的に与えられたパスで`.ts`ファイルを最初に探し、見つからない場合は`.js`ファイルを探します。import MyModule from './MyModule';上記の例で、Webpackはまず`MyModule.ts`を探し、存在しない場合は`MyModule.js`を探します。これにより、TypeScriptとJavaScriptファイルが混在するプロジェクトでも、ファイルのインポートが簡単になり、開発プロセスがスムーズに進むようになります。
webpack.config.js の entry って何? w Webpackの設定ファイルである`webpack.config.js`の`entry`プロパティは、Webpackがバンドルプロセスを開始する際のエントリーポイント(入口)を指定するために使用されます。エントリーポイントは、Webpackが依存関係のグラフを作成するために解析を開始するJavaScriptファイル、またはファイルの集合です。この設定は、アプリケーションがどのファイルから実行を開始するか、または複数のエントリーポイントがある場合にはそれらのファイルをWebpackに知らせるために重要です。 エントリーポイントは単一のファイルであることも、複数のファイルで構成されることもあります。設定方法は、プロジェクトの要件によって異なります。 ### 単一エントリーポイントの例module.exports = { entry: './path/to/my/entry/file.js' };この例では、`entry`プロパティに文字列を設定しており、Webpackは指定されたパスのファイルから依存関係の解析を開始します。 ### 複数エントリーポイントの例module.exports = { entry: { app: './path/to/my/app/entry.js', admin: './path/to/my/admin/entry.js' } };この例では、`entry`プロパティにオブジェクトを設定し、複数のエントリーポイントを定義しています。この設定により、Webpackはそれぞれのエントリーポイントから独立した依存関係グラフを作成し、結果として複数のバンドルを生成します。このアプローチは、例えば一つのアプリケーションでユーザー向けのフロントエンドと管理者向けのダッシュボードを分けて管理したい場合などに有用です。 ー entryで指定したファイルから参照されてないファイルは、プロジェクトフォルダの中にあっても、bundle.js に含まれないのですね。 ー はい、その通りです。Webpackの`entry`設定は、Webpackがビルドプロセスを開始する際のエントリーポイント、つまりモジュール依存関係グラフの根となるファイルやファイル群を指定するものです。このエントリーポイントから静的にインポートされているファイル(モジュール)のみが、Webpackによって解析され、最終的なバンドル(例えば`bundle.js`)に含まれます。 そのため、`entry`で指定したファイルから直接的または間接的に参照されていないファイルは、Webpackによるビルドプロセスの中で考慮されず、結果として生成されるバンドルには含まれません。これは、不必要なコードをバンドルに含めないことで、ファイルサイズを最小限に抑え、ロード時間を短縮することを目的としています。 例えば、プロジェクト内にあるがどのエントリーポイントからも参照されていないユーティリティファイルやコンポーネントは、ビルドされたバンドルファイルには含まれません。このようにWebpackは、エントリーポイントからの依存関係のみを追跡し、それに基づいてファイルをバンドルにまとめます。 ー
github pages について
- 最初は、 yarn deploy が 5秒くらいで終わった (本当に初回だけかも)が、ほんの少し複雑になっただけで yarn deploy に 80秒とかかかり、さらに、キャッシュが飛ぶまでに30秒待つ必要が出てきた (← deploy 80秒は node_modules/ までアップしているからだった)
- 無料ですごい
Github Pages を無料で公開できる条件は? ー (ChatGPT-4) GitHub Pagesを無料で公開するための条件は、主に以下の通りです。 1. **パブリックリポジトリ**: GitHub Pagesは、パブリックリポジトリであれば無料で利用できます。プライベートリポジトリもGitHubの有料プランを利用している場合に限り、GitHub Pagesを無料で使用できます。 2. **使用制限の遵守**: GitHub Pagesは静的サイトのホスティングに限定されており、サーバーサイドのコードの実行(PHP, Ruby, Pythonなど)はサポートしていません。また、ソフトウェアのドキュメンテーションや個人のブログ、プロジェクトのランディングページなど、非営利目的での使用が前提となっています。 3. **バンド幅と使用量**: GitHub Pagesのサイトは、公正な使用を確保するための使用量とバンド幅の制限があります。たとえば、サイトのトラフィックが月に100GBを超えたり、サイトのストレージが1GBを超える場合、GitHubから警告を受ける可能性があります。 4. **コンテンツの制限**: GitHub Pages上でホストできるコンテンツは、GitHubの利用規約とGitHub Pagesのガイドラインに準拠している必要があります。違法なコンテンツ、成人向けコンテンツ、暴力的または差別的なコンテンツのホスティングは許可されていません。 これらの条件を満たしていれば、個人やプロジェクトでGitHub Pagesを利用してウェブサイトを無料で公開することができます。GitHub Pagesは、簡単にウェブサイトを立ち上げたい開発者にとって便利なオプションです。 -- (Copilot: バランス = GPT-3) (正しく意図が伝わっていない) GitHub Pagesは、静的ウェブサイトを無料で公開するための便利なサービスです。以下は、GitHub Pagesを使ってウェブサイトを公開する手順と条件です。 1. **GitHubアカウントの作成**: - GitHubのアカウントを作成してください。無料アカウントで問題ありません。 2. **リポジトリの作成**: - リポジトリは、ウェブページのソースコードをまとめて置く場所です。 - GitHubのウェブサイトで右上の「+」ボタンをクリックし、「New repository」を選択します。 - リポジトリ名を指定し、Publicに設定します。このリポジトリ名が実際の公開URLの一部になります(例:`https://[アカウント名].github.io/[リポジトリ名]/`)。 3. **ファイルのアップロード**: - HTML、CSS、JavaScript、画像ファイルをアップロードします。 - index.htmlなどのファイルをアップロードすることで、ウェブサイトの基本構造を作成できます。 4. **公開設定**: - リポジトリのページで「Settings」をクリックし、「Pages」を選択します。 - 「main」ブランチを選択して保存します。 - しばらくすると公開されているページにアクセスできます。 以上の手順を実行することで、GitHub Pagesを使って無料でウェブサイトを公開できます。詳細は参考文献¹²³をご覧ください。🌐. ソース: Bing との会話 2024/3/19 (1) GitHub Pagesを使って無料でWebサイトを公開する方法 - Qiita. https://qiita.com/katsu-17/items/889bbf00d00cab959623. (2) GitHubPagesを使ってサイト公開をしよう #GitHub - Qiita. https://qiita.com/kar_iari4_4/items/0bbb2242d34175cc49f0. (3) 【webサイトを無料で公開できる】GitHub Pagesの使い方について. https://qiita.com/koh_ru/items/cdc251f8e3e1d6d94159. (4) 【最新版】GitHub PagesでWebサイトを無料で公開しよう(初学 .... https://blog.proglus.jp/5299/. (5) Getty. https://media.gettyimages.com/id/1211647318/photo/in-this-photo-illustration-a-github-logo-seen-displayed-on-a-smartphone.jpg?b=1&s=612x612&w=0&k=20&c=CojaA04sHzRcmXKYfY4X-GBg6u4yK7Fhx0KlECYnHtY=. (Copilot: 創造的に = GPT-4 turbo) これも バランスと同じような回答だった 厳密にも同じ
そもそも yarn deploy で何をしているのか
- "deploy": "gh-pages -d .",
gh-pages -d . コマンドの意味を教えてください。 ー `gh-pages -d .` コマンドは、`gh-pages`というnpmパッケージを使用して、現在のディレクトリ(`.`が現在のディレクトリを表す)の内容をGitHub Pagesにデプロイするためのものです。`gh-pages`パッケージは、特定のフォルダの内容をGitHubのリポジトリの`gh-pages`ブランチに簡単にプッシュし、その内容をGitHub Pagesで公開することを目的としたコマンドラインツールです。 ここで、`-d`オプションはディレクトリを指定するためのもので、このオプションに続くパスがGitHub Pagesにデプロイされる内容を含むディレクトリを指します。コマンド`gh-pages -d .`は、文字通り「現在のディレクトリの内容をGitHub Pagesにデプロイする」という意味になります。 このコマンドを実行すると、`gh-pages`は以下の手順を自動的に行います: 1. 現在のディレクトリ(`.`で指定されたディレクトリ)の内容を一時的な場所にコピーします。 2. `gh-pages`ブランチが存在しない場合は、新しく作成します。 3. `gh-pages`ブランチにコピーした内容をプッシュします。 4. GitHub Pagesはこの`gh-pages`ブランチの内容をもとにウェブサイトを公開します。 このプロセスにより、簡単なコマンド一つでウェブサイトのコンテンツをGitHub Pagesにデプロイできるため、ウェブサイトの更新が非常に簡単になります。GitHub Pagesは静的ファイル(HTML、CSS、JavaScriptなど)のホスティングに適しており、個人のプロジェクト、ドキュメント、ブログなどに広く利用されています。 w 私のカレントディレクトリの下には、 node_modules/ ディレクトリもあるのですが、このディレクトリを除外して github pages にデプロイしたいです。 ー `gh-pages -d .` コマンドを使用してGitHub Pagesにデプロイする際に、`node_modules/` ディレクトリなど特定のファイルやディレクトリを除外したい場合、直接的に`gh-pages`コマンドで除外するオプションはありません。しかし、いくつかの方法でこの問題を解決できます。 1. **ビルドディレクトリをデプロイする:** 多くのフロントエンドプロジェクトでは、ソースコードをビルド(コンパイルと最適化)してからデプロイします。このビルドプロセスでは、通常`build/`や`dist/`ディレクトリに最終的な静的ファイルが生成されます。この方法を使えば、`node_modules/` ディレクトリは含まれないため、`gh-pages -d build`(または`gh-pages -d dist`)のようにビルドディレクトリを指定してデプロイします。 2. **`.gitignore`を利用する:** `gh-pages`はデフォルトで`.gitignore`に記載されているファイルやディレクトリを無視します。しかし、この方法は`gh-pages -d .` を使ってカレントディレクトリ全体をデプロイしたい場合には適していません。 3. **一時的な作業ディレクトリを使用する:** カレントディレクトリの内容を一時的なディレクトリにコピーし、その際に`node_modules/`を除外します。その後、一時的なディレクトリからGitHub Pagesにデプロイします。このステップは手動で行う必要がありますが、カスタマイズ性が高くなります。 一般的には、最初の方法が最も簡単で一般的です。プロジェクトのビルドプロセスを使用して、公開するためのファイルを準備し、そのビルドされたアウトプットをデプロイすることで、`node_modules/` ディレクトリやその他の開発にのみ必要なファイルを自動的に除外できます。
ここで node_modules も github pages にアップしてるから 80秒もかかるようだね
gh-pages -d . コマンドを打つと、どのgithubアカウントやレポジトリのページとして公開されるかをどこで設定するのですか? -- `gh-pages -d .` コマンドを使用してGitHub Pagesにデプロイする際、どのGitHubアカウントやリポジトリに公開されるかは、そのコマンドを実行するGitリポジトリの設定に基づきます。具体的には、リポジトリのリモートURL(`origin`)がどのGitHubリポジトリを指しているかによって決定されます。この設定はGitのリモート設定に保存されています。 リモートURLを確認または設定するには、次のGitコマンドを使用します: - 現在設定されているリモートリポジトリのURLを表示するには: ``` git remote -v ``` このコマンドは、リモートの名前(通常は`origin`)とそのURLを表示します。GitHubリポジトリのURLは通常、`https://github.com/ユーザー名/リポジトリ名.git` または `git@github.com:ユーザー名/リポジトリ名.git`(SSH形式)の形式です。 - 新しいリモートリポジトリを追加するには: ``` git remote add origin リポジトリのURL ``` ここで、`リポジトリのURL`はGitHubリポジトリのURLです。 - リモートリポジトリのURLを変更するには: ``` git remote set-url origin 新しいリポジトリのURL ``` `gh-pages`コマンドは、これらのリモート設定を使用してGitHubにアクセスし、`gh-pages`ブランチを該当するリポジトリにプッシュします。そのため、`gh-pages -d .` コマンドを実行する前に、適切なGitHubリポジトリが`origin`リモートとして設定されていることを確認してください。 また、`gh-pages`コマンドを実行するためには、該当するGitHubリポジトリに対する書き込み権限が必要です。GitHubアカウントの認証は、通常、Gitの認証設定やSSHキーを通じて行われます。
- 意外にも git リポジトリの設定だった ( .git 以下の設定だと思っていた)
VSCodeからの拡張機能の提案 (Rainbow CSV)
Do you want to install the recommended 'Rainbow CSV' extension from mechatroner for test.csv?
クラウド版 VSCode
- クラウド版もあるらしい
Github Copilot Chat
- ヤフーリアルタイム検索で 24/2/14頃に評判をチェックしたが、ChatGPT-4と大差なさそうだった 2024/03/20 23:25
- 勝手にコードを読んで、ここがあかんとか足りてないテストを追加してくれるといいんだけど
ホスティングサービス選定
私は、TypeScriptを使ったJSで何々をするHTMLをユーザに無料で(サーバー費用無しで)提供したいです。どのプラットフォームがいいですか?(少し昔だとherokuが候補だったのだと思います) - [bing] プログラム関係はあかんね こんにちは、これはBingです。?? TypeScriptを使ったJSで何々するHTMLを無料で提供したいということですね。その場合、いくつかのプラットフォームが候補になりますが、以下のような特徴を持つものがおすすめです。 - TypeScriptをサポートしている - ブラウザ上でコードを実行できる - サーバーレスで動作する - 無料で利用できる 例えば、[Moyuk](^3^)というサービスは、TypeScriptで書いた関数をブラウザ上で実行できるWebアプリに変換するプラットフォームです3。サーバーレスで動作するので、サーバー費用はかかりません。また、無料プランでは月に1000回までコードを実行できます3。このようなサービスを利用すれば、TypeScriptでユーザが入力した文章の単語を置換するHTMLを簡単に作成・提供できると思います。 もちろん、他にもTypeScriptを使えるプラットフォームはありますので、ご自身のニーズに合わせて選択してください。TypeScriptのreplaceメソッドの使い方については、[こちら](^2^)や[こちら](^1^)などの記事が参考になると思います。 私は、TypeScriptのコードを生成することもできますが、今回はユーザのご要望に沿ってプラットフォームの紹介にとどめました。もし、私にコードを生成してほしい場合は、具体的な要件をお伝えください。私はできる限りお手伝いします。??. ソース: Bing との会話 2024/1/1 (1) ブラウザ上でTypeScriptでツールを作成・実行できるサービス .... https://zenn.dev/kohii/articles/6481587ffbfa4d. (2) ブラウザ上でTypeScriptでツールを作成・実行できるサービス .... https://zenn.dev/kohii/articles/6481587ffbfa4d. (3) 【JavaScript】replace()メソッドの使い方と応用【文字列を置換 .... https://qiita.com/k1mu0419/items/94efcb7d702b51eab2b4. (4) 【JavaScript入門】replaceの文字列置換・正規表現の使い方 .... https://www.sejuku.net/blog/21107. (5) ja.wikipedia.org. https://ja.wikipedia.org/wiki/TypeScript. 違います。私は、JSを使ったWebページをコストなしでユーザに提供したいのです。 すみません、私はTypeScriptを使ったということに注目してしまいました。?? JSを使ったWebページをコストなしでユーザに提供したいということですね。その場合、いくつかの方法がありますが、以下のような特徴を持つものがおすすめです。 - JSのコードをブラウザ上で実行できる - サーバーレスで動作する - 無料で利用できる 例えば、[Moyuk](^3^)というサービスは、先ほど紹介したTypeScriptだけでなく、JSでも使えるプラットフォームです3。JSで書いた関数をブラウザ上で実行できるWebアプリに変換することができます3。サーバーレスで動作するので、サーバー費用はかかりません。また、無料プランでは月に1000回までコードを実行できます3。このようなサービスを利用すれば、JSでユーザが入力した文章の単語を置換するHTMLを簡単に作成・提供できると思います。 もちろん、他にもJSを使えるプラットフォームはありますので、ご自身のニーズに合わせて選択してください。JSのreplaceメソッドの使い方については、[こちら](^2^)や[こちら](^1^)などの記事が参考になると思います。 私は、JSのコードを生成することもできますが、今回はユーザのご要望に沿ってプラットフォームの紹介にとどめました。もし、私にコードを生成してほしい場合は、具体的な要件をお伝えください。私はできる限りお手伝いします。?? ソース: Bing との会話 2024/1/1 (1) 1分で完成するNode.jsを使ったWebページの雛形 #Node.js - Qiita. https://qiita.com/hikarut/items/454fa2d434a920a55bac. (2) 1分で完成するNode.jsを使ったWebページの雛形 #Node.js - Qiita. https://qiita.com/hikarut/items/454fa2d434a920a55bac. (3) JavaScriptの書き方入門 - はじめてのWebデザイン【図解たっぷり .... https://skillhub.jp/blogs/259. (4) 【今更聞けない】HTML/CSS/JavaScript でWebページをつくろう. https://qiita.com/njn0te/items/444d29785ef11870301d. (5) JavaScriptで実現!ホームページに多彩な機能を追加する作り方 .... https://www.sejuku.net/blog/97588. (6) undefined. https://qiita.com/tbpgr/items/989c6badefff69377da7. (7) undefined. https://github.com/hikarut/NodeWebSkeleton.git. ----- [chatgpt-4] (プログラミング関係は完璧) TypeScriptとJavaScriptを使用して何々するHTMLアプリケーションを無料で提供する場合、サーバー費用を抑えるためにいくつかのプラットフォームを検討することができます。以下は、そのようなアプリケーションに適したプラットフォームの例です: 1. **GitHub Pages**: GitHubは静的なウェブサイトを無料でホスティングすることができる「GitHub Pages」という機能を提供しています。サーバーサイドのコードが不要な場合、このサービスは非常に便利です。 2. **Netlify**: Netlifyは無料プランで静的サイトのホスティングを提供しています。GitHub、GitLab、Bitbucketと連携し、CI/CDパイプラインを簡単に構築できます。 3. **Vercel**: Vercelも静的サイトやJavaScriptベースのフロントエンドアプリケーションを無料でデプロイできます。GitHub、GitLab、Bitbucketとの統合が可能です。 4. **Firebase**: Googleが提供するFirebaseには、無料のホスティングサービスが含まれています。Firebaseはデータベースや認証機能も提供しており、アプリケーションの機能拡張に役立ちます。 5. **Surge**: 簡単なコマンドで静的なウェブサイトをデプロイできるツールです。無料プランが用意されており、簡単なアプリケーションのデプロイに適しています。 これらのプラットフォームは、サーバーサイドのコードが不要な場合、特に有用です。サーバーサイドの処理が必要な場合は、無料枠があるクラウドサービス(例えばAWSの無料枠など)を検討する必要があります。また、アプリケーションの要件に応じて、最適なプラットフォームを選択することが重要です。
Github Pages
私は TypeScript の CI/CD もしたいのですが、それも GitHub Pagesでできるのですか? ー (多分ChatGPT-4) GitHub Pages自体は主に静的なコンテンツのホスティングに特化しており、CI/CD(継続的インテグレーションおよび継続的デリバリー)の機能を直接提供するわけではありません。しかし、GitHubには「GitHub Actions」という強力なCI/CDツールが組み込まれており、これを使用してTypeScriptプロジェクトのCI/CDプロセスを自動化し、その成果物をGitHub Pagesにデプロイすることが可能です。 GitHub Actionsを使うと、以下のようなプロセスを設定できます: 1. **コードの自動ビルドとテスト**: リポジトリにプッシュされるたびに、TypeScriptのコードを自動的にビルドし、テストを実行するワークフローを設定できます。 2. **静的ファイルの生成**: ビルドプロセスを通じて生成された静的ファイル(HTML、CSS、JavaScriptなど)を準備します。 3. **GitHub Pagesへの自動デプロイ**: 成功したビルドの成果物をGitHub Pagesに自動的にデプロイするよう設定できます。 このようにして、GitHub Actionsを活用することで、GitHub PagesでホスティングされるTypeScriptベースのプロジェクトに対して、CI/CDパイプラインを実装することができます。このプロセスは、GitHubのリポジトリの設定と`.github/workflows`ディレクトリ内に特定のYAMLファイルを作成することにより構成されます。
Windowsの Powershell で yarn
- qiita.com
- ralacode.com
- 勘で yarn init したら package.json 作ってくれた
一応 github pagesの始め方
私は単に index.js だけがある webアプリケーションを yarn deploy してgithub pages にデプロイしたいだけなのですが、 ー 単一の`index.js`ファイルを含むWebアプリケーションをGitHub Pagesにデプロイするためには、いくつかのステップを踏む必要があります。まず、`gh-pages`パッケージを使用してデプロイを行うことが一般的です。以下はその手順です: 1. **`gh-pages`のインストール**: - プロジェクトのルートディレクトリで、`gh-pages`パッケージを開発依存関係として追加します。これは次のコマンドで行えます: ```bash yarn add gh-pages --dev ``` 2. **`package.json`の設定**: - `package.json`ファイルに、GitHub Pagesにデプロイするためのスクリプトを追加します。 - また、`homepage`フィールドを追加して、プロジェクトのGitHub Pages URLを指定します。 - 例: ```json { "name": "your-project-name", "version": "1.0.0", "homepage": "https://.github.io/ ", "scripts": { "deploy": "gh-pages -d .", // 他のスクリプト }, // 他の設定 } ``` 3. **GitHub Pagesへのデプロイ**: - 上記の設定を完了したら、次のコマンドでGitHub Pagesにデプロイできます: ```bash yarn deploy ``` 4. **GitHubの設定**: - GitHubリポジトリに移動し、`Settings` > `Pages`セクションに移動します。 - GitHub Pagesのソースを、`gh-pages`ブランチに設定します。 5. **アクセス確認**: - デプロイ後、指定された`homepage`URLにアクセスして、アプリケーションが正しく表示されるか確認します。 注意点として、`index.js`がWebアプリケーションのエントリーポイントであり、必要なHTMLやCSSファイルも同様にプロジェクト内に存在することを確認してください。また、プロジェクトの構造によっては、追加のビルドスクリプトや設定が必要になる場合があります。GitHub Pagesは基本的に静的サイトのホスティングに適しているため、JavaScriptファイルのみをホスティングする場合、HTMLファイルを適切に設定し、その中でJavaScriptを参照する必要があります。
- .ssh/config の HostName github.com に秘密鍵を指定して、 github.com の(リポジトリの?)方に公開鍵を指定するのだった
- そして、すでにgithub.com に登録されてある鍵は使えないのだった
npx
- npx はnodeのなにかを一時的に仮想的な環境で実行するためのコマンド (今の理解)
npx はnodeのなにかを一時的に仮想的な環境で実行するためのコマンド ー `npx`はNode.jsのパッケージを実行するためのコマンドラインツールで、Node.jsに同梱されています。`npx`を使うことで、Node.jsのパッケージ(コマンドラインツールや実行可能ファイルなど)をインストールせずに一時的にダウンロードして実行することができます。これにより、簡単かつ迅速にパッケージを試したり、スクリプトを実行したりすることが可能になります。 `npx`の主な特徴として、以下のような利点があります: 1. **一時的なパッケージ実行**: `npx`を使うと、パッケージをグローバルにインストールすることなく、その場で一時的にダウンロードして実行することができます。これはディスクスペースを節約し、グローバルな依存関係を汚染しないために便利です。 2. **実行環境の自動生成**: 実行時に必要なパッケージがローカルまたはグローバルにインストールされていない場合、`npx`は自動的にそれらをnpmレジストリからフェッチして実行環境を生成します。このプロセスは完全に自動化されており、ユーザーが手動でパッケージを管理する必要はありません。 3. **特定バージョンの実行**: `npx`を使用すると、特定のバージョンのパッケージを簡単に指定して実行することができます。これは、異なるプロジェクトで異なるバージョンのツールを使用する場合に特に便利です。 4. **npmレジストリのコマンド実行**: `npx`はnpmレジストリに登録されている任意のコマンドを直接実行できます。これにより、パッケージを明示的にインストールすることなく、コマンドラインツールを一時的に利用することが可能になります。 例えば、`create-react-app`ツールを使って新しいReactプロジェクトを作成する場合、`npx`を使用して以下のように実行することができます:npx create-react-app my-appこのコマンドは`create-react-app`を一時的にダウンロードし、新しいReactプロジェクトをセットアップします。このプロセスは簡単で迅速であり、`create-react-app`をグローバルにインストールする必要はありません。 ー create-react-app を npxを使わずに使おうとすると、どうなるのですか? ー `create-react-app`を`npx`を使わずに使おうとする場合、代わりに`npm`や`yarn`でグローバルにインストールする必要があります。これにはいくつかのステップが含まれますが、そのプロセスと結果にはいくつかの違いがあります。 ### `npm`や`yarn`を使用してグローバルにインストールする場合 1. **インストールコマンド**: - npmを使用する場合: `npm install -g create-react-app` - yarnを使用する場合: `yarn global add create-react-app` 2. **プロジェクト作成コマンド**: - その後、任意のディレクトリで`create-react-app my-app`を実行して新しいReactアプリケーションを作成します。 ### npxを使わずに使う場合の影響 - **グローバルインストールが必要**: `create-react-app`がシステムのどこからでもアクセス可能になるため、ディスクスペースを消費し、環境を汚染する可能性があります。また、他のプロジェクトで異なるバージョンを使用したい場合に問題が生じる可能性があります。 - **バージョン管理**: `create-react-app`のグローバルインストールは、使用するバージョンを自分で管理する必要があります。`npx`を使用する場合は、コマンドを実行するたびに最新バージョンが使用されるため、手動での更新は必要ありません。 - **利便性**: `npx`を使用すると、コマンド一つで直接最新の`create-react-app`を実行でき、簡単かつ迅速に新しいプロジェクトを始められます。グローバルインストールを使用する場合は、事前にインストールプロセスが必要になります。 ### 結論 `npx`を使わずに`create-react-app`を使う場合、グローバルインストールが必要になり、その管理と環境への影響を考慮する必要があります。`npx`を使用する主な利点は、一時的な実行と常に最新バージョンの利用が可能であることです。したがって、特定のバージョンの`create-react-app`を長期間にわたって使用したい場合を除き、`npx`を使用する方が便利で効率的です。
- tscコマンドでtsのビルドだね
TypeScriptのコードは tscコマンドでJavaScriptに変換できると思うのですが、webpack利用の場合は、tscコマンドは使わず、ts-loader を使うのが一般的なのですか? 実は ts-loaderはtscを使ってたりするのですか? ー はい、TypeScriptのコードをJavaScriptに変換する場合、`tsc`コマンド(TypeScriptコンパイラ)を直接使用する方法と、Webpackと`ts-loader`(または`tsc`と同等の機能を提供する他のLoader、例えば`awesome-typescript-loader`)を組み合わせて使用する方法があります。Webpackを利用する場合、`ts-loader`を使用するのが一般的です。 ### `tsc`コマンドについて `tsc`はTypeScriptコンパイラで、TypeScriptのコードをJavaScriptに変換します。`tsc`を直接使用する場合、`tsconfig.json`ファイルでコンパイラオプションを設定し、コマンドラインからその設定に従ってコンパイルを実行します。 ### Webpackと`ts-loader`の利用 Webpackを使用する場合、`ts-loader`(または同様のTypeScriptを扱うためのLoader)を利用することが一般的です。`ts-loader`はWebpackのプロセスの一部として動作し、WebpackがTypeScriptファイル(`.ts`または`.tsx`)を処理する際にそれらをJavaScriptに変換します。 ### `ts-loader`は`tsc`を使っているのか `ts-loader`は内部的に`tsc`(TypeScriptコンパイラ)のAPIを利用しています。つまり、`ts-loader`はWebpackのビルドプロセス中に`tsc`の機能を呼び出してTypeScriptコードをコンパイルし、結果として得られるJavaScriptコードをWebpackがさらに処理できるようにします。このプロセスは自動的に行われ、開発者はWebpackの設定ファイル(`webpack.config.js`)で`ts-loader`を設定するだけで済みます。 ### 利点 Webpackと`ts-loader`を組み合わせて使用する主な利点は、TypeScriptのコンパイルだけでなく、その他のWebpackの機能(モジュールのバンドル、アセット管理、開発サーバの提供など)を同時に利用できる点です。これにより、より複雑で成熟したビルドプロセスと開発ワークフローを実現できます。 結論として、`ts-loader`は`tsc`を基にしており、Webpackを使用するプロジェクトでは、TypeScriptのコードを効率的に処理するための一般的な選択肢です。 ー ts-loader でも、 tsconfig.json を使いますか? ー はい、`ts-loader`をWebpackで利用する場合も、`tsconfig.json`を使います。`ts-loader`はWebpackのloaderの一つで、TypeScriptコードをJavaScriptに変換する際に、`tsc`(TypeScriptコンパイラ)の代わりにWebpack内で直接使用されます。`ts-loader`は内部的に`tsc`を使用してTypeScriptコードのコンパイルを行い、`tsconfig.json`ファイルを設定ファイルとして利用します。 `tsconfig.json`はTypeScriptプロジェクトのルートに置かれ、コンパイラオプションやプロジェクトで使用するファイルなど、TypeScriptコンパイラの動作をカスタマイズするための設定を含みます。`ts-loader`はこの`tsconfig.json`を読み込み、指定された設定に基づいてTypeScriptコードをコンパイルします。 Webpackを使ってTypeScriptを扱う場合、`ts-loader`(または同様の目的で使われる`awesome-typescript-loader`など)を使うと、TypeScriptのコンパイルとWebpackのビルドプロセスをシームレスに統合できます。これにより、`tsc`コマンドを直接実行する代わりに、Webpackのビルドプロセスの一部としてTypeScriptファイルを自動的にコンパイルし、バンドルすることができます。 まとめると、`ts-loader`はWebpackを使用してTypeScriptプロジェクトをビルドする際に一般的に使われる方法です。このプロセスでは`tsconfig.json`が重要な役割を果たし、プロジェクトのコンパイルオプションを定義します。
tsconfig.json の "module":"commonjs" と "module":"es6" は何が違うのですか? ー `tsconfig.json`ファイル内の`"module"`設定は、TypeScriptコンパイラが出力するJavaScriptモジュールの形式を指定します。`"module": "commonjs"`と`"module": "es6"`(または`"es2015"`)の違いは、生成されるJavaScriptコードが異なるモジュールシステムを使用することにあります。 ### `"module": "commonjs"` - **CommonJS**は、Node.jsで広く使われているモジュールシステムです。 - CommonJSモジュールは、`require()`関数でモジュールを読み込み、`module.exports`でモジュールをエクスポートします。 - 主にサーバーサイドやデスクトップアプリケーション(Node.js環境)で使用されますが、Webpackなどのモジュールバンドラーを使用することでブラウザ環境でも利用することが可能です。 ### `"module": "es6"` (または `"module": "es2015"`) - **ES6モジュール**(またはES2015モジュール)は、ECMAScript 2015(ES6)で導入された標準のJavaScriptモジュールシステムです。 - `import`と`export`文を使用してモジュールを読み込みおよびエクスポートします。 - モジュールの静的解析が可能で、コードの最適化やツリーシェイキング(未使用コードの除去)が容易になるなどの利点があります。 - ブラウザ(最新のもの)や最新バージョンのNode.jsで直接サポートされています。 ### 選択基準 - ターゲットとする実行環境や互換性が選択の重要な基準となります。例えば、Node.js環境での実行を主に考えている場合は`"commonjs"`を選択することが一般的です。 - フロントエンドのプロジェクトでモジュールバンドラー(例:Webpack, Rollup)を使用している場合、`"es6"`(または`"es2015"`)を選択することでモジュールの静的解析や最適化の恩恵を受けることができます。 TypeScriptを使用する際には、プロジェクトの要件や実行環境に応じて、適切なモジュールシステムを選択することが重要です。
- Node.js で使われるモジュールシステム(CommonJS)か、標準の "es6", "es2015"かだね
- ブラウザ向けには es6/es2015っぽい
Jestの始め方
TypeScriptで書かれた関数のJestテストコードを作成するには、いくつかのステップが必要です。 まず、Jestをプロジェクトにインストールし、テスト環境を設定する必要があります。 その後、関数の動作をテストするためのコードを書きます。 1. **Jestのセットアップ**: - Jestをプロジェクトの開発依存関係として追加します。これは次のコマンドで行えます: ```bash yarn add jest @types/jest ts-jest --dev ``` - TypeScript用のJest設定を`jest.config.js`ファイルに作成します。例えば: ```javascript module.exports = { preset: 'ts-jest', testEnvironment: 'jsdom', }; ``` 2. **テストコードの作成**: - 関数のテストを行うためのファイルを作成します。例えば、`example.test.ts`という名前で作成します。 - このテストでは、DOMを模倣して関数が正しく動作するかを確認します。 3. **テストコードの例**: ```typescript ... ``` このテストコードでは、`jsdom`を使用してブラウザの環境を模倣し、`textarea`要素を含むDOMを作成します。関数を実行した後、`textarea`の`value`が期待通りに変更されているかを`expect`関数を使用して確認します。 4. **テストの実行**: - テストを実行するために、`package.json`にテストスクリプトを追加します。例えば: ```json "scripts": { "test": "jest" } ``` - 次に、コマンドラインで`yarn test`を実行してテストを行います。 これで、指定された関数に対する基本的なJestテストがセットアップされます。Jestは非常に柔軟で強力なテストフレームワークであり、さまざまな種類のテストをサポートしています。
- jest.config.js がなかったので勘で npx jest --init したら進んだ
jsdom と node
√ Choose the test environment that will be used for testing ≫ node jsdom ↑気になる 2024/01/07 14:20 そのうち調べたい
Jestのinitをしてたら Choose the test environment that will be used for testing と聞かれたのですが、これへの選択肢それぞれを解説してください。 ー Jestの`init`プロセス中に「Choose the test environment that will be used for testing」という質問が表示されるのは、テストを実行する際の環境を設定するためです。Jestでは主に以下のテスト環境が利用可能で、それぞれ異なるユースケースやテストの種類に適しています。 ### `jsdom` - `jsdom`は、JavaScriptで実装された純粋なWebブラウザ環境のシミュレーションです。DOM APIを提供するため、DOM操作やブラウザ環境での動作を想定したテスト(例えば、クライアントサイドのJavaScriptライブラリやフロントエンドのフレームワークをテストする場合)に適しています。 - `jsdom`は実際のブラウザではないため、全てのブラウザ固有の振る舞いを完全にエミュレートすることはできませんが、多くの一般的なユースケースに対して十分な機能を提供します。 ### `node` - `node`環境は、Node.jsの環境でテストを実行します。サーバーサイドのJavaScriptやNode.jsで動作するアプリケーションのテストに適しています。 - DOM APIは提供されないため、DOM操作を伴うテストには不向きですが、Node.jsのAPIやサーバーサイドロジックのテストには最適な選択肢です。 ### `happy-dom` - `happy-dom`は`jsdom`の代替として登場した比較的新しいテスト環境で、高速なDOM実装を目指しています。`happy-dom`は`jsdom`よりもパフォーマンスが良い場合があり、またWeb Workersのサポートなど、`jsdom`では利用できない一部の機能を提供します。 - フロントエンドのテストやDOM操作を伴うテストに適しており、`jsdom`と同様に実際のブラウザではないため、すべてのブラウザ固有の振る舞いをエミュレートすることはできませんが、多くの場合に有効な選択肢となります。 テストするアプリケーションの種類やテストの必要性に応じて、これらの環境から適切なものを選択します。例えば、フロントエンドのUIコンポーネントをテストする場合は`jsdom`や`happy-dom`が適していますが、APIのテストやNode.jsで動作するバックエンドのロジックをテストする場合は`node`環境が適しています。 ー どうして jsdom の選択肢と node の選択肢を分ける必要があるのですか? Node用のテスト環境にも DOM操作関係のものがあってもよいのではないですか? ー `jsdom`と`node`というテスト環境を分ける必要がある主な理由は、テストの実行環境と目的の違いに基づいています。Node.js環境とブラウザ環境では、利用可能なAPIやグローバルオブジェクトが大きく異なります。これらの違いを適切に扱うために、Jestでは異なるテスト環境を用意しています。 ### Node.js 環境でのテスト - **パフォーマンス**: `node`環境は`jsdom`や他のブラウザエミュレーションに比べて、より軽量で高速です。DOM操作が不要なサーバーサイドのコードやNode.js固有のAPIを使用するテストには、この環境が最適です。 - **APIの違い**: Node.js環境では、ファイルシステムの操作やネットワークリクエストの管理など、サーバーサイド開発に特化したAPIが利用できますが、DOM APIは含まれていません。 ### ブラウザ環境でのテスト - **DOMの利用**: フロントエンドのテストでは、DOM操作やブラウザのイベント、`window`や`document`などのグローバルオブジェクトの挙動を確認することが重要です。`jsdom`はこれらのブラウザ固有の機能をエミュレートし、JavaScriptコードがブラウザ環境でどのように動作するかをテストできるようにします。 - **環境の再現**: `jsdom`を使用することで、ブラウザ環境をかなり正確にシミュレートできますが、実際のブラウザと完全に同じではありません。しかし、多くのフロントエンド開発におけるテストニーズを満たすことができます。 ### なぜDOM操作をNode環境に含めないのか - **明確な責務の分離**: Node.js環境とブラウザ環境は異なる目的で使用されるため、テスト環境を分けることで、それぞれの環境に最適化されたテストが可能になります。例えば、サーバーサイドAPIのテストとクライアントサイドUIのテストは異なるアプローチを必要とします。 - **リソースの効率的な使用**: DOMをエミュレートすることは、リソースを消費する操作です。サーバーサイドのテストで不要なDOM操作のオーバーヘッドを避けることで、テストの実行速度を向上させることができます。 - **設定の単純化**: 使用するテスト環境をテストの種類に応じて選択することで、設定が単純化され、プロジェクトの管理が容易になります。 結局のところ、これらの環境を分けることにより、開発者は特定のテストケースに最適なツールを選択でき、テストの精度と効率を向上させることができます。 ー そういう話であれば、フロントエンドとサーバーのプログラミング言語も分けて、サーバーの方はJavaScriptではないプログラミング言語を使うと良いのではないのですか? ー フロントエンドとサーバーサイドのプログラミング言語を分けるかどうかは、プロジェクトの要件、チームのスキルセット、開発の効率性、そして採用する技術のエコシステムなど、多くの要素に依存します。JavaScriptをフロントエンドとサーバーサイドの両方で使用する(いわゆるフルスタックJavaScript)には、以下のような利点があります。 ### フルスタックJavaScriptの利点 1. **一貫性**: 同じ言語をクライアントサイドとサーバーサイドの両方で使用することで、コードの一貫性が保たれ、開発プロセスが簡素化されます。これは学習曲線の低減、コードの再利用、チーム間のコミュニケーションの向上に寄与します。 2. **生産性の向上**: 開発者はフロントエンドとバックエンドの間で容易に切り替えることができ、技術スタック全体にわたって一貫したツールセットを使用することができます。これにより、開発プロセス全体の効率が向上します。 3. **共有可能なコード**: バリデーションロジックやモデル定義など、フロントエンドとバックエンドで共有可能なコードがある場合、JavaScriptをフルスタックで使用することで簡単にコードを共有し、DRY(Don't Repeat Yourself)の原則を守ることができます。 4. **豊富なエコシステム**: Node.jsとその周辺のエコシステムは急速に成長し、多種多様なライブラリやフレームワークが提供されています。これにより、ほぼあらゆる種類のプロジェクトに対応することができます。 ### 異なる言語を使用する場合の考慮事項 しかし、プロジェクトの特定のニーズやパフォーマンス要件に応じて、サーバーサイドにはJavaScript以外の言語(例:Python、Ruby、Go、Javaなど)を選択することもあります。 - **特定の技術要件**: プロジェクトが特定の技術スタックやライブラリに依存している場合、それらを最もよくサポートする言語を選択することが重要です。 - **パフォーマンス**: アプリケーションの特定のパフォーマンス要件がある場合、特定のタスクに最適化された言語を選択することが望ましい場合があります。 - **チームの専門知識**: チームメンバーが特定の言語に精通している場合、その言語を使用することで開発速度を上げることができます。 最終的に、フロントエンドとバックエンドで使用するプログラミング言語を選択する際には、プロジェクトの目的、チームのスキルセット、そして将来の拡張性やメンテナンスの容易さなど、多くの要素を慎重に検討する必要があります。フルスタックJavaScriptは多くのプロジェクトで強力な ー Jestのテスト環境でも、 Nodeとjsdomを分けずに、単一環境にした方が、一貫性が生まれ、生産性が向上して、コードを共有可能になるのではないですか? ー Jestのテスト環境における`node`と`jsdom`の分離には、確かに特定の目的と利点がありますが、提案されたように一貫性を重視し、生産性を向上させるために、単一環境に統合することにも一定のメリットがあると考えることができます。ここでは、そのような統合がもたらす潜在的な利点と、それに伴う課題を考えてみましょう。 ### 統合環境の潜在的な利点 1. **一貫性**: テストコードが同じ環境設定を共有することで、フロントエンドとバックエンドのテスト間での一貫性が保たれ、テストの書き方やデバッグの方法が統一されます。 2. **生産性の向上**: 異なるテスト環境間での切り替えや設定の違いに対応する必要がなくなるため、テストのセットアップや管理が簡素化され、開発者の生産性が向上する可能性があります。 3. **コードの再利用性**: 一つのテスト環境で動作するテストやユーティリティが、他の環境でも同様に動作するため、コードの再利用が容易になります。 ### 課題と考慮すべき点 しかし、フロントエンドとバックエンドのテストを完全に統合することは、いくつかの課題をもたらす可能性があります。 1. **環境の違いの管理**: 実際のアプリケーション開発では、フロントエンドとバックエンドが異なる実行環境(ブラウザとNode.js)で動作するため、これらの違いをテスト環境が適切に模倣し、管理する必要があります。単一環境でこれらを適切に扱うことは複雑になる可能性があります。 2. **パフォーマンス**: `jsdom`のようなDOMのエミュレーションは便利ですが、追加のオーバーヘッドを導入し、テストの実行速度を低下させる可能性があります。特に、DOM操作を必要としないバックエンドのテストでは、このオーバーヘッドが無駄になり得ます。 3. **テストの精度**: テスト環境が実際の実行環境と完全に一致しない場合、特にDOM操作やブラウザ固有の挙動をテストする場合に、テストの精度が低下する可能性があります。 ### 結論 統合テスト環境の導入は、テストの一貫性と生産性の向上に貢献する可能性がありますが、実行環境の違いを適切に扱い、パフォーマンスやテストの精度を維持するためには、慎重な設計と実装が必要です。プロジェクトの要件やチームの好みに応じて、適切なバランスを見つけることが重要です。また、Jestなどのツールは設定の柔軟性を提供しており、プロジェクトに合わせて最適なテスト環境を選択できるようになっています。
- ChatGPTとの対話を重ねたところ、Jestのテスト環境をjsdomに 統一した方がよい場合もある、ということになった (しかし、実際にはそんなフロントエンドのテストとバックエンドのテストを混ぜ合わせることはあまりないだろう)
Jestのinitで出てくる √ Which provider should be used to instrument code for coverage? の質問の意味と選択肢それぞれの解説をお願いします。また、なぜこの質問の最初にルート記号がついているのですか? ー Jestの`init`コマンドで出てくる「√ Which provider should be used to instrument code for coverage?」という質問は、コードカバレッジを収集するために使用するツール(プロバイダ)を選択することに関連しています。コードカバレッジは、テストがどの程度コードベースをカバーしているかを示す指標で、品質保証のために重要です。異なるプロバイダは、コードを解析し、カバレッジデータを収集する異なるアプローチを提供します。 ### 選択肢の解説 選択肢には通常、以下のようなプロバイダが含まれます(Jestのバージョンや設定によって異なる場合があります): 1. **`babel`**: Babelを使用してコードを変換し、カバレッジ情報を収集します。BabelはJavaScriptコードをトランスパイルするために広く使用されているツールで、ES6以上のコードを古いJavaScriptバージョンに変換する際に便利です。Babelベースのカバレッジは、トランスパイルされたコードを基にしてカバレッジ情報を提供します。 2. **`v8`**: V8 JavaScriptエンジン(ChromeブラウザやNode.jsで使用されています)に組み込まれているカバレッジ収集機能を使用します。この選択肢は、パフォーマンスがよく、原生のJavaScriptコードに近い形でカバレッジ情報を提供するため、特にNode.jsでの使用に適しています。 ### コードカバレッジプロバイダの選択 どのプロバイダを選択するかは、プロジェクトの要件や使用している技術スタックによって異なります。たとえば、Babelを使用していて、トランスパイルされたコードのカバレッジを詳細に知りたい場合は、`babel`プロバイダを選択すると良いでしょう。一方で、パフォーマンスを重視し、より原生に近い形でのカバレッジ情報を求める場合は、`v8`プロバイダが適しています。 ### ルート記号の意味 質問の前にある「√」(ルート記号)は、コマンドラインのプロンプトやGUIベースのインターフェースでよく見られる装飾的な要素です。この場合、特に数学的な意味を持つわけではなく、質問や選択肢を目立たせるため、またはユーザーの注目を引くために使用されている可能性があります。コマンドラインツールのUI/UXを改善するための視覚的なヒントとして考えることができます。このような記号の使用は、ツールのバージョンや実行環境によって異なる場合があります。
As of Jest 28 "jest-environment-jsdom" is no longer shipped by default, make sure to install it separately. ー yarn add jest-environment-jsdom --dev Jest 28から`jest-environment-jsdom`がデフォルトで含まれなくなったため、別途インストールする必要があります。これは、Jestを使用してDOMを模倣するテストを行う場合に特に重要です。以下の手順で`jest-environment-jsdom`をインストールし、Jestの設定を更新してください。 1. **`jest-environment-jsdom`のインストール**: - コマンドラインを開き、以下のコマンドを実行して`jest-environment-jsdom`をプロジェクトに追加します: ```bash yarn add jest-environment-jsdom --dev ``` 2. **Jestの設定の更新**: - プロジェクトのJest設定ファイル(通常は`jest.config.js`)を開き、`testEnvironment`を`jsdom`に設定します。例えば: ```javascript module.exports = { preset: 'ts-jest', testEnvironment: 'jsdom', }; ``` 3. **テストの実行**: - Jestの設定を更新した後、通常どおりテストを実行できます。例えば、`yarn test`コマンドを使用してテストスクリプトを実行します。 これらの手順により、Jest 28以降のバージョンでDOMを模倣するテストを正しく実行できるようになります。`jest-environment-jsdom`は、Jestテストでブラウザ環境をエミュレートするために使用され、DOM APIをテスト内で利用できるようにします。
Uncaught ReferenceError: exports is not definedhttps://example.github.io/example/index.js:5 と言われました ー 「Uncaught ReferenceError: exports is not defined」というエラーメッセージは、TypeScriptのモジュールがブラウザで直接実行された際に発生することがあります。これは、TypeScriptがモジュールをCommonJSやAMDの形式でコンパイルし、ブラウザがその形式を直接サポートしていないために起こります。ブラウザはES6モジュール形式をサポートしていますが、CommonJSやAMD形式はサポートしていません。 この問題を解決するためには、以下のステップを試してみてください。 1. **`tsconfig.json`の設定確認**: - TypeScriptの設定ファイル(`tsconfig.json`)を開き、`"module"`が `"es6"`、`"es2020"`、または `"esnext"`に設定されていることを確認します。これにより、TypeScriptはブラウザで直接実行できるES6モジュール形式でコードをコンパイルします。 ```json { "compilerOptions": { "module": "es6", // その他のオプション... } } ``` 2. **モジュールタイプの指定**: - HTMLファイル内でスクリプトを読み込む際に、`type="module"`を指定します。これにより、ブラウザはスクリプトをES6モジュールとして解釈します。 ```html ``` 3. **イベントハンドラの追加**: - HTMLの`onclick`属性を使用する代わりに、`index.ts`内でボタン要素を選択し、イベントリスナーを追加します。 ```typescript import example from './example'; document.addEventListener('DOMContentLoaded', () => { const button = document.querySelector('input[type="button"]'); button.addEventListener('click', example); }); ``` これらの変更により、TypeScriptのモジュールがブラウザで正しく解釈され、`exports is not defined`のエラーが解決されるはずです。また、これによりHTMLファイルでの`onclick`属性の使用を避け、よりモジュール化されたアプローチをとることができます。
- tsconfig.json で "module": "es6", にした
index.ts で import example from './example'; と書くと、 npx tsc したときに、 index.js になったときにも全く同じように import example from './example'; と書かれていて、それをブラウザが解釈すると GET https://example.github.io/example/example が存在しませんとなります。 ー TypeScriptからコンパイルされたJavaScriptで `import example from './example';` がそのまま残っている場合、これはブラウザが相対パスをモジュールとして解釈しようとしていることを意味します。ブラウザがモジュールを読み込む際、ファイル拡張子(`.js`)が必要です。TypeScriptのコンパイル時にファイル拡張子が省略されるのは一般的ですが、ブラウザでは拡張子が必要です。 この問題を解決するためには、以下の手順を試してください。 1. **インポート文の修正**: TypeScriptファイル (`index.ts`) でのインポート文を次のように拡張子付きで記述します。 ```typescript import example from './example.js'; ``` これにより、TypeScriptが `index.js` にコンパイルした際、ブラウザが正しいパスでファイルを探すことができます。 2. **`tsconfig.json`の設定を確認**: TypeScriptのコンパイラオプションで `"moduleResolution": "node"` が設定されていることを確認します。これにより、Node.jsスタイルのモジュール解決が行われます。 ```json { "compilerOptions": { "moduleResolution": "node", // その他のオプション... } } ``` 3. **サーバー上でのファイル構造の確認**: デプロイされたサーバー上で、`example.js` が正しい場所に存在するか確認してください。相対パス `./example.js` は、`index.js` が存在するのと同じディレクトリ内に `example.js` ファイルがあることを期待しています。 4. **ローカルでのテスト**: 変更を行った後、ローカルでテストしてみて、すべてが期待通りに動作することを確認します。問題がなければ、変更をサーバーにデプロイします。 これらの手順により、ブラウザが正しくモジュールを読み込み、`GET https://example.github.io/example/example` が存在しないという問題が解決されるはずです。また、モジュールパスの拡張子は開発環境と本番環境での整合性を保つために重要です。 ー でも、せっかく index.ts も example.ts も typescript なのに、そこに importで .js を書くのはおかしくありませんか? コンパイルオプションで、 index.ts の import example from './example'; を index.js になったときに import example from './example.js'; にしてくれるコンパイルオプションがあるのではないですか? ー TypeScriptのコンパイラオプションには、インポート文の書き換えを自動的に行うものは存在しません。しかし、TypeScriptからJavaScriptへのコンパイル時に、モジュールのインポートパスに拡張子 `.js` を付加するために外部ツールを使用することは可能です。 一般的な方法としては、ビルドツール(例えばWebpackやRollup)を使用するか、またはBabelプラグイン(例えば`@babel/plugin-transform-modules-commonjs`)を利用することです。これらのツールはTypeScriptのトランスパイル時により複雑な変換を可能にし、ブラウザのモジュール解決に適したフォーマットにコードを変換できます。 例えば、Webpackを使用する場合、以下の手順を実行します: 1. **Webpackのインストール**: - Webpackと関連するローダー(`ts-loader` または `babel-loader`)をプロジェクトに追加します。 ```bash yarn add webpack webpack-cli ts-loader --dev ``` 2. **Webpackの設定**: - プロジェクトのルートに `webpack.config.js` ファイルを作成し、TypeScriptのトランスパイル設定を行います。 - 例: ```javascript const path = require('path'); module.exports = { mode: 'development', entry: './src/index.ts', output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist'), }, module: { rules: [ { test: /\.ts$/, use: 'ts-loader', exclude: /node_modules/, }, ], }, resolve: { extensions: ['.ts', '.js'], }, }; ``` 3. **ビルドコマンドの追加**: - `package.json` にビルドコマンドを追加します。 ```json "scripts": { "build": "webpack" } ``` 4. **ビルドの実行**: - 以下のコマンドでWebpackビルドを実行します。 ```bash yarn build ``` これにより、Webpackが `index.ts` および `example.ts` をトランスパイルし、適切なJavaScriptファイルを生成します。生成されたファイルは、ブラウザが理解できる形式になり、モジュール解決の問題が解決されるはずです。ただし、この方法ではプロジェクトの構成が複雑になる可能性があり、適切な設定とテストが必要です。
- webpack が「編み込む」ものだったもんね
いまのfrontendって使うツールがめっちゃ沢山ありませんか? js をいい感じにしまくるために仕方ないんですか? バックエンドだと、プログラミング言語自体を設計できるので、そこで吸収できるけど、フロントエンドはすでにある jsを使うしかないから、ツールを使いまくる必要があるわけですね。 ー 現代のフロントエンド開発では確かに多くのツールが使用されていますが、それにはいくつかの理由があります。JavaScriptやフロントエンド技術のエコシステムが急速に進化し、より複雑でインタラクティブなウェブアプリケーションの開発が可能になったことが大きな要因です。これらの進化により、開発プロセスを効率化し、パフォーマンスを最適化し、コードの品質を向上させるためのツールが必要になりました。 ### フロントエンド開発の複雑性 - **多様なブラウザ対応**: ウェブアプリケーションはさまざまなブラウザやデバイスで動作する必要があり、互換性を確保するための追加作業が必要になります。 - **リッチなユーザーインターフェイス**: 現代のウェブアプリケーションでは、リッチなユーザーインターフェイスとインタラクティブな機能が求められます。これらを実現するためには、JavaScript、CSS、HTMLを駆使する高度な技術が必要です。 - **パフォーマンス最適化**: ユーザー体験を向上させるためには、ロード時間の短縮やレスポンスの高速化など、パフォーマンスの最適化が不可欠です。 - **セキュリティ**: クライアントサイドのセキュリティ対策も重要であり、これを管理するためのツールが必要になります。 ### ツールの使用 これらの課題に対応するため、以下のようなツールが一般的に使用されています: - **パッケージマネージャ**(npm, Yarnなど): 依存関係の管理を簡単にします。 - **モジュールバンドラー**(Webpack, Rollupなど): 複数のファイルをまとめて一つのファイルにバンドルし、ブラウザでの読み込みを最適化します。 - **トランスパイラー**(Babelなど): 最新のJavaScript機能を使用して書かれたコードを、古いブラウザでも動作するように変換します。 - **タスクランナー**(Gulp, npmスクリプトなど): SASSのコンパイル、画像の圧縮、リントなど、様々な開発タスクを自動化します。 - **フレームワーク/ライブラリ**(React, Vue.js, Angularなど): UIの構築を効率化し、アプリケーションの構造を整理します。 ### バックエンドとの違い バックエンド開発では、言語の選択肢が広がり、その言語の標準ライブラリやフレームワークだけで多くの機能をカバーできる場合が多いです。しかし、フロントエンド開発では、ブラウザという共通の実行環境に合わせてJavaScriptを使用する必要があり、さらにユーザーインターフェイスの豊富さやインタラクションの複雑さの増加により、多様なツールやライブラリを組み合わせて使用する必要が生じます。JavaScriptのエコシステム内でこれらの多様な要件を満たすために、特化したツールが数多く開発されました。 ### フロントエンドとバックエンドの統合 近年では、フロントエンドとバックエンドの開発プロセスをより密接に統合しようとする動きも見られます。例えば、サーバーサイドレンダリング(SSR)をサポートするフレームワークや、APIを介してフロントエンドとバックエンドが通信するヘッドレスCMSなどがその例です。これらの技術は、フロントエンドとバックエンドの間の連携を強化し、開発プロセスの効率化を図るものです。 ### ツールの使用におけるバランス フロントエンド開発におけるツールの使用は、プロジェクトの規模やチームのスキル、開発プロセスによって異なります。小規模なプロジェクトではシンプルなツールセットで十分な場合もありますが、大規模で複雑なアプリケーションを開発する際には、より多くのツールやフレームワークを組み合わせる必要が出てきます。 ツールの選択と導入には慎重であるべきで、プロジェクトに実際に価値をもたらすものを選ぶことが重要です。ツールの過剰な使用は、学習コストの増加や開発プロセスの複雑化を招くこともあるため、必要なツールを適切に選択し、そのツールを効率的に活用することが、フロントエンド開発の成功につながります。 結論として、フロントエンド開発における多様なツールの使用は、現代のウェブアプリケーションの要件を満たすために必要なものであり、これらのツールを適切に選択し、組み合わせることで、開発の効率化、パフォーマンスの最適化、そしてユーザー体験の向上を実現できます。
- やっぱりブラウザなのがJavaScript縛りになってるね
webpackやYarnもタスクランナーの一種ですか? ー WebpackやYarnは、それぞれ異なる目的で設計されたツールですが、一部の機能がタスクランナーと重なることがあります。それぞれのツールの主な用途を理解することで、どのようにタスクランナーと関連しているかを把握できます。 ### Webpack Webpackは主にモジュールバンドラーとして機能します。その主な役割は、JavaScript、CSS、画像ファイルなどの静的アセットを取り扱い、それらをバンドル化することです。Webpackは複数のファイルやモジュールを一つまたは複数のファイルに統合し、ブラウザで効率的にロードできるようにします。 Webpackはまた、ローダーやプラグインを介して、CSSのミニファイ、画像の最適化、JavaScriptのトランスパイル(Babelを使用したES6のコードをES5に変換するなど)といったタスクを実行できます。これらの機能により、Webpackはビルドプロセスを管理するためのツールとして、間接的にタスクランナーの役割を果たすことがあります。 ### Yarn YarnはJavaScriptのパッケージマネージャーであり、プロジェクトの依存関係を管理するために使用されます。npmと同様に、プロジェクトに必要なライブラリやフレームワークをインストール、アップデート、管理するためのコマンドラインツールです。 Yarnはパッケージのインストール速度の向上やより安定した依存関係のロックファイルの提供など、npmに対するいくつかの改善を提供します。また、`yarn scripts`を使用して特定のタスク(ビルド、テスト、デプロイなど)を自動化することができますが、これはnpmスクリプトと非常に似ています。 ### タスクランナーとの関係 タスクランナー(例えばGulpやnpmスクリプト)は、さまざまな開発タスク(コンパイル、ミニファイ、テスト実行など)を自動化するために使用されます。WebpackやYarnも、それぞれの主要な機能とは別に、これらのタスクの一部を実行する能力を持っています。 しかし、Webpackは主にモジュールバンドリングとアセット管理に特化しており、Yarnは依存関係管理に特化しています。これらのツールはタスクランナーの一種と見なすことができる機能を持っていますが、それぞれが最も得意とする領域があります。フロントエンド開発のプロジェクトでは、これらのツールを他のタスクランナーと組み合わせて使用することで、開発プロセスの効率化と自動化を実現できます。 ー WebpackやYarnでタスクランナーの役割を受け持つのが一般的になったために、タスクランナーとしての役割をGulpなどのタスクランナー専用ソフトで担う構成は下火になっているのですか? ー はい、その通りです。WebpackやYarn(npmスクリプトを含む)のようなツールが広く受け入れられるようになったことで、GulpやGruntといった従来のタスクランナー専用のツールの役割は、一部のシナリオや特定のニーズを除いて、下火になっています。これにはいくつかの理由があります。 ### モジュールバンドラーとパッケージマネージャーの進化 1. **一元化されたワークフロー**: WebpackやYarn(npm)は、モジュールのバンドリング、依存関係管理、そしてタスクの実行という、フロントエンド開発における複数の重要な機能を一つのツールで提供します。これにより、プロジェクトの設定や管理が簡素化され、開発プロセスがスムーズになります。 2. **設定の簡略化**: 特にWebpackは、ローダーやプラグインを通じて、トランスパイル、ミニファイ、SASS/LESSのコンパイルなど、多様な開発タスクを簡単に実行できます。これにより、多くの場合でGulpやGruntを使って別途タスクを管理する必要がなくなりました。 3. **コミュニティとエコシステム**: WebpackやYarn/npmは大規模なコミュニティに支えられており、多くのプロジェクトで採用されています。豊富なドキュメント、チュートリアル、プラグイン、ローダーなどが利用可能で、新しい開発者がこれらのツールを学び、使い始めやすい環境が整っています。 ### タスクランナーの現在の役割 しかし、GulpやGruntが完全に無用になったわけではありません。これらのタスクランナーは、特に複雑なビルドプロセスを持つプロジェクトや、細かいカスタマイズが必要な場合に依然として価値を提供します。コードのトランスパイルやバンドリング以外に、ファイルの監視、テストの自動化、リント、ドキュメント生成など、特定のタスクで優れた柔軟性と簡便性を提供することができます。 ### 結論 開発ツールの選択は、プロジェクトの具体的な要件やチームの好み、既存のワークフローに大きく依存します。WebpackやYarn/npmによってタスクランナーの必要性が減少したとはいえ、GulpやGruntが提供する特定の機能や柔軟性が必要な場合もあります。現代のフロントエンド開発では、これらのツールを適切に組み合わせることで、最も効率的な開発プロセスを構築することが求められています。
- はっきりと下火になっていると答えたChatGPT
ヘッドレスCMSって何ですか? ー ヘッドレスCMS(Content Management System)は、従来のCMSとは異なり、フロントエンドの表示層("ヘッド")を持たないCMSのことを指します。これにより、コンテンツを保存、管理するバックエンドの機能と、そのコンテンツをどのように表示するかというフロントエンドの機能が分離されます。ヘッドレスCMSはAPIを通じてコンテンツを提供し、開発者は任意のフロントエンド技術を使用してコンテンツを表示することができます。 ### ヘッドレスCMSの特徴 - **APIファースト**: ヘッドレスCMSはRESTful API、GraphQL APIなどを通じてコンテンツを提供します。これにより、ウェブサイト、モバイルアプリ、IoTデバイスなど、様々なプラットフォームでコンテンツを利用することが可能になります。 - **表示層の分離**: コンテンツ管理(バックエンド)とコンテンツの表示(フロントエンド)が分離されているため、開発者はフロントエンドの開発において自由度が高く、React、Vue.js、Angularなど好きな技術スタックを選択できます。 - **柔軟性と拡張性**: ヘッドレスCMSはフロントエンドの技術やデザインの変更を容易にし、新しい表示方法やプラットフォームへの対応を迅速に行うことができます。 - **セキュリティ**: フロントエンドとバックエンドが分離されているため、セキュリティが強化されます。APIを介してのみコンテンツにアクセスするため、直接的なデータベースへの攻撃を防ぐことができます。 ### ヘッドレスCMSの使用例 - **マルチプラットフォーム対応ウェブサイト**: 同じコンテンツをウェブサイト、モバイルアプリ、さらにはスマートウォッチやスマートスピーカーなど、複数のプラットフォームで表示したい場合に適しています。 - **SPA(シングルページアプリケーション)**: モダンなJavaScriptフレームワークを使用して開発されたSPAと組み合わせることで、リッチでインタラクティブなユーザー体験を提供できます。 - **カスタマイズされたユーザー体験**: ユーザーの行動や好みに応じて動的にコンテンツを変更したい場合、ヘッドレスCMSから提供されるコンテンツを利用して、個別に最適化されたフロントエンドを実装できます。 ヘッドレスCMSは、デジタルコンテンツを柔軟にかつ効率的に管理し、多様なフロントエンドで再利用することを可能にするため、現代のウェブ開発のトレンドの一つとなっています。 ー 具体的なヘッドレスCMSの例を何個か挙げてください。 ー ヘッドレスCMSは多様な選択肢があり、それぞれ異なる機能や特性を持っています。以下に、いくつかの具体的なヘッドレスCMSの例を挙げます: ### Contentful - **特徴**: Contentfulは、強力なAPI、豊富なカスタマイズオプション、直感的なコンテンツモデリング機能を提供する、非常に人気のあるヘッドレスCMSです。多言語サポートやリッチテキスト編集も特徴です。 ### Strapi - **特徴**: オープンソースで自由度の高いヘッドレスCMS。自分のサーバーにインストールして使用することができ、RESTfulまたはGraphQL APIを通じてコンテンツを提供します。カスタマイズ性と拡張性に優れています。 ### Sanity - **特徴**: Sanityはリアルタイムでのコンテンツ編集と完全なカスタマイズが可能なヘッドレスCMSです。リッチなテキストエディターと柔軟なデータスキーマ設計が特徴で、開発者が独自のエディタインターフェースを作成できます。 ### GraphCMS - **特徴**: GraphQLに特化したヘッドレスCMSで、高度なAPIクエリと統合オプションを提供します。マルチプロジェクト管理やロールベースのアクセス制御など、企業レベルの機能も備えています。 ### Prismic - **特徴**: Prismicは、簡単に使い始めることができるヘッドレスCMSで、スライスと呼ばれるユニークなコンテンツブロックシステムを特徴としています。カスタマイズ可能なコンテンツモデルと組み込みの画像編集ツールがあります。 ### Netlify CMS - **特徴**: オープンソースのヘッドレスCMSで、特に静的サイトジェネレーターと組み合わせて使用することを目的としています。GitHubに直接コンテンツを保存し、Netlifyプラットフォームとの統合が容易です。 これらはほんの一例であり、市場にはさまざまなヘッドレスCMSが存在します。それぞれのCMSは独自の特徴や強みを持っているため、プロジェクトの要件や開発チームの好みに応じて選択することが重要です。
- フロントエンドになぜたくさんの色々なツールがあるの、の話からここまで話が膨らんだのだった。
- webpack は package.json の scripts build のところをみると、 webpackコマンドで起動できるのだった
- (tscではなく) webpackを入れて使うのは、 拡張し .ts とか .js とかをつけたくなかったから (loader が便利で必要になる webpack)
- しかし、 typescript yarn jest webpack と 4つツールを使えば今回のはできた
- まあ、 CIとかしようとすると増える…いや、増えない…?
所要時間
- この記事は 43000文字 (文庫本86ページ分)
- やっぱり、TypeScriptを最低限できるようになるだけでそれなりに勉強量がいるね (ツールを5つくらい使う)
- 作業中のMEMOは 9000行
- プロダクト自体は 7~10時間くらいでできたはず
- この記事を書くのに3時間