Blazor:如何在JS文件压缩/加载来自不同域的Blazor应用程序之前运行我的命令



TL;DR:在构建/发布期间(在asp.net核心Blazor应用程序中(是否有一个用于JS文件压缩的Target,我可以在csproj中使用它来在此Target之前运行我的脚本?

背景:
我有Blazor前端应用程序,它被加载到不同的web应用程序(不同的域(。所以:主应用程序加载许多其他应用程序,其中一个应用程序是Blazor应用程序(托管在不同的URL(。

我所做的:我手动加载_framework/blazor.webassembly.jsautostart属性设置为false,然后手动启动Blazor:

Blazor.start({
loadBootResource: (
type: string,
name: string,
defaultUri: string,
integrity: string
) => {
const newUrl = ...;// here I can make some URL replacements for defaultUri
// so my `newUrl` points to place where Blazor app is hosted
return newUrl;
},
})

类似于这里所描述的:https://learn.microsoft.com/en-us/aspnet/core/blazor/host-and-deploy/webassembly?view=aspnetcore-3.1#自定义引导资源加载

它工作正常,但有一个文件未通过loadBootResource加载。它是blazor.boot.json。加载此文件的代码位于blazor.webassembly.js(fetch("_framework/blazor.boot.json"...(中:https://github.com/dotnet/aspnetcore/blob/master/src/Components/Web.JS/src/Platform/BootConfig.ts#L6

本期还介绍了问题https://github.com/dotnet/aspnetcore/issues/22220

我还提出了一些可能的解决方案:https://github.com/dotnet/aspnetcore/issues/22220#issuecomment-683783971

我决定替换blazor.webassembly.js的内容(用fetch(${someGlobalVariableForSpecificDomainURL}/_framework/blazor.boot.json替换fetch("_framework/blazor.boot.json"(,但也有压缩文件(GZ和BR(。如何在压缩开始之前但在JS文件生成之后运行我的脚本进行替换?有可能吗?我可以在csproj中使用Target吗?我不想禁用dotnet文件压缩,也不想覆盖压缩的文件(自己压缩(。

我当前的csproj包含这样的内容(脚本在压缩后启动太晚了(:

<Target Name="ReplacementDuringBuild" BeforeTargets="Build">
<Exec WorkingDirectory="$(MyDirWithScripts)" Command="node replace.js --output=$(MSBuildThisFileDirectory)$(OutDir)" />
</Target>
<Target Name="ReplacementDuringPublish" AfterTargets="AfterPublish">
<Exec WorkingDirectory="$(MyDirWithScripts)" Command="node replace.js --output=$(MSBuildThisFileDirectory)$(PublishDir)" />
</Target>

谢谢你的帮助或任何建议!如果还有另一种解决主要问题的方法,那么我会很高兴看到它(base标签不起作用;fetch的替换也不太好(。

我没有找到任何适合我的目标。问题中的代码工作正常,但只有我自己的压缩。所以我恢复了这一点,并以覆盖window.fetch来解决主要问题。如果URL包含blazor.boot.json,那么我修改URL并将其传递给原始获取。加载完所有文件后,我恢复原始提取。类似于此处建议的代码:https://github.com/dotnet/aspnetcore/discussions/25447

const originalFetch = window.fetch;
window.fetch = function(requestInfo, options) {
if (requestInfo === '_framework/blazor.boot.json') {
return originalFetch('https://example.com/myCustomUrl/blazor.boot.json', options);
} else {
// Use default logic
return originalFetch.apply(this, arguments);
}
};

相关内容

  • 没有找到相关文章

最新更新