本文介绍了RequireJS-如何在Backbone加载Underscore之前对其进行配置?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想知道如何使用RequireJS加载Underscore和Backbone,并能够在将Underscore传递给Backbone之前对其进行配置.

I'd like to know how to load Underscore and Backbone using RequireJS and be able to configure Underscore before it's passed to Backbone.

我已经看到 StackOverflow上的这个热门问题,该主题与此类似,但我无法弄清楚如何为以下两种情况配置Underscore:

I've seen this popular question on StackOverflow about this similar topic, but I haven't been able to figure out how to get Underscore to be configured for both of the following situations:

  • 下划线是必需的
  • Undercore由Backbone加载

所以我的问题如下:

这是我尝试过的:

我的第一个想法(此处建议)是定义一个名为(例如)rawUnderscore的requireJS模块,该模块返回Underscore而不返回任何配置.然后,创建一个名为underscore的新模块,该模块需要rawUnderscore并在返回其值之前对其进行配置.这会导致加载问题(无法加载主干)

My first idea (as suggested here) was to define a requireJS module named (e.g.) rawUnderscore which returns Underscore without any configuration. Then, create a new module named underscore which requires rawUnderscore and configures it before returning its value. This causes loading problems (couldn't load backbone)

// 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),则此方法有效.我不希望这样做,因为我希望保持原样,以便将来维护.

Approach that works - Edit Underscore and remove AMD ability:

This works if I remove the AMD lines from Underscore.js (ie force Underscore to not be AMD compliant). I'd prefer not to do this as I like to keep libraries as they are, to ease future maintenance.

  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的情况下有效.当仅需要下划线时不需要.

Approach that works when loaded with Backbone:

This approach works, but only in the context of when Backbone being loaded as well. Not when Underscore is required by itself.

// 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 _;
});

推荐答案

我认为您的第一个例子是正确的.以下似乎有效:

I think your first example was on the right track. The following seems to work:

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 _;
});

这篇关于RequireJS-如何在Backbone加载Underscore之前对其进行配置?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-13 13:05