2017-06-15 103 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