ReactJS.NET - 捆绑包 - TinyIoCResolutionException:无法解析类型:React.IReactEnvironment

IT技术 asp.net asp.net-mvc-4 reactjs reactjs.net
2021-04-07 07:30:29

我正在尝试通过 System.Web.Optimization.React 使用 ASP.NET 缩小和优化来缩小我的 .JSX 文件。我已经安装了 MVC4 React 包以及优化包,但是每当我尝试包含一个包时,我都会得到以下信息:

React.TinyIoC.TinyIoCResolutionException: Unable to resolve type: React.IReactEnvironment

InnerException 总是 null

我的捆绑包设置如下:

bundles.Add(new ScriptBundle("~/Bundle/Scripts/ReactJS").Include(
                "~/Scripts/React/react-0.12.2.js",
                "~/Scripts/React/react-with-addons-0.12.2.js",
                "~/Scripts/React/JSXTransformer-0.12.2.js"
            ));

        bundles.Add(new JsxBundle("~/Bundle/Scripts/ReactCalendar").Include(
                "~/Scripts/React/Calendar/Main.react.jsx",
                "~/Scripts/React/Calendar/Components/Calendar.react.jsx",
                "~/Scripts/React/Calendar/Components/CalendarEvent.react.jsx",
                "~/Scripts/React/Calendar/Components/CalendarControls.react.jsx",
                "~/Scripts/React/Calendar/Components/CalendarTimeSlots.react.jsx"
            ));

并包含在视图中:

@section scripts{
    @Scripts.Render("~/Bundle/Scripts/ReactJS");
    @Scripts.Render("~/Bundle/Scripts/ReactCalendar");
}

错误总是在线抛出:

@Scripts.Render("~/Bundle/Scripts/ReactCalendar");

有人对如何解决/调试这个问题有任何想法吗?如果需要更多信息,请告诉我。

3个回答

我不确定这是否与我面临的问题相同,但我在 google 上搜索了完全相同的错误,发现这个 SO 主题是第一次命中,没有明确的答案,所以我想我会提供我的解决方案。


我在 MVC 应用程序中使用 .NET 4.5 和 React.Web.Mvc4 v3.0.0。

在 Github 上这条评论的帮助下,我设法解决了这个问题

这是我的全部内容ReactConfig.cs

using React;
using React.TinyIoC;
using React.Web.TinyIoC;

namespace NS.Project
{
    public static class ReactConfig
    {
        public static void Configure()
        {
            Initializer.Initialize(AsPerRequestSingleton);

            ReactSiteConfiguration.Configuration
                .SetLoadBabel(false)
                .AddScriptWithoutTransform("~/React/dist/server.bundle.js");
        }

        private static TinyIoCContainer.RegisterOptions AsPerRequestSingleton(
            TinyIoCContainer.RegisterOptions registerOptions)
        {
            return TinyIoCContainer.RegisterOptions.ToCustomLifetimeManager(
                registerOptions,
                new HttpContextLifetimeProvider(),
                "per request singleton"
            );
        }
    }
}

然后,我ReactConfig.ConfigureApplication_Start.

无法解析类型:React.IReactEnvironment ”没有 InnerException 通常意味着 ReactJS.NET 由于某种原因没有正确初始化。在网络应用程序,ReactJS.NET把手初始化通过使用WebActivator确保您的项目正在引用React.WebReact.Web.Mvc4WebActivatorEx,并且所有相应的 .dll 文件都在您的应用程序bin目录中。

此外,您不需要(也不应该)在 JavaScript 包中包含 JSXTransformer,因为 ReactJS.NET 会在服务器端完成所有 JSX 编译。

我不确定init是否会调用PreApplication方法……有没有办法检查/强制使用此方法?(感谢到目前为止的帮助!)
2021-05-29 07:30:29
嗯,WebActivator 应该会自动调用 ReactJS.NET init 方法。我想说您可以React.Web.WebInitializer.Initialize()在 Application_Start 事件 (in Global.asax.cs) 中添加显式调用,但类是internal. public如果您愿意,您可以将其修改为或通过反射调用它。你在什么网络服务器上运行?您是从 Visual Studio 运行项目吗?使用内置服务器、IIS Express 还是 IIS?
2021-06-12 07:30:29
将 WebInitializer 类修改为公开的,我看到现在正在调用 Initialize 方法,但现在出现错误:Cannot register a module after the application has been initialized.- 第 31 行,WebInitializer.cs - DynamicModuleUtility.RegisterModule(typeof(IocPerRequestDisposal));- 就其value而言,这是一个庞大的项目 - 很可能会出现并发症带有 Web Activator 和其他软件包。一如既往,非常感谢您的帮助。
2021-06-18 07:30:29
抱歉让您久等了-所有参考资料都在那里,而且一切似乎都符合要求-我目前正在挖掘源代码以查看是否有任何内容出现...
2021-06-20 07:30:29
想过修改对公众号的内部调用,午饭后试试。通过 Visual Studio 和 IIS 将站点作为 Web 应用程序运行
2021-06-20 07:30:29

从 React.Web.MVc4 版本 4.0.0 看起来有些变化。之前的版本没有这个问题。

如规定在这里

通过 NuGet 安装 React.Web.Mvc4 包。您还需要安装一个 JS 引擎才能使用(推荐使用 V8 或 ChakraCore)。有关更多信息,请参阅 JSEngineSwitcher 文档。

要使用 V8,请添加以下包:

JavaScriptEngineSwitcher.V8
JavaScriptEngineSwitcher.V8.Native.win-x64

ReactConfig.cs 将自动为您生成。更新它以注册一个 JS 引擎和你的 JSX 文件:

using JavaScriptEngineSwitcher.Core;
using JavaScriptEngineSwitcher.V8;

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(React.Sample.Mvc4.ReactConfig), "Configure")]

namespace React.Sample.Mvc4
{
    public static class ReactConfig
    {
        public static void Configure()
        {
            ReactSiteConfiguration.Configuration
                .AddScript("~/Content/Sample.jsx");

            JsEngineSwitcher.Current.DefaultEngineName = V8JsEngine.EngineName;
            JsEngineSwitcher.Current.EngineFactories.AddV8();
        }
    }
}
它有效:) 我必须安装 JavaScriptEngineSwitcher.V8.Native.win-x86,然后一切都很好。
2021-05-31 07:30:29
你如何在网页上显示 .jsx 组件?你也使用 BabelBundling 吗?我问这个是因为我使用与 OP 相同的原则,但我仍然有错误。我已经使用了配置,就像你建议的那样。
2021-06-10 07:30:29