Javascript 呼叫require([';app';])仅一次

Javascript 呼叫require([';app';])仅一次,javascript,requirejs,amd,Javascript,Requirejs,Amd,我如何调用requireJSrequire(['app'],function(){});仅在整个应用程序开始时进行一次,以便任何后续的都需要([“…”],函数(…){});不需要在require(['app']中包装 这是我的设置: 1) 加载require.js <script data-main="js/app.js" src="requirejs/require.min.js"></script> 3) 在不同页面上动态加载JS: // Home Page re

我如何调用requireJSrequire(['app'],function(){});仅在整个应用程序开始时进行一次,以便任何后续的都需要([“…”],函数(…){});不需要在require(['app']中包装

这是我的设置:

1) 加载require.js

<script data-main="js/app.js" src="requirejs/require.min.js"></script> 
3) 在不同页面上动态加载JS:

// Home Page
require(['app'], function() {

    require(["jquery", "foundation", "foundation.reveal"], function ($, foundation, reveal){
         $(document).foundation(); 
    }); 
});


// Catalog Page
require(['app'], function() {

    require(["jquery", "lnav/LeftNavCtrl","controllers/ProductCtrl", "controllers/TabsCtrl"], function ($, NavCtrl, ProductCtrl, TabsCtrl){
        $(function() {
            NavCtrl.initLeftNav(); 
        });
    }); 
}); 
除非每次调用require(“…”)以加载外部JS或AMD模块时都使用require(['app'],function())包装,否则应用程序不会初始化,并且会出现JavaScript错误。上面的代码可以工作,但效率不高

在我尝试加载脚本之前,有没有办法启动我的requireJS应用程序

加载require.min.js后,我一开始就尝试调用:

require(["app"], function (app) {
    app.run();
});

但它不起作用

RequireJS中没有规定确保在加载任何其他模块之前始终加载特定模块,而不是让您的第一个模块加载其余模块。您试图做的是在多个页面之间共享您的第一个模块,这样它就无法执行加载每个页面特定内容的工作

解决此问题的一种方法是使用常规的
脚本
元素加载
app.js

<script src="requirejs/require.min.js"></script>    
<script src="js/app.js"></script>
实际上,这就是我决定在我目前正在开发的应用程序中启动模块的方式。诚然,由于额外的网络往返,它并没有得到应有的优化,但就我正在开发的应用程序而言,它们仍处于非常繁重的开发阶段,我更愿意将此优化留待以后进行

请注意,通常您不想使用
script
加载RequireJS模块,但您的
app.js
不是一个真正的模块,因为它不调用
define
,所以这是可以的


另一种选择是使用Grunt、Gulp、Make等构建工具,在每页创建一个
app.js
,并让每页加载自己的
app.js
文件。此文件将包含配置和第一个
require
调用,以加载特定于您页面的模块。

我同意这不是最理想的解决方案,因为它加载了app.js两次,但目前似乎正在工作。在我找到更好的解决方案之前,我会一直使用它。
<script src="requirejs/require.min.js"></script>    
<script src="js/app.js"></script>
<script>
   require(["jquery", "foundation", "foundation.reveal"], function ($, foundation, reveal){
     $(document).foundation(); 
   }); 
</script>