是的,您可以在.Net Core和Angular 7中使用预渲染。
它的实现包含许多细节。 寻找.Net Core Side的BuildPrerenderer扩展方法和HomeController
public async Task Index () {
var prerenderResult = await this.Request.BuildPrerender ();
this.ViewData["SpaHtml"] = prerenderResult.Html; // our from Angular
this.ViewData["Title"] = prerenderResult.Globals["title"]; // set our
from Angularthis.ViewData["Styles"] = prerenderResult.Globals["styles"]; // put styles in the correct place
this.ViewData["Scripts"] = prerenderResult.Globals["scripts"]; // scripts (that were in our header)
this.ViewData["Meta"] = prerenderResult.Globals["meta"]; // set our SEO tags
this.ViewData["Links"] = prerenderResult.Globals["links"]; // set our etc SEO tags
this.ViewData["TransferData"] = prerenderResult.Globals["transferData"]; // our transfer data set to window.TRANSFER_CACHE = {}
...
return View();
}
BuildPrerender
public static async Task BuildPrerender(this HttpRequest request) =>
// Prerender / Serialize application (with Universal)
await Prerenderer.RenderToString(
"/",
request.HttpContext.RequestServices.GetRequiredService(),
new System.Threading.CancellationTokenSource().Token,
new JavaScriptModuleExport(request.HttpContext.RequestServices.GetRequiredService().ContentRootPath + "/ClientApp/dist/main-server"),
$"{request.Scheme}://{request.Host}{request.HttpContext.Features.Get().RawTarget}",
request.HttpContext.Features.Get().RawTarget,
// ** TransferData concept **
// Here we can pass any Custom Data we want !
// By default we're passing down Cookies, Headers, Host from the Request object here
new TransferData
{
request = request.AbstractRequestInfo(),
thisCameFromDotNET = "Hi Angular it's asp.net :)"
}, // Our simplified Request object & any other CustommData you want to send!
30000,
request.PathBase.ToString()
);
在索引View.cs中,您需要
@Html.Raw(ViewData["SpaHtml"])
在Angular Side(boot.server.ts)中
import { createServerRenderer } from 'aspnet-prerendering';
export default createServerRenderer((params) => {
// Platform-server provider configuration
const setupOptions: IEngineOptions = {
appSelector: '',
ngModule: AppModule,
request: params,
providers: [
// Optional - Any other Server providers you want to pass
// (remember you'll have to provide them for the Browser as well)
]
};
return ngAspnetCoreEngine(setupOptions).then(response => {
// Apply your transferData to response.globals
response.globals.transferData = createTransferScript({
someData: 'Transfer this to the client on the window.TRANSFER_CACHE {} object',
fromDotnet: params.data.thisCameFromDotNET // example of data coming from dotnet, in HomeController
});
return ({
html: response.html, // our serialized
globals: response.globals // all of our styles/scripts/meta-tags/link-tags for aspnet to serve up
});
});
});