【问题标题】:ReactJS.NET - Bundles - TinyIoCResolutionException: Unable to resolve type: React.IReactEnvironmentReactJS.NET - 捆绑包 - TinyIoCResolutionException:无法解析类型:React.IReactEnvironment
【发布时间】:2015-03-02 21:08:51
【问题描述】:

我正在尝试通过 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");

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

【问题讨论】:

    标签: asp.net asp.net-mvc-4 reactjs reactjs.net


    【解决方案1】:

    我不确定这是否是我所面临的同一个问题,但我用谷歌搜索了完全相同的错误,发现这个 SO 主题是第一个热门话题,没有明确的答案,所以我想我会提供我的解决方案。


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

    this comment on 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"
                );
            }
        }
    }
    

    然后,我从Application_Start 显式调用ReactConfig.Configure

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

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

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

      如上所述here

      通过 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();
              }
          }
      }
      

      【讨论】:

      • 如何在网页上显示 .jsx 组件?你也使用 BabelBundling 吗?我问这个是因为我使用与 OP 相同的原理,但我仍然有错误。正如你所建议的,我已经使用了配置。
      • 它工作 :) 我必须安装 JavaScriptEngineSwitcher.V8.Native.win-x86,然后一切都很好。
      【解决方案4】:

      如果有人需要这个,只需安装这个 nuget,它就会解决这个问题。

      System.Web.Optimization.React

      【讨论】:

        猜你喜欢
        • 2014-09-20
        • 2015-07-04
        • 1970-01-01
        • 2018-08-13
        • 2012-06-21
        • 2015-11-22
        • 2010-12-22
        • 1970-01-01
        • 2018-05-12
        相关资源
        最近更新 更多