TL;DR:在构建/发布期间(在asp.net核心Blazor应用程序中(是否有一个用于JS文件压缩的Target
,我可以在csproj中使用它来在此Target
之前运行我的脚本?
背景:
我有Blazor前端应用程序,它被加载到不同的web应用程序(不同的域(。所以:主应用程序加载许多其他应用程序,其中一个应用程序是Blazor应用程序(托管在不同的URL(。
我所做的:我手动加载_framework/blazor.webassembly.js
,autostart
属性设置为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);
}
};