多次使用RequireJS模块不会运行

Using a RequireJS module more than once does not run

本文关键字:运行 模块 RequireJS      更新时间:2023-09-26

运行require(['pages/home'])会运行一次,但如果我再次使用require(['pages/home']),它将不会运行
模块"pages/home"是名为"pages"的目录中的一个名为"home.js"的文件。

main.js

require(['pages/home']);

pages/home.js

define('pages/home', function() {
    console.log('running pages/home module');
});

RequireJS模块是singleton。它只加载一次模块。如果一个模块已经加载,那么如果再次加载它,则会得到与最初加载的模块相同的引用。传递给define的工厂函数不会再次运行。

所以你所看到的正是人们所期望的。

模块中的静态代码不应该被评估多次,就像通过普通<script>标记加载的脚本在页面加载期间不会运行多次一样。

想象一下,如果一个模块包含以下代码:

define('my-module', function () {
  var foo = foo || 0;
  var bar = ++foo;
});

您应该期望barfoo都是=== 1,但如果模块重复运行并且存在全局foo,则情况可能并非如此。诚然,这是一个非常人为的例子,但重复评估模块可能会导致严重的问题。

使其返回一个函数/对象,该函数/对象可以在您需要后执行。

define('pages/home', function() {
    return function(){
       console.log('running pages/home module');
    };
});
require(['pages/home'], function(resultFunc){
   window.YourFunc = resultFunc;
});

现在,您可以随时执行您的函数