导入"模板"是否存在差异?来自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",但这很难。
环境:
答案 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><% }); %>