如何获取 Angular TS 文件以在 .Net Core 项目中保存时进行编译和更新?

How do I get an Angular TS file to compile and update on save in a .Net Core project?

所以我在这里用 .Net Core 在 Angular CLI 上观看了第 9 频道的视频:https://channel9.msdn.com/Shows/Visual-Studio-Toolbox/Angular-and-NET-Core

在 8:15 位置,他演示了自动同步,其中更新 Angular CLI 文件夹中的 .ts 文件在保存时编译,然后导致视图更新。我试过了,它根本不更新(除非我刷新整个页面)。

我还注意到模板不是开箱即用的(大惊喜)。我设法将其更新到较新的 Angular 版本(并且 运行 出现错误,其中模板错误地创建了 "start": "ng serve --extract-css",package.json,其中 --extract-css 无效并且不得不删除它)。我还假设 Visual Studio (2017) 会自行编译 Angular,但事实并非如此,所以我将其添加到项目文件中:

  <Target Name="NgDebug" BeforeTargets="Build" Condition=" '$(Configuration)' == 'Debug' ">
    <!--Run Angular build in debug mode (NOTE: does not support symbolic links nor junction points)-->
    <Message Importance="high" Text="Building the Angular code in debug (dev) mode ..." />
    <Exec WorkingDirectory="$(SpaRoot)" Command="ng build" />
  </Target>

  <Target Name="NgRelease" BeforeTargets="Build" Condition=" '$(Configuration)' == 'Release' ">
    <!--Run Angular build in prod mode (NOTE: does not support symbolic links nor junction points)-->
    <Message Importance="high" Text="Building the Angular code in release (prod) mode ..." />
    <Exec WorkingDirectory="$(SpaRoot)" Command="ng build --prod" />
  </Target>

这里有两个问题:

  1. 此同步功能预计今天可以使用吗?是否需要配置?
  2. 我应该自己设置 ng build 步骤,还是我应该为 ASP.Net 核心(使用 Angular CLI)模板使用不同的方法?

这里是 app.UseSpa 代码:

    app.UseSpa(spa =>
    {
        // To learn more about options for serving an Angular SPA from ASP.NET Core,
        // see https://go.microsoft.com/fwlink/?linkid=864501

        spa.Options.SourcePath = "ClientApp";

        if (env.IsDevelopment())
        {
            spa.UseAngularCliServer(npmScript: "start");
        }
    });

所以看起来正确的术语是 "Hot Module Replacement"(MHR - 又名 "Live Reloading",或 "Hot Updates/Reloading")。遵循这个答案让我走到了那里:

在此处找到缺少的部分:https://github.com/aspnet/JavaScriptServices/issues/1654#issuecomment-430053872

这两个 link 似乎都表明 Visual Studio 创建的模板已准备好用于生产而非开发。这两个问题是:

  1. 如果您在 Visual Studio 之外构建,可能会在某个时候创建​​ ClientApp\dist 文件夹。手动创建的 dist 文件夹的存在将中断实时重新加载。必须完全删除此文件夹。
  2. VS ASP.Net Core Angular CLI 模板已准备好在生产模式下提供静态文件。模板创建者无法包装部分以防止在开发模式下加载。

对于 #2,更改这些行:

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

...

public IConfiguration Configuration { get; }

...

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

...

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    ...
    app.UseSpaStaticFiles();
    ...
}

对此:

public Startup(IHostingEnvironment env, IConfiguration configuration)
{
    HostingEnvironment = env;
    Configuration = configuration;
}

...

public IHostingEnvironment HostingEnvironment { get; private set; }
public IConfiguration Configuration { get; }

...

public void ConfigureServices(IServiceCollection services)
{
    ...
    if (HostingEnvironment.IsProduction())
    {
        // In production, the Angular files will be served from this directory
        services.AddSpaStaticFiles(configuration =>
        {
            configuration.RootPath = "ClientApp/dist";
        });
    }
    ...
}

...

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    ...
    if (env.IsProduction())
    {
        app.UseSpaStaticFiles();
    }
    ...
}

但是,此时页面已完全刷新。这是因为默认情况下未启用 HMR。您必须在此处遵循正确的文档:

https://github.com/angular/angular-cli/wiki/stories-configure-hmr

如果 link 出现故障,只需使用查询 configure HMR for angular CLI.

搜索文档即可

提示:如果你需要IE9-11支持,看一下polyfills.ts文件,忽略import 'classlist.js'行,除非你需要它(否则运行 npm install --save classlist.js).