使用require.js全局设置lodash /下划线模板设置

时间:2012-10-24 20:37:17

标签: javascript requirejs underscore.js

使用lodash时,有没有办法为RequireJS设置templateSettings

现在我的主要创业公司

  require(['lodash', 'question/view'], function(_, QuestionView) {
    var questionView;
    _.templateSettings = {
      interpolate: /\{\{(.+?)\}\}/g,
      evaluate: /\{\%(.+?)\%\}/g
    };
    questionView = new QuestionView();
    return questionView.render();
  });

但似乎并不想全局设置templateSettings,因为当我在模块中使用_.template(...)时,它希望使用默认的templateSettings。问题是我不想在使用_.template(...)的每个模块中更改此设置。

3 个答案:

答案 0 :(得分:16)

基于@Tyson Phalp建议,这意味着this SO question
我根据您的问题对其进行了调整,并使用RequireJS 2.1.2和SHIM configuration对其进行了测试 这是main.js文件,这是requireJS配置的位置:

require.config({
/*  The shim config allows us to configure dependencies for
    scripts that do not call define() to register a module */

    shim: {
      underscoreBase: {
        exports: '_'
      },
      underscore: {
        deps: ['underscoreBase'],
        exports: '_'
      }

    },
    paths: {
      underscoreBase: '../lib/underscore-min',
      underscore: '../lib/underscoreTplSettings',
    }
});

require(['app'],function(app){
  app.start();
});

然后你应该使用你的templateSettings创建underscoreTplSettings.js文件,如下所示:

define(['underscoreBase'], function(_) {
    _.templateSettings = {
        evaluate:    /\{\{(.+?)\}\}/g,
        interpolate: /\{\{=(.+?)\}\}/g,
        escape: /\{\{-(.+?)\}\}/g
    };
    return _;
});

因此,您的模块underscore将包含下划线库和模板设置 从您的应用程序模块中只需要underscore模块,这样:

define(['underscore','otherModule1', 'otherModule2'], 
   function( _, module1, module2,) { 
      //Your code in here
   }
);

我唯一的疑问是我输出相同的符号_两次,即使这项工作很艰难,我也不确定这是否是一种好的做法。

=========================

替代解决方案: 这也很好,我想它更干净,避免创建和需要额外的模块作为上述解决方案。我使用初始化函数更改了Shim配置中的'export'。有关进一步了解,请参阅Shim config reference

//shim config in main.js file
shim: {     
  underscore: {
      exports: '_',
      init: function () {
        this._.templateSettings = {
          evaluate:/\{\{(.+?)\}\}/g,
          interpolate:/\{\{=(.+?)\}\}/g,
          escape:/\{\{-(.+?)\}\}/g
        };
        return _; //this is what will be actually exported! 
      }
  }
}

答案 1 :(得分:0)

您应该将 _ 变量与模板设置作为函数参数或全局对象中的属性(浏览器的窗口)或nodejs的 proccess 传递)。

_.templateSettings = {
      interpolate: /\{\{(.+?)\}\}/g,
      evaluate: /\{\%(.+?)\%\}/g
};
questionView = new QuestionView(_);

或者

_.templateSettings = {
      interpolate: /\{\{(.+?)\}\}/g,
      evaluate: /\{\%(.+?)\%\}/g
};
window._ = _  

第一种选择更好。

答案 2 :(得分:0)

请记住,如果您使用下划线> = 1.6.0或lodash-amd,解决方案非常简单:

“main.js”配置文件

require.config({
  baseUrl: './', // Your base URL
  paths: {
    // Path to a module you create that will require the underscore module.
    // You cannot use the "underscore" name since underscore.js registers "underscore" as its module name.
    // That's why I use "_".
    _: 'underscore',

   // Path to underscore module 
   underscore: '../../bower_components/underscore/underscore',
  }
});

您的“_.js”文件:

define(['underscore'], function(_) {

  // Here you can manipulate/customize underscore.js to your taste.
  // For example: I usually add the "variable" setting for templates
  // here so that it's applied to all templates automatically.

  // Add "variable" property so templates are able to render faster!
  // @see http://underscorejs.org/#template
  _.templateSettings.variable = 'data';

  return _;
});

模块文件。它需要我们的“_”模块,它需要“下划线”并对其进行修补。

define(['_'], function(_){
  // You can see the "variable" property is there
  console.log(_.templateSettings);   
});