tree-shaking
JavaScriptバンドルにおけるデッドコード除去のためのツリーシェイキングを解説するスキルです。未使用のexportがバンドルに含まれており、ビルド時に最終的なバンドルサイズを削減したい場合に活用できます。
description の原文を見る
Teaches tree shaking for dead code elimination in JavaScript bundles. Use when your bundle includes unused exports and you want to reduce the final bundle size during the build step.
SKILL.md 本文
Tree Shaking
アプリケーション内のどこでも使用されていないコードをバンドルに追加してしまうことがあります。このデッドコードを削除することで、バンドルのサイズを削減し、不要なデータの読み込みを防ぐことができます!バンドルに追加する前にデッドコードを削除するプロセスは、tree shaking と呼ばれています。
使用時機
- バンドルにインポートされたモジュールからの未使用コードが含まれている場合に使用します
- JavaScript バンドルをコンパクトに保ち、ロードパフォーマンスを向上させるのに役立ちます
使用方法
- ES2015 の
import/export構文を使用します — ES modules のみが tree-shaken できます - モジュール全体をインポートする代わりに、名前付きインポートを使用して効果的な tree shaking を実現します
- 必要に応じて
package.jsonでパッケージをサイドエフェクトフリーとしてマークします - サイドエフェクトを持つモジュールは安全に tree-shaken できないことに注意してください
詳細
概念
Tree shaking は、最終的な JavaScript バンドルから使用されることのないコードを削除することを目的としています。正しく実行すれば、JavaScript バンドルのサイズを削減し、ダウンロード、解析、および(場合によっては)実行時間を短縮できます。モジュールバンドラー (webpack や Rollup など) を使用するほとんどの最新 JavaScript アプリケーションでは、バンドラーがデッドコードを自動的に削除することが期待されます。
あなたのアプリケーションとその依存関係を抽象構文木として考えます (構文木を「揺らして」最適化したいのです)。木内の各ノードは、アプリに機能を提供する依存関係です。Tree shaking では、入力ファイルはグラフとして扱われます。グラフ内の各ノードは、コード内で「部分」と呼ばれるトップレベルのステートメントです。Tree shaking はグラフトラバーサルであり、エントリーポイントから開始して、トラバースされたすべてのパスをインクルード用にマークします。
すべてのコンポーネントはシンボルを宣言したり、シンボルを参照したり、他のファイルに依存したりできます。「部分」でさえ、サイドエフェクトがあるかないかがマークされます。例えば、ステートメント let firstName = 'Jane' はサイドエフェクトがありません。なぜなら、何も firstName を必要としなければ、ステートメントを削除しても観察された違いがないからです。しかし、ステートメント let firstName = getName() はサイドエフェクトを持っています。なぜなら、getName() の呼び出しは何も firstName を必要としなくても、コードの意味を変えずに削除することはできないからです。
インポート
ES2015 モジュール構文 (import および export) で定義されたモジュールのみが tree-shaken できます。モジュールをインポートする方法は、そのモジュールが tree-shaken 可能かどうかを指定します。
Tree shaking は、エントリーポイントファイルのサイドエフェクトを持つすべての部分をビジットすることから開始し、グラフのエッジをトラバースして新しいセクションに到達するまで進みます。トラバーサルが完了すると、JavaScript バンドルはトラバーサル中に到達した部分のみを含みます。他の部分は除外されます。
次の utilities.js ファイルを定義していると仮定します:
export function read(props) {
return props.book
}
export function nap(props) {
return props.winks
}
次に、以下の index.js ファイルがあります:
import { read } from 'utilities';
eventHandler = (e) => {
read({ book: e.target.value })
}
この例では、nap() は必要でないため、バンドルに含まれません。
サイドエフェクト
ES6 モジュールをインポートするとき、このモジュールは即座に実行されます。コード内のどこでもモジュールのエクスポートを参照していなくても、モジュール自体が実行中にグローバルスコープに影響を与える可能性があります (例えば、ポリフィルやグローバルスタイルシート)。これはサイドエフェクトと呼ばれます。モジュール自体のエクスポートを参照していなくても、_もし_モジュールがそもそもエクスポート値を持っている場合、インポート時の特別な動作のため、モジュールは tree-shaken できません!
Webpack ドキュメントは、tree-shaking に関する明確な説明と、それを破らないようにする方法を提供しています。
ソース
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- patternsdev
- リポジトリ
- patternsdev/skills
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/patternsdev/skills / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。