Skip to content

Commit 2e8ea86

Browse files
authored
[browser] Inline boot config (#114686)
1 parent b40903f commit 2e8ea86

File tree

11 files changed

+57
-26
lines changed

11 files changed

+57
-26
lines changed

src/mono/browser/runtime/loader/config.ts

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,10 @@ export function normalizeConfig () {
191191
config.cachedResourcesPurgeDelay = 10000;
192192
}
193193

194+
if (!config.applicationEnvironment) {
195+
config.applicationEnvironment = "Production";
196+
}
197+
194198
// ActiveIssue https://github.com/dotnet/runtime/issues/75602
195199
if (WasmEnableThreads) {
196200

@@ -219,6 +223,15 @@ export function normalizeConfig () {
219223
config.environmentVariables!["LANG"] = `${config.applicationCulture}.UTF-8`;
220224
}
221225

226+
if (config.debugLevel !== 0 && globalThis.window?.document?.querySelector("script[src*='aspnetcore-browser-refresh']")) {
227+
if (!config.environmentVariables["DOTNET_MODIFIABLE_ASSEMBLIES"]) {
228+
config.environmentVariables["DOTNET_MODIFIABLE_ASSEMBLIES"] = "debug";
229+
}
230+
if (!config.environmentVariables["__ASPNETCORE_BROWSER_TOOLS"]) {
231+
config.environmentVariables["__ASPNETCORE_BROWSER_TOOLS"] = "true";
232+
}
233+
}
234+
222235
runtimeHelpers.diagnosticTracing = loaderHelpers.diagnosticTracing = !!config.diagnosticTracing;
223236
runtimeHelpers.waitForDebugger = config.waitForDebugger;
224237

@@ -325,20 +338,6 @@ async function loadBootConfig (module: DotnetModuleInternal): Promise<void> {
325338

326339
deep_merge_config(loaderHelpers.config, loadedConfig);
327340

328-
if (!loaderHelpers.config.applicationEnvironment) {
329-
loaderHelpers.config.applicationEnvironment = "Production";
330-
}
331-
332-
if (loaderHelpers.config.debugLevel !== 0 && globalThis.window?.document?.querySelector("script[src*='aspnetcore-browser-refresh']")) {
333-
loaderHelpers.config.environmentVariables = loaderHelpers.config.environmentVariables || {};
334-
if (!loaderHelpers.config.environmentVariables["DOTNET_MODIFIABLE_ASSEMBLIES"]) {
335-
loaderHelpers.config.environmentVariables["DOTNET_MODIFIABLE_ASSEMBLIES"] = "debug";
336-
}
337-
if (!loaderHelpers.config.environmentVariables["__ASPNETCORE_BROWSER_TOOLS"]) {
338-
loaderHelpers.config.environmentVariables["__ASPNETCORE_BROWSER_TOOLS"] = "true";
339-
}
340-
}
341-
342341
function fetchBootConfig (url: string): Promise<Response> {
343342
return loaderHelpers.fetch_like(url, {
344343
method: "GET",

src/mono/browser/runtime/loader/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,7 @@ const legacyEntrypoint = createEmscripten;
1313

1414
verifyEnvironment();
1515

16+
dotnet.withConfig(/*! dotnetBootConfig */{});
17+
1618
export { dotnet, exit };
1719
export default legacyEntrypoint;

src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,9 @@ Copyright (c) .NET Foundation. All rights reserved.
188188
<_BlazorWebAssemblyStartupMemoryCache>$(BlazorWebAssemblyStartupMemoryCache)</_BlazorWebAssemblyStartupMemoryCache>
189189
<_BlazorWebAssemblyJiterpreter>$(BlazorWebAssemblyJiterpreter)</_BlazorWebAssemblyJiterpreter>
190190
<_BlazorWebAssemblyRuntimeOptions>$(BlazorWebAssemblyRuntimeOptions)</_BlazorWebAssemblyRuntimeOptions>
191+
<_WasmInlineBootConfig>$(WasmInlineBootConfig)</_WasmInlineBootConfig>
192+
<_WasmInlineBootConfig Condition="'$(_WasmInlineBootConfig)' == '' and '$(_TargetingNET100OrLater)' == 'true' and '$(WasmBootConfigFileName)' == ''">true</_WasmInlineBootConfig>
193+
<_WasmInlineBootConfig Condition="'$(_WasmInlineBootConfig)' == ''">false</_WasmInlineBootConfig>
191194
<!-- true = wasm assets will have hard fingerprint; false = wasm assets won't have even soft fingerprint -->
192195
<_WasmFingerprintAssets>$(WasmFingerprintAssets)</_WasmFingerprintAssets>
193196
<_WasmFingerprintAssets Condition="'$(_WasmFingerprintAssets)' == '' and '$(_TargetingNET90OrLater)' == 'true'">true</_WasmFingerprintAssets>
@@ -197,10 +200,12 @@ Copyright (c) .NET Foundation. All rights reserved.
197200
<_WasmFingerprintDotnetJs Condition="'$(_WasmFingerprintDotnetJs)' == ''">$(OverrideHtmlAssetPlaceholders)</_WasmFingerprintDotnetJs>
198201
<_WasmFingerprintDotnetJs Condition="'$(_WasmFingerprintDotnetJs)' == ''">false</_WasmFingerprintDotnetJs>
199202
<!-- true = boot config will have hard fingerprint; false = boot config will have soft fingerprint -->
200-
<_WasmFingerprintBootConfig>$(WasmFingerprintBootConfig)</_WasmFingerprintBootConfig>
203+
<_WasmFingerprintBootConfig Condition="'$(_WasmInlineBootConfig)' == 'true'">$(_WasmFingerprintDotnetJs)</_WasmFingerprintBootConfig>
204+
<_WasmFingerprintBootConfig Condition="'$(_WasmFingerprintBootConfig)' == ''">$(WasmFingerprintBootConfig)</_WasmFingerprintBootConfig>
201205
<_WasmFingerprintBootConfig Condition="'$(_WasmFingerprintBootConfig)' == ''">$(OverrideHtmlAssetPlaceholders)</_WasmFingerprintBootConfig>
202206
<_WasmFingerprintBootConfig Condition="'$(_WasmFingerprintBootConfig)' == ''">false</_WasmFingerprintBootConfig>
203207
<_WasmBootConfigFileName>$(WasmBootConfigFileName)</_WasmBootConfigFileName>
208+
<_WasmBootConfigFileName Condition="'$(_WasmBootConfigFileName)' == '' and '$(_TargetingNET100OrLater)' == 'true' and '$(_WasmInlineBootConfig)' == 'true'">dotnet.js</_WasmBootConfigFileName>
204209
<_WasmBootConfigFileName Condition="'$(_WasmBootConfigFileName)' == '' and '$(_TargetingNET100OrLater)' == 'true'">dotnet.boot.js</_WasmBootConfigFileName>
205210
<_WasmBootConfigFileName Condition="'$(_WasmBootConfigFileName)' == ''">blazor.boot.json</_WasmBootConfigFileName>
206211
<_WasmPublishBootConfigFileName>publish.$(_WasmBootConfigFileName)</_WasmPublishBootConfigFileName>
@@ -259,6 +264,11 @@ Copyright (c) .NET Foundation. All rights reserved.
259264
<Output TaskParameter="FilesToRemove" ItemName="_WasmBuildFilesToRemove" />
260265
</ComputeWasmBuildAssets>
261266

267+
<ItemGroup Condition="'$(_WasmInlineBootConfig)' == 'true'">
268+
<_WasmDotnetJsForBuild Include="@(ReferenceCopyLocalPaths)" Condition="'%(FileName)%(Extension)' == 'dotnet.js'" />
269+
<_BuildAssetsCandidates Remove="@(_WasmDotnetJsForBuild)" />
270+
</ItemGroup>
271+
262272
<PropertyGroup>
263273
<_WasmBuildWebCilPath>$([MSBuild]::NormalizeDirectory($(IntermediateOutputPath), 'webcil'))</_WasmBuildWebCilPath>
264274
<_WasmBuildTmpWebCilPath>$([MSBuild]::NormalizeDirectory($(IntermediateOutputPath), 'tmp-webcil'))</_WasmBuildTmpWebCilPath>
@@ -376,6 +386,7 @@ Copyright (c) .NET Foundation. All rights reserved.
376386
DebugLevel="$(WasmDebugLevel)"
377387
LinkerEnabled="false"
378388
CacheBootResources="$(BlazorCacheBootResources)"
389+
MergeWith="@(_WasmDotnetJsForBuild)"
379390
OutputPath="$(_WasmBuildBootJsonPath)"
380391
ConfigurationFiles="@(_WasmJsConfigStaticWebAsset)"
381392
LazyLoadedAssemblies="@(BlazorWebAssemblyLazyLoad)"
@@ -503,6 +514,10 @@ Copyright (c) .NET Foundation. All rights reserved.
503514
<Output TaskParameter="PromotedAssets" ItemName="_PromotedWasmPublishStaticWebAssets" />
504515
<Output TaskParameter="FilesToRemove" ItemName="_PublishResolvedFilesToRemove" />
505516
</ComputeWasmPublishAssets>
517+
518+
<ItemGroup Condition="'$(_WasmInlineBootConfig)' == 'true'">
519+
<_WasmDotnetJsForPublish Include="@(ResolvedFileToPublish)" Condition="'%(FileName)%(Extension)' == 'dotnet.js'" />
520+
</ItemGroup>
506521

507522
<PropertyGroup>
508523
<_WasmPublishWebCilPath>$([MSBuild]::NormalizeDirectory($(IntermediateOutputPath), 'webcil', 'publish'))</_WasmPublishWebCilPath>
@@ -679,6 +694,7 @@ Copyright (c) .NET Foundation. All rights reserved.
679694
DebugLevel="$(WasmDebugLevel)"
680695
LinkerEnabled="$(PublishTrimmed)"
681696
CacheBootResources="$(BlazorCacheBootResources)"
697+
MergeWith="@(_WasmDotnetJsForPublish)"
682698
OutputPath="$(IntermediateOutputPath)$(_WasmPublishBootConfigFileName)"
683699
ConfigurationFiles="@(_WasmPublishConfigFile)"
684700
LazyLoadedAssemblies="@(BlazorWebAssemblyLazyLoad)"

src/mono/wasm/Wasm.Build.Tests/BrowserStructures/BuildOptions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public BuildOptions(
2323
bool WarnAsError = true,
2424
RuntimeVariant RuntimeType = RuntimeVariant.SingleThreaded,
2525
IDictionary<string, string>? ExtraBuildEnvironmentVariables = null,
26-
string BootConfigFileName = "dotnet.boot.js",
26+
string? BootConfigFileName = null,
2727
string NonDefaultFrameworkDir = "",
2828
string ExtraMSBuildArgs = "",
2929
bool WasmPerfTracing = false

src/mono/wasm/Wasm.Build.Tests/BrowserStructures/MSBuildOptions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public abstract record MSBuildOptions
2222
bool WarnAsError = true,
2323
RuntimeVariant RuntimeType = RuntimeVariant.SingleThreaded,
2424
IDictionary<string, string>? ExtraBuildEnvironmentVariables = null,
25-
string BootConfigFileName = "dotnet.boot.js",
25+
string? BootConfigFileName = null,
2626
string NonDefaultFrameworkDir = "",
2727
string ExtraMSBuildArgs = "",
2828
bool WasmPerfTracing = false

src/mono/wasm/Wasm.Build.Tests/BrowserStructures/PublishOptions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public PublishOptions(
2626
bool WarnAsError = true,
2727
RuntimeVariant RuntimeType = RuntimeVariant.SingleThreaded,
2828
IDictionary<string, string>? ExtraBuildEnvironmentVariables = null,
29-
string BootConfigFileName = "dotnet.boot.js",
29+
string? BootConfigFileName = null,
3030
string NonDefaultFrameworkDir = "",
3131
string ExtraMSBuildArgs = "",
3232
bool BuildOnlyAfterPublish = true,

src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -366,14 +366,17 @@ private string[] GetFilesMatchingNameConsideringFingerprinting(string filePath,
366366
dict[Path.GetFileName(file)] = (file, unchanged);
367367

368368
// those files do not change on re-link
369-
dict["dotnet.js"]=(Path.Combine(paths.BinFrameworkDir, "dotnet.js"), true);
369+
dict["dotnet.js"]=(Path.Combine(paths.BinFrameworkDir, "dotnet.js"), false); // Inline boot config
370370
dict["dotnet.js.map"]=(Path.Combine(paths.BinFrameworkDir, "dotnet.js.map"), true);
371371
dict["dotnet.runtime.js"]=(Path.Combine(paths.BinFrameworkDir, "dotnet.runtime.js"), true);
372372
dict["dotnet.runtime.js.map"]=(Path.Combine(paths.BinFrameworkDir, "dotnet.runtime.js.map"), true);
373373

374374
if (IsFingerprintingEnabled)
375375
{
376376
string bootJsonPath = Path.Combine(paths.BinFrameworkDir, "dotnet.boot.js");
377+
if (!File.Exists(bootJsonPath))
378+
bootJsonPath = Path.Combine(paths.BinFrameworkDir, "dotnet.js"); // inline boot config
379+
377380
BootJsonData bootJson = GetBootJson(bootJsonPath);
378381
var keysToUpdate = new List<string>();
379382
var updates = new List<(string oldKey, string newKey, (string fullPath, bool unchanged) value)>();
@@ -493,7 +496,7 @@ private BootJsonData GetBootJson(string bootJsonPath)
493496
public BootJsonData AssertBootJson(AssertBundleOptions options)
494497
{
495498
EnsureProjectDirIsSet();
496-
string bootJsonPath = Path.Combine(options.BinFrameworkDir, options.BuildOptions.BootConfigFileName);
499+
string bootJsonPath = Path.Combine(options.BinFrameworkDir, options.BuildOptions.BootConfigFileName ?? "dotnet.js");
497500
BootJsonData bootJson = GetBootJson(bootJsonPath);
498501
string spcExpectedFilename = $"System.Private.CoreLib{WasmAssemblyExtension}";
499502

src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ public virtual (string projectDir, string buildOutput) BuildProject(
163163

164164
buildOptions.ExtraBuildEnvironmentVariables["TreatPreviousAsCurrent"] = "false";
165165

166-
if (buildOptions.BootConfigFileName != "dotnet.boot.js")
166+
if (buildOptions.BootConfigFileName != null)
167167
{
168168
// Omit implicit default
169169
buildOptions = buildOptions with { ExtraMSBuildArgs = $"{buildOptions.ExtraMSBuildArgs} -p:WasmBootConfigFileName={buildOptions.BootConfigFileName}" };

src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ protected override IReadOnlyDictionary<string, bool> GetAllKnownDotnetFilesToFin
4040
{ "dotnet.diagnostics.js.map", false },
4141
};
4242

43-
if (assertOptions.BuildOptions.BootConfigFileName.EndsWith(".js"))
43+
if (assertOptions.BuildOptions.BootConfigFileName?.EndsWith(".js") ?? false)
4444
result[assertOptions.BuildOptions.BootConfigFileName] = false;
4545

4646
return result;
@@ -76,7 +76,7 @@ protected override IReadOnlySet<string> GetDotNetFilesExpectedSet(AssertBundleOp
7676
res.Add("dotnet.diagnostics.js.map");
7777
}
7878

79-
if (assertOptions.BuildOptions.BootConfigFileName.EndsWith(".js"))
79+
if (assertOptions.BuildOptions.BootConfigFileName?.EndsWith(".js") ?? false)
8080
res.Add(assertOptions.BuildOptions.BootConfigFileName);
8181

8282
return res;

src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/BootJsonBuilderHelper.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,23 @@ public bool IsCoreAssembly(string fileName)
4747
return false;
4848
}
4949

50-
public void WriteConfigToFile(BootJsonData config, string outputPath, string? outputFileExtension = null)
50+
public void WriteConfigToFile(BootJsonData config, string outputPath, string? outputFileExtension = null, string? mergeWith = null)
5151
{
5252
var output = JsonSerializer.Serialize(config, JsonOptions);
5353

5454
outputFileExtension ??= Path.GetExtension(outputPath);
5555
Log.LogMessage($"Write config in format '{outputFileExtension}'");
56-
if (outputFileExtension == ".js")
56+
if (mergeWith != null)
57+
{
58+
string existingContent = File.ReadAllText(mergeWith);
59+
output = existingContent.Replace("/*! dotnetBootConfig */{}", $"/*json-start*/{output}/*json-end*/");
60+
if (existingContent.Equals(output))
61+
Log.LogError($"Merging boot config into '{mergeWith}' failed to find the placeholder.");
62+
}
63+
else if (outputFileExtension == ".js")
64+
{
5765
output = $"export const config = /*json-start*/{output}/*json-end*/;";
66+
}
5867

5968
File.WriteAllText(outputPath, output);
6069
}

0 commit comments

Comments
 (0)