对require.js感到困惑

时间:2013-01-07 10:36:35

标签: javascript asp.net html sql requirejs

我一直在关注require.js,我对如何将它用于我的小部件系统感到困惑。

我的小部件系统基本上允许用户选择他/她想要查看哪个小部件存储在数据库中。

因此,当用户在下次访问时加载页面时,他/她将只看到他/她选择的小部件。实际上只加载显示小部件所需的html,javascript,而不是为所有小部件加载所有html和javascript,然后隐藏不需要的东西。

我感到困惑的是如何使用require.js

执行此操作

我是否应该动态生成下面的require.js代码?如果用户已保存widget_1, widget_5 and widget_70,我假设我需要动态生成这样的javascript吗?

require(['widget_1','widget_5','widget_70'], function(w1, w5, w70){
    // then do something here?
});

require行是应该根据sql查询动态生成的吗?

因此,如果他们只选择一个小部件来保存以供下次观看,他们只能获得:

require(['widget_90'], function(w90){
    // then do something here?
});

那是我应该做的吗?

2 个答案:

答案 0 :(得分:2)

始终定义模块依赖的库的路径,如下所示:

<script data-main="scripts/main" src="scripts/require.js"></script>

文件: scripts / main.js

require.config({
    paths: {
        jQuery_1_7_2: 'lib/jquery.1.7.2',
        underscore: 'lib/underscore',
        .....
        .....
    }
});

注意:您需要在库中包含库并作为对象返回,如下所示:

文件: lib / jquery.1.7.2.js

define([ 'lib/jquery/jquery.1.7.2.min' ], function() {

    return jQuery.noConflict(true);

});

对于不遵循模块化方法[AMD规范]

的其他库,可以采用相同的方法

注意:使用shim feature

可以避免上面定义库模块的步骤

由于您的页面是动态的,因此您永远不知道将加载哪些模块。

您可以调用多个require()调用来加载模块。由于requirejs异步加载脚本,因此以下方法不会损害页面性能。

在HTML视图中的模块1

<html>..
<div id="module_1">
    //contents of module 1
</div>
<script type="text/javascript">
    require(["scripts/widgets/module_1"], function( module_1 ){
        module_1.init();
    })
</script>
..</html>

文件: scripts / widgets / module_1.js

define(["jQuery_1_7_2","underscore"], function($, _){
    // Module functionality goes here
    return {
        init: function(){
            // Module initialiser
        }
    }
});

带有HTML视图的模块2

<html>..
<div id="module_2">
    //contents of module 2
</div>
<script type="text/javascript">
    require(["scripts/widgets/module_2"], function( module_2 ){
        module_2.init();
    })
</script>
..</html>

文件: scripts / widgets / module_2.js

define(["jQuery_1_7_2","underscore"], function($, _){
    // Module functionality goes here
    return {
        init: function(){
            // Module initialiser
        }
    }
});

如果您不介意在DOM加载后初始化模块,可以使用controljs并更改脚本标记的MIME类型。我认为这不会对页面性能产生太大影响。

答案 1 :(得分:0)

我假设:

  • 您已在require config somewhere
  • 中定义了小部件的路径
  • 您的小部件是沙箱(可以无依赖地运行)
  • 您的应用程序可以在没有小部件的情况下运行

您可以在服务器上生成数组并将其填充到js(例如作为内联脚本),然后填充publish某种app.ready事件,如下所示:

<script>
require(/*array from the server*/, function(){
    // publish application ready event
});
</script>