2 つの動機があると思います (通常、このトピックに関する以前の会話に基づいています)。
- ページごとに ac# プロジェクトを配置するのは面倒です。
- 各ページに読み込まれるスクリプトの量を最小限に抑える必要があります。
#1 に対処するために、単一の C# プロジェクトをビット単位でコンパイルして複数のスクリプトを生成するソリューションが以前はありましたが、それはなくなりました。それがなくなった理由は、一度に完全なプロジェクトをコンパイルする C# コンパイラと、一度にプロジェクトの一部をコンパイルする script# のおかげで、異なるセマンティクスを持つことが非常に簡単になるためです。ただし、すべてが失われるわけではありません。いくつかの選択肢があります。
msbuild プロセスをカスタマイズします。具体的には、コードのサブセットを使用して ScriptCompilerTask を複数回呼び出すように csproj を変更します。C# コンパイラによって提供される検証はあまり意味がないため、コードの各サブセットが正常にコンパイルされることを確認する責任を負っています。
Script# コンパイラ API を使用して、カスタム msbuild タスクを記述します。msbuild タスクの実装は、github [1] の script# リポジトリで確認でき、それを基にしています...ソースの履歴を振り返って、msbuild タスクがこれをどのように提供していたかを確認することもできます。
#2 に対処するには、ページごとに厳密に 1 つの特定のスクリプト ファイルを使用するよりも、アプリのシナリオに応じて意味のあるスクリプトのセットを検討し、そのようにロードする方がはるかに優れています (キャッシュや http 要求などを考慮すると. )。
したがって、複数のページのスクリプトが 1 つのスクリプトに結合されていると仮定します。次に、指定されたページに適切なスクリプトをロードするという質問に対処します。これが私がやったことです:
私のページでは、 body タグに次のように注釈を付けています。
<body id="editPage">
私のスクリプト#には、次のものがあります。
internal static class EditPage {
static EditPage() {
jQuery.OnDocumentReady(delegate() {
if (Document.BodyElement.ID == "editPage") {
// Code you want to run on editPage
}
});
}
}
これを実現するにはさまざまな方法がありますが、適切な API を呼び出すために、すべてのページに厳密に少しのコードを記述する必要はありません。これにより、すべてのロジックがスクリプト内に自己完結している代替案のアイデアが得られることを願っています。
script# のサンプルの 1 つ ( https://github.com/nikhilk/scriptsharp/blob/cc/samples/AroundMe/AroundMe/Page.cs#L38を参照) は、条件付き実行コードに似た処理を行います。
これの良い副作用の 1 つは、ビューがスクリプトを直接呼び出すことがないため、ほとんどのコードを内部クラスに変換できることです。むしろ、スクリプトは目立たない方法でページに動作を追加します。もちろん、スクリプトの最小化可能性が大幅に向上するという利点があります。
[1] https://github.com/nikhilk/scriptsharp