如果 UseSpaStaticFiles() 应该为 Angular 页面提供服务,为什么仍然需要 UseSpa()?

问题描述

在这里阅读了一些文章/博文和问题,但我仍然对 ASP.NET Core 2.1 中 UseSpaStaticFiles()UseSpa() 中间件的用法感到困惑。 (参考: What is the difference between UseStaticFiles,UseSpaStaticFiles,and UseSpa in ASP.NET Core 2.1? https://blog.steadycoding.com/usedefaultfiles-usestaticfiles-usespastaticfiles-usespa/)

我将 Angular 项目模板与 ASP.NET Core 2.1 一起使用,该模板附带了一组预定义的中间件,这些中间件已添加Startup.cs 文件中的管道中:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSpaStaticFiles(configuration =>
               {
                   configuration.RootPath = "ClientApp/dist";
               });      
}

public void Configure(IApplicationBuilder app)
{   

    app.UseStaticFiles();
    app.UseSpaStaticFiles();

   
    app.UseSpa(spa =>
    {
        if (env.IsDevelopment())
        {
            spa.UseProxyToSpaDevelopmentServer("http://localhost:4000");
        }
    });
    
}

我的困惑如下: Angular 项目是外部编译的,编译后的 js 文件位于 ClientApp/dist 文件夹中,环境也设置为生产,所以我假设 UseSpaStaticFiles() 将服务于 Angular 页面,因为 {{ 1}} 文件夹具有相应的内容。此外,ClientApp/dist 中间件在这种情况下没有用,所以我可以删除它。

然而,如果 UseSpa() 被移除,Angular 页面根本不会加载,尽管 UseSpa() 应该根据 UseSpaStaticFiles()内容提供页面. (如果 ClientApp/distUseSpaStaticFiles()添加到中间件管道中,则 Angular 页面将从 UseSpa() 文件夹成功提供,这意味着 ClientApp/dist 为其提供服务。)>

如果环境设置为生产,则根本没有配置 UseSpaStaticFiles(),它只是添加到中间件管道中。

您能帮我澄清为什么 UseSpa() 不能在没有 UseSpaStaticFiles() 的情况下提供页面,以及为什么 UseSpa() 应该始终添加到管道中,即使它不提供任何服务?我是否遗漏了导致这种行为的配置?

解决方法

UseSpa 本质上是一个包罗万象的路由处理程序,它将所有以前未处理的路由转发到您的单页应用程序。这样,您的 SPA 就可以执行客户端路由等操作,而您的服务器应用程序不必知道客户端应用程序理解的所有路由。

相比之下,UseSpaStaticFiles 是一个静态文件处理程序,它只服务于已编译的应用程序文件,例如像 app.jsvendor.js 这样的应用程序包,在它们各自的名称下,就像 UseStaticFiles 适用于 wwwroot 文件夹中的静态文件一样。