2017-06-15 4 views
0

Ich arbeite an dem Projekt mit ASP.Net Core (.NetCoreApp 1.1) + SpaServices + React + Redux + Webpack. Die wahre Stärke von React ist ein serverseitiges JS-Rendering. Alles funktioniert gut, wenn Sie IIS/Kestrel mit beliebten JS-Bibliotheken verwenden, aber das serverseitige Rendering bricht zusammen, wenn Sie versuchen, einige UI-Bibliotheken zu verwenden.ASP.Net Core-JavaScript-Engine

Ich verwende react-planner in meinem Projekt und es hängt von "drei" Lib, die WebGL und Canvas-Renderer bietet. Das Problem ist, dass die Standard-JS-Engine von Asp.Net Core keine 'Fenster'-Umgebung hat, die im Browser auf der Client-Seite verfügbar ist, so dass der Server einige JS-Bibliotheken nicht rendern kann. Es gibt eine Bibliothek für .Net, die JavaScriptEngineSwitcher genannt wird, aber .NetCoreApp wird nicht unterstützt. Ich sehe derzeit 3 ​​Möglichkeiten:

  1. Finden Sie eine Möglichkeit, Standard-JS-Engine zu wechseln.
  2. Server-seitiges Rendern deaktivieren.
  3. Finden Sie eine Möglichkeit, Server-Side-Rendering nur für react-planner auszuschalten.

Irgendwelche Gedanken?

+0

Ich bin nicht Sicher * alle * Javascript-Engines unterstützen 'Fenster'. 'window' ist global für einen Browser. Ich würde nach Option 3 schauen und feststellen, ob Sie serverseitig rendern oder nicht. –

+0

Es gibt eine explizite Option auf der Hauptseite der App, die definiert, ob das serverseitige Rendering verwendet werden soll oder nicht. Ich weiß nicht, wie man das serverseitige Rendering nur für ein paar Komponenten verwendet und ich weiß nicht, ob es möglich ist. – veralex

Antwort

0

Es gibt eine Bibliothek für .Net namens JavaScriptEngineSwitcher, die jedoch .NetCoreApp nicht unterstützt.

Dieses Problem wird in JavaScript Engine Switcher version 2.X und React.NET Version 3.X gelöst.

Zitat von der Dokumentation:

Wenn Sie eine Web-Anwendung erstellen auf der Grundlage der „ASP.NET Core-Web-Anwendung (.NET Core)“ Vorlage, dann werden Sie nur vier JS-Motoren haben: JavaScriptEngineSwitcher.ChakraCore, JavaScriptEngineSwitcher.Msie (funktioniert nur in den JsRT-Modi), JavaScriptEngineSwitcher.Jint und JavaScriptEngineSwitcher.Vroom.

Und jetzt über das window Objekt:

Das Problem ist, dass Asp.Net Core-Standard-JS Motor nicht über eine 'Fenster' Umgebung, die in Browser auf Client-Seite zur Verfügung steht, so Der Server kann einige JS-Bibliotheken nicht wiedergeben.

Das Objekt window ist nicht Teil der ECMAScript-Spezifikation, da es ein DOM-Objekt ist. Wahrscheinlich gibt es in Ihrem Code eine Zeile der folgenden Art ist:

var root = typeof global !== 'undefined' ? global : window; 

Um Ihren Code auf dem Server ausführen, können Sie diese Zeile mit dem folgenden Code ersetzen:

var global = this; // this line should be placed at the beginning of script 
… 
var root = global