Skip to content

Commit a65c60e

Browse files
committed
Add support for React19
1 parent b2d75d7 commit a65c60e

37 files changed

Lines changed: 99559 additions & 135 deletions

src/Frontend/React19Source/package-lock.json

Lines changed: 633 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"dependencies": {
3+
"react": "^19.0.0-beta-94eed63c49-20240425",
4+
"react-dom": "^19.0.0-beta-94eed63c49-20240425"
5+
},
6+
"scripts": {
7+
"build-dotnetframework": "esbuild ./src/app.tsx --bundle --platform=browser --outfile=../../SSR.Net.DotNetFramework/Frontend/react19example.js",
8+
"build-dotnet6": "esbuild ./src/app.tsx --bundle --outfile=../../SSR.Net.DotNet6/wwwroot/react19example.js"
9+
},
10+
"devDependencies": {
11+
"esbuild": "^0.17.7"
12+
}
13+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import React from 'react';
2+
3+
interface Props{
4+
header?: string;
5+
intro?: string;
6+
text?: string;
7+
}
8+
9+
const ArticlePage = ({header, intro, text}: Props)=>{
10+
return <div><h1>{header}</h1><p style={{fontSize:'24px'}}>{intro}</p><p>{text}</p></div>
11+
}
12+
13+
export default ArticlePage;
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import React, { useState } from "react";
2+
3+
interface Link {
4+
text: string;
5+
href: string;
6+
}
7+
8+
interface Props {
9+
header?: string;
10+
links?: Link[];
11+
}
12+
13+
const FrontPage = ({ header, links }: Props) => {
14+
const [expanded, setExpanded] = useState(false);
15+
return (
16+
<div>
17+
<h1>{header}</h1>
18+
{links && (
19+
<>
20+
<button onClick={() => setExpanded(!expanded)}>Expand links</button>
21+
{expanded && (
22+
<ul>
23+
{links.map((link, idx) => (
24+
<li key={idx}>
25+
<a href={link.href}>{link.text}</a>
26+
</li>
27+
))}
28+
</ul>
29+
)}
30+
</>
31+
)}
32+
</div>
33+
);
34+
};
35+
36+
export default FrontPage;
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import * as React from 'react'
2+
import * as ReactDOMServer from 'react-dom/server'
3+
import * as ReactDOMClient from 'react-dom/client'
4+
import FrontPage from './Components/FrontPage'
5+
import ArticlePage from './Components/ArticlePage'
6+
7+
globalThis.React = React;
8+
globalThis.ReactDOMServer = ReactDOMServer;
9+
globalThis.ReactDOMClient = ReactDOMClient;
10+
globalThis.Components = {FrontPage, ArticlePage};

src/SSR.Net.DotNet6/Controllers/HomeController.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,25 @@ public ActionResult React18() {
5656
return View(renderedComponent);
5757
}
5858

59+
public ActionResult React19() {
60+
var propsJson = JsonConvert.SerializeObject(
61+
new {
62+
header = "React 19 with SSR",
63+
links = new[]{
64+
new {
65+
text = "Google.com",
66+
href = "https://www.google.com"
67+
},
68+
new {
69+
text = "Hacker news",
70+
href = "https://news.ycombinator.org"
71+
}
72+
}
73+
});
74+
var renderedComponent = _react18Renderer.RenderComponent("Components.FrontPage", propsJson);
75+
return View(renderedComponent);
76+
}
77+
5978
public ActionResult Vue3() {
6079
var propsJson = JsonConvert.SerializeObject(
6180
new {

src/SSR.Net.DotNet6/Program.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
builder.Services.AddReact17Renderer(builder.Environment);
99
builder.Services.AddReact18Renderer(builder.Environment);
10+
builder.Services.AddReact19Renderer(builder.Environment);
1011
builder.Services.AddVue3Renderer(builder.Environment);
1112

1213
var app = builder.Build();

src/SSR.Net.DotNet6/SSR.Net.DotNet6.csproj

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77
</PropertyGroup>
88

99
<ItemGroup>
10-
<PackageReference Include="JavaScriptEngineSwitcher.Core" Version="3.19.0" />
11-
<PackageReference Include="JavaScriptEngineSwitcher.V8" Version="3.20.10" />
12-
<PackageReference Include="Microsoft.ClearScript.Core" Version="7.3.7" />
13-
<PackageReference Include="Microsoft.ClearScript.V8.Native.win-x64" Version="7.3.7" />
14-
<PackageReference Include="Microsoft.ClearScript.V8.Native.win-x86" Version="7.3.7" />
10+
<PackageReference Include="JavaScriptEngineSwitcher.Core" Version="3.24.1" />
11+
<PackageReference Include="JavaScriptEngineSwitcher.V8" Version="3.24.2" />
12+
<PackageReference Include="Microsoft.ClearScript.Core" Version="7.4.5" />
13+
<PackageReference Include="Microsoft.ClearScript.V8.Native.win-x64" Version="7.4.5" />
14+
<PackageReference Include="Microsoft.ClearScript.V8.Native.win-x86" Version="7.4.5" />
1515
</ItemGroup>
1616

1717
<ItemGroup>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using JavaScriptEngineSwitcher.V8;
2+
using SSR.Net.Services;
3+
4+
namespace SSR.Net.DotNet6.Services
5+
{
6+
public static class ServiceCollectionExtensionsReact19SSR
7+
{
8+
public static void AddReact19Renderer(this IServiceCollection services, IWebHostEnvironment webHostEnvironment)
9+
{
10+
var pool = new JavaScriptEnginePool(new V8JsEngineFactory(), config =>
11+
config
12+
.AddScriptFile(Path.Combine(webHostEnvironment.WebRootPath, "React19TextEncoderPolyfill.js"))
13+
.AddScriptFile(Path.Combine(webHostEnvironment.WebRootPath, "react19example.js"))
14+
);
15+
services.AddSingleton(new React19Renderer(pool));
16+
}
17+
}
18+
}

src/SSR.Net.DotNet6/Views/Home/Index.cshtml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
<ul>
99
<li>@Html.ActionLink("React 17","React17")</li>
1010
<li>@Html.ActionLink("React 18","React18")</li>
11+
<li>@Html.ActionLink("React 19","React19")</li>
1112
<li>@Html.ActionLink("Vue 3","Vue3")</li>
1213
</ul>
1314
</body>

0 commit comments

Comments
 (0)