RequireJS - 如何在Backbone加载Underscore之前配置它?

时间:2014-03-13 19:08:19

标签: backbone.js requirejs underscore.js amd

我想知道如何使用RequireJS加载Underscore和Backbone,并且能够在将Underscore传递给Backbone之前配置它。

我已经看过this popular question on StackOverflow这个类似的主题,但我还没有弄清楚如何在以下两种情况下配置Underscore:

  • 本身需要下划线
  • Underscore由Backbone加载

所以我的问题如下:

如何在需要时使用RequireJS配置Underscore,以及在模块中使用Backbone时是否需要?

以下是我尝试的内容:

应该有效的方法,但是DOESN' T:

我的第一个想法(as suggested here)是定义一个名为(例如)rawUnderscore的requireJS模块,该模块在没有任何配置的情况下返回Underscore。然后,创建一个名为underscore的新模块,该模块需要rawUnderscore并在返回其值之前对其进行配置。这会导致加载问题(无法加载主干)

配置Require.js模块

// When you initially setup require.js, add a new module to configure underscore
// Make it a dependency of backbone, so it'll always be loaded whenever 
// backbone is used.
require.config({
    paths: {
        'underscore': 'underscoreConfig',
        'rawUnderscore': 'underscoreOriginal'
    },
    shim: {
        underscore: {
            deps: ['rawUnderscore', 'jquery'],
            exports: '_'
        },
        backbone: {
            deps: ['underscore'],
            exports: 'Backbone'
        },
        jquery: {
            exports: 'jQuery'
        }
    }
});

underscoreConfig.js

define(['rawUnderscore'], function (_) {
    'use strict';

    _.templateSettings = 
    {
        evaluate    : /<%([\s\S]+?)%>/g,
        interpolate : /<%cleanHtml([\s\S]+?)%>/g,
        escape      : /<%[=-]([\s\S]+?)%>/g
    };

    return _;
});

有效的方法 - 编辑下划线并删除AMD能力:

如果我从Underscore.js中移除AMD线路(即强制Underscore不符合AMD),这是有效的。我不想这样做,因为我喜欢保留图书馆,以便日后维护。

配置Require.js以使用下划线补丁

  require.config({
          shim: {
          underscore: {
            deps: ['underscorePatch'],
              exports: '_',
              init: function(patchIt){
                  return patchIt(this._);
              }
          }
      }
  });

underscorePatch.js

  define('underscorePatch', [], function(){
      'use strict';

      function patch(_){
          _.templateSettings = {
              evaluate    : /<%([\s\S]+?)%>/g,
              interpolate : /<%cleanHtml([\s\S]+?)%>/g,
              escape      : /<%[=-]([\s\S]+?)%>/g
          };
          return _;
      }

      return patch;
  });

加载Backbone时有效的方法:

此方法有效,但仅限于Backbone加载时的情况。不是单独需要Underscore时。

配置Require.js模块

// When you initially setup require.js, add a new module to configure underscore
// Make it a dependency of backbone, so it'll always be loaded whenever 
// backbone is used.
require.config({
    shim: {
        underscore: {
            exports: '_'
        },
        backbone: {
            deps: ['underscoreConfig', 'underscore', 'jquery'],
            exports: 'Backbone'
        },
        jquery: {
            exports: 'jQuery'
        }
    }
});

underscoreConfig.js

define(['underscore'], function (_) {
    'use strict';

    _.templateSettings = 
    {
       evaluate    : /<%([\s\S]+?)%>/g,
       interpolate : /<%cleanHtml([\s\S]+?)%>/g,
       escape      : /<%[=-]([\s\S]+?)%>/g
    };

    return _;
});

1 个答案:

答案 0 :(得分:3)

我认为你的第一个例子是在正确的轨道上。以下似乎有效:

main.js

requirejs.config({
    paths: {
        'underscore': 'underscoreConfig',
        'originalUnderscore': 'underscore'
    },
    shim: {
        'originalUnderscore': {
            exports: '_'
        }
    }
});

underscoreConfig.js

define(['originalUnderscore'], function(_) {
    _.templateSettings =
    {
        evaluate    : /<%([\s\S]+?)%>/g,
        interpolate : /<%cleanHtml([\s\S]+?)%>/g,
        escape      : /<%[=-]([\s\S]+?)%>/g
    };
    return _;
});