Я пытаюсь создать SSR Angular 7 с использованием ядра dotnet для его размещения, в шаблоне по умолчанию используется angular 5, а у MS есть документация, чтобы запустить SSR на нем (что отлично работает). Я пробовал обновить через командную строку до angular 7 и начать новый проект angular и реализовать SSR после, но я всегда получаю одну и ту же проблему, как ng build, так и ng build: SSR отлично работает из командной строки, но когда я прихожу, чтобы запустить его из VS, время ожидания истекает (что, я думаю, не имеет отношения к проблеме) после того, как выдает ошибку:
The thread 0x6608 has exited with code 0 (0x0).
The thread 0x1134 has exited with code 0 (0x0).
The thread 0x54bc has exited with code 0 (0x0).
Изменения, которые я сделал из NG5 SSR (https://go.microsoft.com/fwlink/?linkid=864501) следующие (https://github.com/aspnet/Templating/issues/593):
startup.cs
options.BootModulePath = $"{spa.Options.SourcePath}/dist-server/main.bundle.js";
к
options.BootModulePath = $"{spa.Options.SourcePath}/dist-server/main.js";
Снова добавлен проект SSR в angular.json
"ssr": {
"root": "",
"sourceRoot": "src",
"projectType": "application",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:server",
"options": {
"outputPath": "dist-server",
"main": "src/main.server.ts",
"tsConfig": "src/tsconfig.server.json"
},
"configurations": {
"production": {
"optimization": false,
"outputHashing": "media",
"sourceMap": false,
"namedChunks": false,
"extractLicenses": true,
"vendorChunk": false,
"bundleDependencies": "all",
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
}
]
}
}
}
}
}
Изменить сборку: ssr в скриптах package.json
"build:ssr": "ng build --configuration=production --project=ssr",
Код, который я выполняю - https://github.com/TPJ11/DotnetNG7SSR
Кто-нибудь знает, что я делаю не так? чувствую, что я бился головой об стену об этом :(
Что второе? ржу не могу
Что странно, когда он работает (NG5 SSR), я никогда не получаю сообщение потока, как только вижу, что я знаю, что он потерпит неудачу. Немного подробнее - он отлично запускает основной сервер IIS Express .net, он запускает сервер углового узла (ng serve), затем запускает ng build --configuration = production --project = ssr "--watch" и после этого выдает сообщение потока, однако, если я запустил его в командной строке, он работает отлично.





Правильно, поэтому не уверен, что именно ломает приложение, но у меня есть работа.
1) Создайте новое приложение .Net Core NG и удалите папку ClientApp, затем создайте пустое приложение angular 7 через CMD под названием ClientApp ng new ClientApp.
2) Выполните Руководство по настройке angulars SSR до шага 3.
3) Установите npm i aspnet-prerendering с предварительным рендерингом aspnet
4) Поменяйте местами код из шага 2c (main.server.ts), чтобы использовать код из Руководство по установке Microsoft для main.server.ts
5) Откройте файл angular.json и измените outputPath для сборки на dist, а серверный outputPath на dist-server.
6) Откройте package.json и в scripts добавьте "build:ssr": "ng run ClientApp:server"
7) Откройте tsconfig.server.json и tsconfig.app.json и измените types, чтобы включить узел "types": ["node"].
8) Откройте Startup.cs и, как показано в Руководство по установке Microsoft, добавьте
spa.UseSpaPrerendering(options =>
{
options.BootModulePath = $"{spa.Options.SourcePath}/dist-server/main.js";
options.BootModuleBuilder = env.IsDevelopment()
? new AngularCliBuilder(npmScript: "build:ssr")
: null;
options.ExcludeUrls = new[] { "/sockjs-node" };
});
Не могли бы вы подробнее описать шаги 2 и 4? Документация по этим ссылкам могла измениться, потому что она не соответствует вашим действиям. Спасибо!
Я выполнил следующий шаг, по крайней мере, он работает нормально при первом запуске.
Измените Startup.cs для использования SSR
spa.UseSpaPrerendering(options =>
{
options.BootModulePath = $"{spa.Options.SourcePath}/dist-server/main.js";
options.BootModuleBuilder = env.IsDevelopment()
? new AngularCliBuilder(npmScript: "build:ssr")
: null;
options.ExcludeUrls = new[] { "/sockjs-node" };
});
Во-первых, «Поток 0x6608 завершился с кодом 0 (0x0)». это не ошибка. Это только означает, что рабочий поток завершен, что является нормальным протоколированием.