requirejs-为什么在define()中加载模块有效,而在require()中加载模块无效';T

requirejs-为什么在define()中加载模块有效,而在require()中加载模块无效';T,requirejs,Requirejs,代码吹不起作用,错误消息为: 未捕获错误:模块名称 尚未加载“text!templates/bookTemplate.html\u unnormalized2” 然而,对于上下文:u。使用require([]) 然后我将“text!templates/bookTemplate.html”移动到define(),它就可以工作了!以下是工作代码: define(['backbone', 'underscore', 'jquery', 'text!templates/bookTemplate.

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

未捕获错误:模块名称 尚未加载“text!templates/bookTemplate.html\u unnormalized2” 然而,对于上下文:u。使用require([])

然后我将“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()中不工作吗

您正在使用字符串文本调用
require
。当您像这样调用
require
时,它会以一种方式运行。它的行为类似于同步调用,因为它将立即返回模块。它是伪同步的,因为在调用
require
的伪同步形式之前必须加载模块

所以你可以这样做:

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

define(['backbone', 'underscore', 'jquery', 
    'text!templates/bookTemplate.html'], function (Backbone, _, $, bt) {
或者您可以使用CommonJS包装:

define(function(require, exports, module) {
    var Backbone = require('backbone');
    var _ = require('underscore');
    var jquery = require('jquery');
    var bt = require('text!templates/bookTemplate.html');
此包装工作正常,因为RequireJS将在运行时将其转换为:

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

在执行模块之前。

我明白了。。commonJS包装也可以使用define(),但我无法将它们组合在一起。谢谢你,路易斯!
define(["require", "exports", "module", "backbone", "underscore", "jquery",
        "text!templates/bookTemplate.html"], function(require, exports, module) {
    var Backbone = require('backbone');
    var _ = require('underscore');
    var jquery = require('jquery');
    var bt = require('text!templates/bookTemplate.html');