为每次页面更改装饰CookedElement?

您的代码应该可以正常工作。您只是遇到了 Discourse 中的一个 bug。

loadScript() 不会为其加载的脚本设置 async 属性。因此,它默认为 async="true",这会扰乱您的加载顺序。这是一个浏览器怪癖。您必须强制使用 JS 加载的脚本的 async="false"。

插件较小,因此加载速度比主包快,但由于它们是 async 的,因此不再尊重加载顺序——等待主包加载并执行后再执行。

它可能未被注意到,因为据我所知,loadScript 在核心中没有嵌套。您通常会将需要协同工作的文件打包在一起。所以,回答您的另一个问题。不,没有 Discourse 函数可以处理那种事情。

您的其他代码片段也应该可以工作。为了让它更容易阅读,也许可以尝试链接它们而不要嵌套它们。

// This goes outside the decorator
const PLUGINS = {
  speed: "https://example.com/foo.js",
  skipBack: "https://example.com/bar.js",
  jumpForward: "https://example.com/baz.js"
};

// Then do your work inside the decorator
loadScript(MEDIA_ELEMENT_SRC)
  .then(() => loadScript(PLUGINS.speed))
  .then(() => loadScript(PLUGINS.skipBack))
  .then(() => loadScript(PLUGINS.jumpForward))
  .then(() => {
    audioplayers.forEach(function (el) {
      new MediaElementPlayer(el, MEDIA_ELEMENT_CONFIG);
    });
  });