5月にこの投稿の英語版を作成し、ReactJS.NETプロジェクトのバグトラッカーで公開しました。 最初は、この投稿をロシア語に翻訳する予定はありませんでしたが、月曜日にMskDotNet Communityの第13回会議のプログラムを見て、そのような翻訳がコミュニティに役立つと判断しました
投稿で紹介した資料をよりよく理解するために、 ReactJS.NETとJavaScript Engine Switcherについて少しお話しします。 ReactJS.NETは、JSXコードをJSコードにコンパイルする.NETライブラリです。 このライブラリは、 Reactライブラリの.NETポートではありません(c Less.jsおよびdotlessに似ています)。 ReactJS.NETの作成時には、まったく異なるアプローチが使用されました。ReactJSコードは、JSエンジンを使用して.NETから起動されます。 このJSエンジンの役割は、JavaScriptエンジンスイッチャーライブラリによって正確に実行されます。 JavaScript Engine Switcherは、一般的なJSエンジン( .Net 、 Microsoft ClearScript.V8 、 Jurassic 、 Jint 、およびChakraCore 用のMSIE JavaScriptエンジン)の基本機能にアクセスするための統合インターフェースを定義し、ライブラリまたはアプリケーションをすばやく切り替えて別のJSエンジン(提供されるJSコードがECMAScript標準と互換性があること5)。
JavaScript Engine Switcherを設計したとき、パッケージ内のライブラリ開発者はJavaScriptEngineSwitcher.Coreのみを参照し、ライブラリユーザーがJSエンジンの最適な実装を選択する機会を残すと想定しました。 これはまさに、 Bundle Transformerプロジェクトで使用しているアプローチです。 しかし、ReactJS.NETの作成者は別の方法を取りました。依存関係のリストのReact.Coreパッケージには、 MSIE 、 V8 、およびChakraCoreといういくつかのプリインストールされたJavaScript Engine Switcherモジュールが既に含まれています。 ライブラリの初期化中に、上記のエンジンのいずれかのインスタンスを作成するための連続した試行が行われ 、最初に正常に作成されたエンジンがデフォルトエンジンになります。
この動作を再定義でき、最適なエンジンを自分で選択できることに注意してください。 これを行うには、ReactJS.NETを初期化する前にJSエンジンを登録します。 ASP.NET 4.Xでは、ReactJS.NETは通常App_Start/ReactConfig.cs
初期化されApp_Start/ReactConfig.cs
([assembly: WebActivatorEx.PreApplicationStartMethod(…)]
属性により、このファイルの内容はGlobal.asax
ファイルのApplication_Start
メソッドで定義されたコードよりも早く実行されます) ASP.NET Coreはこれらの目的のためにStartup.cs
ファイルを使用します。 さらに、登録時にデフォルトのJSエンジン名を指定した場合、適切なエンジンの選択は簡略化されたスキームに従います 。
この方法は、ReactJS.NETをすぐに(JSエンジンを手動で登録することなく)使用できるため、ライブラリユーザーにとって便利です。 しかし、このアプローチには1つの重大な欠点があります-JSエンジンの選択プロセスは不透明です。 多くの場合、ユーザーは現在どのJSエンジンが使用されているかを知らず、JavaScriptエンジンスイッチャーの存在を知らない人もいます。 情報の欠如は、最初にヒントの形でバグトラッカーに表示され、次にブログ投稿の形で表示されるエラーとエラーにつながります。 誤解は、正しい情報よりも速い速度で広がる傾向があります。 ある時点で、このプロセスは制御不能になり、このような投稿を書くことが必要になります。
過去6か月間、私はReactJS.NETユーザーとJavaScript Engine Switcherが原因で発生するエラーについて頻繁に話をする必要がありました。 ケースの80%で、これらはエラーではなく、ライブラリの誤用であり、その仕組みに関する誤解が原因でした。 この投稿では、これらの誤解のほとんどを取り上げます。
ミーシー
JavaScriptEngineSwitcher.Msieモジュールが正しく機能するには、Internet Explorerがコンピューターにインストールされていれば十分です。
現時点では、ほとんどのJSライブラリはECMAScript 5で記述されています( Reactライブラリも例外ではありません)。 ECMAScript 5標準の完全なサポートは、新しいJavaScriptエンジンであるChakraがリリースされたバージョン9以降でのみInternet Explorerに登場しました。
Internet Explorer 8以前がインストールされているコンピューターでReactJS.NETをJavaScriptEngineSwitcher.Msieモジュールと組み合わせて実行すると、次のようなエラーが表示されます。
オブジェクトはこのプロパティまたはメソッドをサポートしていません
したがって、Internet Explorer 9以降またはMicrosoft EdgeがインストールされているコンピューターでのみJavaScriptEngineSwitcher.Msieを常に使用する必要があります。 理想的には、開発者のコンピューターと運用サーバーに同じブラウザーバージョンをインストールする必要があります。
サーバーに最新バージョンのブラウザーをインストールできない場合は、JavaScriptEngineSwitcher.ChakraCoreモジュールの使用を開始してください。
V8
JavaScriptEngineSwitcher.V8モジュールには、 Visual Studio 2013用のVisual C ++再頒布可能パッケージの
msvcp120.dll
およびmsvcr120.dll
が必要です。
バージョン2.2.0以降、ネイティブJavaScriptEngineSwitcher.V8モジュールビルドは、Visual Studio 2015用のVisual C ++再頒布可能パッケージの
msvcp140.dll
アセンブリに依存しています。
JavaScriptEngineSwitcher.V8パッケージにはネイティブアセンブリが含まれなくなったため、それに加えて、 ClearScript.V8パッケージをインストールする必要があります。
実際、 バージョン2.1.0以降 、JavaScriptEngineSwitcher.V8パッケージにはWindowsのネイティブアセンブリは含まれていませんが、これらのアセンブリはどこにも消えず、 JavaScriptEngineSwitcher.V8.Native.win-x86とJavaScriptEngineSwitcher.V8.Native.winの別のパッケージに移動されました。 -x64 。 したがって、JavaScriptエンジンスイッチャーとは何の関係もないClearScript.V8パッケージをインストールする必要はありません。 通常、JavaScriptEngineSwitcher.V8でClearScript.V8パッケージを使用すると、 エラーが発生します。
JavaScriptEngineSwitcher.V8.Native.*
パッケージをインストールした後、ClearScriptの作成者が推奨しているため、ネイティブアセンブリをアプリケーションディレクトリに手動でコピーする必要があります。
これらのパッケージをインストールした後、追加のアクションを実行する必要はありません。これはJavaScriptEngineSwitcher.V8の主な利点です。 ネイティブビルドは、次のツールを使用してインストールされます。
- .NET 4.XアプリケーションおよびASP.NET 4.X Webアプリケーションの場合、MSBuildスクリプトが使用されます(
JavaScriptEngineSwitcher.V8.Native.win-x64.props
) - ASP.NET 4.X Webサイトでは、PowerShellスクリプトが使用されます(たとえば、
Install.ps1
およびUninstall.ps1
)。 - .NET CoreおよびASP.NET Core Webアプリケーションの場合、
runtimes
ディレクトリとruntimes
識別子(RID)に基づくメカニズムが使用されます。
JavaScriptEngineSwitcher.V8 for .NET 4.Xでは、ネイティブアセンブリは非標準ディレクトリからロードされます。 この場合、ネイティブアセンブリは、
bin\[Debug|Release]
ディレクトリのx86
およびx64
サブディレクトリに配置されます(Webアプリケーションおよびサイトの場合は、bin
ディレクトリのみ)。
- .NET 4.XアプリケーションおよびASP.NET 4.X Webアプリケーションの場合、MSBuildスクリプトが使用されます(
64ビットバージョンのWindowsの場合、インストールする必要があるのはJavaScriptEngineSwitcher.V8.Native.win-x64パッケージのみです。
64ビットバージョンのWindowsの.NETアプリケーション、ASP.NET Webアプリケーション、およびサイトは、64ビットプロセスだけでなく、32ビットプロセスでも実行できます。 JavaScriptEngineSwitcher.V8を32ビットプロセスで正常に動作させるには、JavaScriptEngineSwitcher.V8.Native.win-x86パッケージをインストールする必要があります。 アプリケーションまたはWebサイトが実行されるプロセスがわからない場合は、両方のパッケージをインストールします。
チャクラコア
JavaScriptEngineSwitcher.ChakraCoreモジュールをWindowsで正常に動作させるには、Visual Studio 2013用の分散Visual C ++パッケージの
msvcp120.dll
およびmsvcr120.dll
が必要です 。
バージョン2.1.0以降、 Windows用のネイティブJavaScriptEngineSwitcher.ChakraCoreモジュールビルドは、Visual Studio 2015用のVisual C ++再配布可能パッケージの
msvcp140.dll
アセンブリに依存しています。
JavaScriptEngineSwitcher.ChakraCoreパッケージにはネイティブアセンブリが含まれなくなったため、それに加えて、 Microsoft.ChakraCoreパッケージをインストールする必要があります。
実際、 バージョン2.1.0以降 、JavaScriptEngineSwitcher.ChakraCoreパッケージにはネイティブアセンブリは含まれませんが、これらのアセンブリはどこにも消えず、 JavaScriptEngineSwitcher.ChakraCore.Native.win-x86とJavaScriptEngineSwitcher.ChakraCore.Native.win-x64の別のパッケージに移動しました。 したがって、JavaScriptエンジンスイッチャーとは何の関係もないMicrosoft.ChakraCoreパッケージをインストールする必要はありません。
これら2つのパッケージに加えて、さらに3つのパッケージが利用可能です。
- JavaScriptEngineSwitcher.ChakraCore.Native.win-armには、ARMバージョンのWindows用のネイティブアセンブリが含まれています。 このパッケージは、.NET Coreおよび.NET Framework 4.5とのみ互換性があります。
- JavaScriptEngineSwitcher.ChakraCore.Native.linux-x64には、64ビットLinuxディストリビューション用のネイティブアセンブリが含まれています。 このパッケージは、.NET Coreとのみ互換性があります。
- JavaScriptEngineSwitcher.ChakraCore.Native.osx-x64には、64ビットバージョンのOS X用のネイティブアセンブリが含まれています。このパッケージは.NET Coreとのみ互換性があります。
他のオペレーティングシステムのサポートが必要な場合は、公式リポジトリから次の手順を使用してChakraCoreライブラリをビルドできます 。 ChakraCoreソースコードの最新バージョンではなく、JavaScriptEngineSwitcher.ChakraCoreモジュールでサポートされているバージョンを使用する必要があります。
JavaScriptEngineSwitcher.ChakraCore.Native.*
パッケージをインストールした後、ネイティブアセンブリをbin
ディレクトリに手動でコピーする必要があります。
これらのパッケージをインストールした後、追加のアクションを実行する必要はありません。これはJavaScriptEngineSwitcher.ChakraCoreの主な利点です。 ネイティブビルドは、次のツールを使用してインストールされます。
- .NET 4.XアプリケーションとASP.NET 4.X Webアプリケーションの場合、MSBuildスクリプト(
JavaScriptEngineSwitcher.ChakraCore.Native.win-x64.props
)が使用されます。 - ASP.NET 4.X Webサイトでは、PowerShellスクリプトが使用されます(たとえば、
Install.ps1
およびUninstall.ps1
)。 - .NET CoreおよびASP.NET Core Webアプリケーションの場合、
runtimes
ディレクトリとruntimes
識別子(RID)に基づくメカニズムが使用されます。
.NET 4.XのJavaScriptEngineSwitcher.ChakraCoreバージョンは、ネイティブアセンブリを見つけるための標準パスを再定義します。 この場合、ネイティブアセンブリは、
bin\[Debug|Release]
ディレクトリのx86
、x64
およびarm
サブディレクトリに配置されます(Webアプリケーションおよびサイトの場合は、bin
ディレクトリのみ)。
- .NET 4.XアプリケーションとASP.NET 4.X Webアプリケーションの場合、MSBuildスクリプト(
64ビットバージョンのWindowsの場合、JavaScriptEngineSwitcher.ChakraCore.Native.win-x64パッケージのみをインストールする必要があります。
.NETアプリケーション、ASP.NET Webアプリケーション、および64ビットWindowsのサイトは、64ビットプロセスだけでなく、32ビットプロセスでも実行できます。 JavaScriptEngineSwitcher.ChakraCoreモジュールが32ビットプロセスで正しく機能するには、JavaScriptEngineSwitcher.ChakraCore.Native.win-x86パッケージをインストールする必要があります。 アプリケーションまたはWebサイトが実行されるプロセスがわからない場合は、両方のパッケージをインストールします。
PS:将来このような誤解を避けるために、更新されたNuGetパッケージの「リリースノート」セクションを少なくとも簡潔に読むことをお勧めします。 問題がすでに発生している場合は、 CHANGELOG.mdまたはGitHubのプロジェクトリポジトリの「リリース」セクションをお読みください。 また、 ドキュメントとバグトラッカーについても忘れないでください。
UPDATE 01/01/2019:壊れたリンクを修正し、 JavaScriptEngineSwitcher.ChakraCore.Native.*
を更新JavaScriptEngineSwitcher.ChakraCore.Native.*
パッケージ情報。 JavaScript Engine Switcher 3.Xでいくつかの変更が行われたことにも注意してください。 たとえば、Windows用のJavaScriptEngineSwitcher.V8およびJavaScriptEngineSwitcher.ChakraCoreモジュールでは、 Visual Studio 2017用のMicrosoft Visual C ++再頒布可能パッケージのインストールが必要になりました。 他の変更点については、 アプリケーションをバージョン3.Xにアップグレードする方法のドキュメントをご覧ください。