差异从lodash和lodash /模板导入模板?

时间:2017-04-27 13:07:08

标签: javascript templates import lodash

导入"模板"是否存在差异?来自lodash,像这样:

import { template } from 'lodash';

或者像这样:

import template from 'lodash/template';

第一种方法可以正常工作,但是当我在模板中使用其他lodash函数(如_.isString)时,第二种方法会抛出TypeError。

  

未捕获的TypeError:_. isString不是函数       在eval(eval at(template.js:225),:10:13)

如果我在eval中调试,_(下划线)对象如下所示:

Object {escape: function}
    escape: function escape(string)
    __proto__: Object

除了转义函数外,它是空的吗?

我想使用lodash / core和cherrypick非核心功能,例如" template",但这很难。

环境:

  • Webpack 1.13.0
  • Babel 6.24.1
  • Backbone 1.3.3
  • Lodash 4.17.4

2 个答案:

答案 0 :(得分:1)

通过在_.template中使用templateSettings.imports并基本上将lodash导入到模板处理eval中,我找到了一种解决方法。

const templateSettings = { imports: { _: _ } };
const processedTemplate = template(templateToProcess, templateSettings)(data);

以下是模板和templateSettings的Lodash文档: https://lodash.com/docs/latest#template

我仍然不知道为什么使用cheerypicked模板导入时eval中的下划线全局为空,但是......

答案 1 :(得分:0)

对于碰巧碰到这个问题的任何人,即使是在2020年:

Webpack,babel等结合使用bastardize lodash(以及其他所有库),它们可以“预编译”。生成模板时,预期的对象实例和行为不可用。例如,_.forEach可能在内存中被“优化”为lodash_forEach__WEBPACK_IMPORTED_MODULE_0___default。因此,如果您尝试在未“预编译”到同一babel脚本管道中的任何脚本中使用lodash的预期实例化“ _”,则它将不可用(我认为这对于SPA是有意义的)。

为了“使用”任何“优化”行为,您需要显式传递行为。这样,当webpack和babel做事时,正确的功能就会投影到模板运行时中。

 var template = $('#template').html(),
        compiled = _.template(template, { 'imports': { 'each': _.forEach } });

然后在您的模板中:

<% each(items, function(item) { %><li><%- item %></li><% }); %>