Header 中的脚本 Link - EnableOptimizations 剥离属性

Script Link in Header - EnableOptimizations Strips Attributes

不确定这是一个错误还是 2sxc 是“出于某种原因”故意这样做的。

首先,这是目标。我在 2sxc 应用程序中,在使用 Razor/C# 的视图中。我需要像这样在 中链接以下 JS 模块:

<script src="//unpkg.com/@dnncommunity/dnn-elements/dist/dnn/dnn.esm.js" 
  type="module" async="async" defer="defer" crossorigin="anonymous">
</script>

显然,如果我只是将它放在 as-is 中,它会出现在页面上,但不会出现在 中。

如果我添加属性,data-enableoptimizations="true" 然后它在 但我的所有 4 个属性都被删除:

<script src="https://unpkg.com/@dnncommunity/dnn-elements/dist/dnn/dnn.esm.js" type="text/javascript"></script>

此外,请注意 src 只有前导“//unpkg...”,并且出于某种原因,优化添加了我不想要的“https:”。

type="text/javascript" 是从哪里来的?这已经多年没有要求了。

我可以像这样使用 DnnJsInclude 控件在 theme/skin 中解决这个问题。它使用 ClientResourceManagement 并允许我像这样在 HtmlAttributesAsString 中指定所有属性:

<dnn:DnnJsInclude
  FilePath="//unpkg.com/@dnncommunity/dnn-elements/dist/esm/dnn.js"
  ForceProvider="DnnPageHeaderProvider"
  HtmlAttributesAsString="type:module,async:async,defer:defer,crossorigin:anonymous" 
  Priority="1001"
  runat="server"
/>

这让我得到了正确的结果,但这意味着我的标准内容编辑器现在需要能够编辑页面设置才能使用我的 2sxc 应用程序。我不想要的(权限或训练并发症)。

我意识到我可能可以使用我的 Razor 代码中的 DnnJsInclude 控件,但似乎这是 data-enableoptimizations 应该处理的有效用例。是的?不?或许?也许它已经做到了,但我不知道正确的语法?

有人知道如何让 2sxc 执行此操作吗?或者这是一个值得报告的关于 data-enableoptimizations 的错误?我特别惊讶它只是剥夺了我的有效属性。

所以对于一些背景:一旦设置了属性,它就会被拾取并拆开,因为DNN需要一一给出的部分,而不是作为<script>标签。

我假设到目前为止,还没有试图保留剩余位的机制。我们已经很长时间没有关注这个了,也许 DNN API 在 v7.4.2 中缺失(我们的最低兼容性)。

但总的来说:这是目前的设计,可以改进。我建议你在 github and/or 上开一个 issue 贡献一个改变 ;)

好的,所以我使用 DnnJsInclude 控件在代码中解决了这个问题。简而言之,这是解决方案:

@using DotNetNuke.Web.Client.ClientResourceManagement

@{
  // Add a <script> tag in the head as a JS module
  var include = new DnnJsInclude 
  {
    FilePath = "https://unpkg.com/@dnncommunity/dnn-elements/dist/dnn/dnn.esm.js", 
    ForceProvider = "DnnPageHeaderProvider",
    Priority = 1001, // stay out of the way?
    HtmlAttributesAsString = "type:module,async:async,defer:defer,crossorigin:anonymous",
  };
  var loader = (Context.CurrentHandler as Page).FindControl("ClientResourceIncludes");
  if (loader != null)
  {
    loader.Controls.Add(include);
  }  
}

由于 HtmlAttributesAsString 参数,它获得了所需的确切输出。

我什至把它写成了博客post,里面有很多细节。

DNN Details 004: Using the New Dnn-Elements in a 2sxc View?

由于这依赖于 Dnn,因此对 Oqtane/hybrid 编码人员没有好处。