【问题标题】:Loading JavaScript files in SPAs in sequential order that both depend on each other and the page they are associated with按顺序在 SPA 中加载 JavaScript 文件,这些文件都相互依赖以及它们关联的页面
【发布时间】:2021-05-09 16:58:19
【问题描述】:

我正在构建单页应用程序 (SPA),但在处理 SPA 不同部分的 JavaScript 文件时遇到了困难。

在我的 SPA 中,我使用 jQuery 的 .html() 方法动态加载页面。我遇到的问题是某些页面需要多个相互依赖的 JavaScript 文件和页面,因此一旦页面被提取并插入到 DOM 中,我必须按顺序导入它们。澄清一下,我所说的依赖于页面的 JS 文件是指它们包含的代码,例如通过 Id 选择元素,使它们与页面绑定。

为了按顺序导入这些脚本,我使用了 defer 属性,如下所示:

file.html

<!-- Contents of this file that will be dynamically loaded into the SPA -->

<script defer src="/js/script_1.js"></script>
<script defer src="/js/script_2.js"></script>
<script defer src="/js/script_3.js"></script>
<script defer src="/js/script_4.js"></script>
<script defer src="/js/script_5.js"></script>

index.js(这是我原始脚本的精简版,显然包括缓存、错误处理等)

$.ajax({
    type: 'GET',
    url: '/file.html',
    success: function (data) {
        $('#main-container').html(data);
    }
});

file.html 文件已成功插入 DOM,但似乎没有获取任何 JavaScript 文件。事实上,&lt;script&gt;&lt;/script&gt; 标签内似乎没有任何内容被执行。

我尝试将每个 JavaScript 文件包装在一个函数中,并在 file.html 中以正确的顺序调用它们,但这也不起作用。

我应该如何解决这个问题?我应该重新评估我的设计吗?

【问题讨论】:

  • 与这个特定问题无关——我会重新考虑你的设计。单独加载任意数量的 JS 文件可能没什么好处
  • @Dave Newton 是的,这是真的。但是,我喜欢保持我的代码干净并组织成不同的组件和文件。此外,包含一个大文件只能解决一半的问题。
  • 代码在开发过程中的存在方式与其交付给客户端的方式是正交的。
  • @Dave Newton - 我同意;然而,最重要的是,加载依赖于动态加载页面的 JavaScript 文件的问题仍然存在。
  • 如果你交付了一个 JS 文件,只重新渲染内容 DOM,并且绑定页面代码运行到它的加载事件,没有问题。也就是说,重新发明 SPA 框架也可能比它的价值更麻烦。 YMMV。

标签: javascript jquery single-page-application


【解决方案1】:

你可以选择所有加载的脚本并通过 eval() 执行它们

$.ajax({
    type: 'GET',
    url: '/file.html',
    success: function (data) {
        $('#main-container').html(data);
        $('#main-container script').each(function (index, element) { 
            if (!element.attr('has-run') || element.attr('has-run') != 'true') {                
                eval(element.innerHTML); 
                element.attr('has-run', 'true')
             }
         }
});

【讨论】:

  • 这部分有效。它可以很好地加载 JavaScript 文件,但是当我导航到 SPA 中的另一个页面然后返回上一页时,所有 JavaScript 文件都会再次执行,从而导致一些问题。我知道这不是因为您的脚本,但是您对如何防止这些 JS 文件在我每次返回该特定页面(无需重新加载)时被执行有什么建议吗?
  • @Looky1173 - 我用可能的解决方案更新了我的答案......
  • @JohnTyler - 我认为这不是问题所在。由于我有一个缓存脚本,每个eval() 只运行一次。但是,每次我重新访问特定页面时,某些 JavaScript 似乎会自动运行。
  • 好的,我通过在每个JS文件中添加if语句来检查它们是否在正确的页面上,如果是,则执行。它以某种方式奏效了! :-)
猜你喜欢
  • 1970-01-01
  • 2018-01-24
  • 2011-12-11
  • 2022-10-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
  • 2015-10-15
  • 1970-01-01
相关资源
最近更新 更多