requirejs - 为什么在define()中加载模块有效,但在require()中没有

时间:2014-05-07 16:20:26

标签: requirejs

代码打击不起作用,错误消息为:

  

未捕获错误:模块名称   “text!templates / bookTemplate.html_unnormalized2”尚未加载   但对于上下文:_。使用require([])

define(['backbone', 'underscore', 'jquery'], function (Backbone, _, $) {
    var bt = require('text!templates/bookTemplate.html');
    var BookView = Backbone.View.extend({
        initialize: function () {
            this.render();
        },
        render: function () {
            var template = _.template(bt, {
                name: 'secret book'
            });
            this.$el.html(template);
        }
    });
    return BookView;
});

然后我将“text!templates / bookTemplate.html”移动到define(),它的工作原理!下面是工作代码:

   define(['backbone', 'underscore', 'jquery', 
'text!templates/bookTemplate.html'], function (Backbone, _, $, bt) {
        // var bt = require('text!templates/bookTemplate.html');
        var BookView = Backbone.View.extend({
            initialize: function () {
                this.render();
            },
            render: function () {
                var template = _.template(bt, {
                    name: 'secret book'
                });
                console.info('template', template);
                this.$el.html(template);
            }
        });
        return BookView;
    }); // it is working

据我了解,require()和define()在加载模块时是一样的。它是否正确?你能帮我解释一下为什么它在define中工作而不在require()中?

1 个答案:

答案 0 :(得分:1)

您正在使用字符串文字调用require。当您像这样致电require时,它会在pseudo-synchronous fashion中发挥作用。它就像一个同步调用,因为它会立即返回模块。它是 - 同步因为必须 >

所以你可以这样做:

require

它可以工作,因为模块将在define(['backbone', 'underscore', 'jquery', 'text!templates/bookTemplate.html'], function (Backbone, _, $) { var bt = require('text!templates/bookTemplate.html'); 执行之前加载。或者您可以使用您在第二个代码段中显示的方法:

require

或者您可以使用CommonJS包装:

define(['backbone', 'underscore', 'jquery', 
    'text!templates/bookTemplate.html'], function (Backbone, _, $, bt) {

这种包装有效,因为RequireJS会在运行时将其转换为:

define(function(require, exports, module) {
    var Backbone = require('backbone');
    var _ = require('underscore');
    var jquery = require('jquery');
    var bt = require('text!templates/bookTemplate.html');

执行模块之前。