.NET Core 2.X MVC, React, Typescript, Конфигурация Webpack - PullRequest
0 голосов
/ 23 февраля 2019

Я изо всех сил пытаюсь обновить свое приложение .NET Core и не уверен, каким образом мне нужно действовать.Это старый веб-сайт, который изначально создавался с использованием страниц Asp.NET и Razor, и сейчас я пытаюсь ускорить его и обновить пользовательский интерфейс, чтобы он соответствовал новым библиотекам и методам (React, Angular и т. Д.).

Поскольку перепрограммирование всего пользовательского интерфейса не было в пределах допустимого времени, казалось, что React будет подходящим вариантом.Поэтому я создал новое приложение React, используя

create-react-app client-app --scripts-version=react-scripts-ts

в папке области MVC (каждая область должна иметь свое собственное приложение), и я могу обслуживать и собирать клиента с помощью Power Shellи все отлично работает.

У меня проблема с перемещением выходного каталога сгенерированных скриптов в папку wwwroot.Мне нужно иметь возможность загружать сценарии из wwwroot, поскольку я не могу использовать SPA-сервисы из-за маршрутизации, фильтров и других проблем с существующим проектом.

Это моя первая попытка использования React, поэтому я решил, чтобыло бы легко изменить вывод файлов, но я не могу понять, как.

Я обновил tsconfig.json, чтобы изменить каталог вывода с помощью

"outDir": "../../../wwwroot/areas",

И это, похоже, ничего не дает, единственный способ, которым я смог получить какие-либо результаты, этоудаляя проект React, используя npm run eject, я получаю кучу файлов, включая файлы webpack.config.prod.ts и webpack.config.dev.ts.Когда я сделал это, я заметил, что каталог закодирован в wepack.config.ts.

После поиска в Интернете ответа, я заметил, что некоторые статьи рекомендуют использовать webpack-cli вместо npm и указывать файл конфигурации,Но когда я делаю это, я получаю множество ошибок, говорящих о том, что файл конфигурации не находится в корневом каталоге, поэтому я попытался переместить его в каталог ./src, затем я получил другую ошибку, что модуль входа не может быть найден, потому что он не могНе удается найти каталог ./src, но я не могу найти, откуда он ссылается на src.

Большая часть информации, которую я могу найти по этому вопросу, либо устарела, либо просто не работает.Даже сайт Typescript.org все еще ссылается на .NET Core 1.X.

Я нашел это ReactJS.NET , но, похоже, он не очень актуален, и пример, который они не загружали, дал массу ошибок.

Есть ли простой способ настроить React для этого сайта или я вынужден использовать старые библиотеки, такие как AngularJS или KnockOut?Можно ли настроить React таким образом, чтобы он обслуживал пользовательский интерфейс и позволял мне по-прежнему использовать страницы Razor?

1 Ответ

0 голосов
/ 28 февраля 2019

Мне удалось получить эту настройку так, как мне нужно, включая замену горячего модуля Webpack.

Чтобы получить контроль над необходимой конфигурацией, мне нужно было извлечь react-client-app, выполнив:

`npm run eject`

Это создаст несколько каталогов и файлов в корневом каталоге вашего приложения,они содержат конфигурации веб-пакетов как для производства, так и для отладки.

Для моего проекта я не хотел папок static/, чтобы изменить вывод файлов, в webpack.config есть несколько областейкоторый управляет ими, например:

webpack.config.js

output: {
  ...
  filename: 'js/[name].js',
  chunkFilename: 'js/[name].chunk.js',
  ...
},

....

// "url" loader works like "file" loader except that it embeds assets
// smaller than specified limit in bytes as data URLs to avoid requests.
// A missing `test` is equivalent to a match.
{
   test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/, /\.svg$/],
   loader: require.resolve('url-loader'),
   options: {
      limit: 10000,
      name: 'media/[name].[ext]',
   },
},

...

По какой-то причине стандартный шаблон React TS (create-react-app <name> --typescript) не ссылается на tsconfig.json.Одним из ключей для этого было установить tsconfig-paths-webpack-plugin.При этом используются пути, определенные в tsconfig.json для разрешения псевдонимов и путей, это позволяет включать модули из пользовательских путей вместо использования относительных путей, таких как:

import <name> from 'core/common/<name>';

Следующим элементом бизнеса было добавлениеЗапись homepage в package.json:

{
   "name": "<AppName>",
   "homepage": "/<AreaName>",
   "version": "0.1.0",
   ...
}

Это добавит значение homepage к путям и направит его в правую область.Первоначально я думал, что мне нужно было собрать клиент вручную, а не использовать Javascript Services (Spa), но это не так.Использование Spa для разных областей действительно делает вещи красивыми и опрятными, поэтому нет смысла выводить в папку wwwroot, поскольку для SpaStaticFiles можно указать любой корень и путь.Следующим шагом было обновление файла Startup.cs для добавления служб Javascript.

Startup.cs

  public IServiceProvider ConfigureServices(IServiceCollection services)
  {
     // In production, the Angular files will be served from this directory
     services.AddSpaStaticFiles(configuration =>
     {
        // Adds the path to the React files
        configuration.RootPath = "Areas/<AreaName>/ClientApp/build";
     });

     return services.ConfigureApplicationServices(Configuration);
  }

  application.UseSpaStaticFiles(new StaticFileOptions
  {
     // This is the key to getting things working, this is the path of the Area
     RequestPath = "/<AreaName>",
  });

  application.UseSpa(spa =>
  {
     spa.Options.SourcePath = "Areas/<AreaName>/ClientApp";

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

Приложение React теперь обслуживается из Района.Нет необходимости копировать файлы в wwwroot, поскольку Javascript Servies позаботится об этом, просто укажите все файлы, которые были в корневом каталоге, к пути будет добавлено значение homepage.

Наконец, чтобы загрузить приложение, я инициировал приложение через стандартный Controller / View и использовал скомпилированный index.html, чтобы получить требуемый импорт для возврата.

View

@{
   Layout = null;
}
<!doctype html>
<html lang="en">
<head>
   <meta charset="utf-8" />
   <link rel="shortcut icon" href="/<AreaName>/favicon.ico" />
   <meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no" />
   <meta name="theme-color" content="#000000" />
   <link rel="manifest" href="/<AreaName>/manifest.json" />
   <title>React App</title>

   <!-- Webpack Styles -->
   <link href="/<AreaName>/css/vendors~main.chunk.css" rel="stylesheet">
   <link href="/<AreaName>/css/main.css" rel="stylesheet">
</head>
<body>
   <noscript>You need to enable JavaScript to run this app.</noscript>

   <div id="root"></div>

   <!-- Webpack Scripts -->
   <script src="/<AreaName>/js/vendors~main.chunk.js"></script>
   <script src="/<AreaName>/js/main.js"></script>
</body>
</html>

Чтобы react-router-dom работал правильно с MVC и его маршрутами, вам нужно использовать HashRouter вместо BrowserRouter.

Примечание: Если вы используете npm run build перед запуском сеанса разработкиБудут использоваться файлы, собранные для производства, а не файлы для отладки.Это вызовет некоторую путаницу, поскольку ничего не будет обновляться.Чтобы все обновлялось при внесении изменений, просто удалите каталог ./build и снова запустите.

Я надеюсь, что я включил все, если не просто опубликовать комментарий, и я добавлю то, что я пропустил.

...