2017-06-15 101 views
0

我正在使用的項目使用ASP.Net Core.NetCoreApp 1.1)+ SpaServices + React + Redux + Webpack。 React的真正力量是服務器端JS渲染。當您使用流行的JS庫使用IIS/Kestrel時,一切正常,但當您嘗試使用某些UI庫時,服務器端渲染會崩潰。ASP.Net核心JavaScript引擎

我在我的項目中使用react-planner,它取決於提供WebGL和canvas渲染器的'three'lib。問題是,Asp.Net Core默認的JS引擎沒有在客戶端的瀏覽器中可用的「窗口」環境,所以服務器無法渲染一些JS庫。有一個叫做JavaScriptEngineSwitcher.Net庫,但它不支持.NetCoreApp。我現在看到3種方式:

  1. 找到切換默認JS引擎的方法。
  2. 禁用服務器端呈現。
  3. 找到一種方法來僅關閉react-planner服務器端渲染。

有什麼想法?

+0

我不是確定*任何JavaScript引擎都支持'window'。 'window'是瀏覽器的全局。我會考慮選項3並檢測您是否是服務器端渲染。 –

+0

應用程序的主頁上有一個明確的選項,用於定義是否使用服務器端呈現。我不知道如何使用服務器端渲染僅用於幾個組件,我不知道是否有可能。 – veralex

回答

0

有一個名爲JavaScriptEngineSwitcher的.Net庫,但它不支持.NetCoreApp。

此問題已在JavaScript Engine Switcher version 2.X和React.NET版本3.X中解決。從文檔

報價:

如果您創建一個基於「核心ASP.NET Web應用程序(.NET核心)」的Web應用程序模板,那麼你將有隻有四個JS引擎:JavaScriptEngineSwitcher.ChakraCoreJavaScriptEngineSwitcher.Msie (僅適用於JsRT模式),JavaScriptEngineSwitcher.JintJavaScriptEngineSwitcher.Vroom

而現在關於window對象:

的問題是,Asp.Net核心默認JS引擎沒有一個「窗口」的環境,是在客戶端瀏覽器可用,所以服務器無法呈現一些JS庫。

window對象不是ECMAScript規範的一部分,因爲它是一個DOM對象。最有可能的,在你的代碼中有以下類型的線路:

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

要在服務器上執行代碼,你可以替換下面這行代碼:

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