Как получить файл Angular TS для компиляции и обновления при сохранении в проекте .Net Core? - PullRequest
0 голосов
/ 17 января 2019

Итак, я смотрел видео 9 канала на Angular CLI с .Net Core здесь: https://channel9.msdn.com/Shows/Visual-Studio-Toolbox/Angular-and-NET-Core

В позиции 8:15 он демонстрирует автосинхронизацию, при которой обновление файла .ts в папке Angular CLI, скомпилированного при сохранении, затем привело к обновлению представления. Я пробовал это, он не обновляется вообще (если я не обновляю всю страницу).

Я также заметил, что шаблон не работает из коробки (большой сюрприз). Мне удалось обновить его до более новой версии 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 Core (с 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");
        }
    });

1 Ответ

0 голосов
/ 19 января 2019

Таким образом, похоже, что правильная терминология - «Горячая замена модуля» (MHR - AKA «Живая перезагрузка» или «Горячие обновления / перезагрузка»). После этого ответа я получил часть пути:

https://stackoverflow.com/a/50934814/1236397

Отсутствующая часть найдена здесь: https://github.com/aspnet/JavaScriptServices/issues/1654#issuecomment-430053872

Кажется, что обе эти ссылки предполагают, что шаблон Visual Studio создается в готовом для производства, а не в разработке. Два вопроса:

  1. Папка ClientApp\dist может быть создана в какой-то момент, если вы создаете вне Visual Studio. Наличие созданной вручную папки 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

Если ссылка вообще не работает, просто найдите документацию с помощью запроса configure HMR for angular CLI.

Совет: если вам нужна поддержка IE9-11, взгляните на файл polyfills.ts и игнорируйте строку import 'classlist.js', если она вам не нужна (в противном случае запустите npm install --save classlist.js).

...