fix(runtime.js): partials compile not caching (#1600)
Reintroduce "merge" function, no called "mergeIfNeeded", that only creates a new partials object if both "env.partials" and "options.partials" are set. closes #1598
This commit is contained in:
committed by
Nils Knappmeier
parent
c819c8b533
commit
23d58e79bb
@@ -124,6 +124,15 @@ export function template(templateSpec, env) {
|
|||||||
}
|
}
|
||||||
return value;
|
return value;
|
||||||
},
|
},
|
||||||
|
mergeIfNeeded: function(param, common) {
|
||||||
|
let obj = param || common;
|
||||||
|
|
||||||
|
if (param && common && (param !== common)) {
|
||||||
|
obj = Utils.extend({}, common, param);
|
||||||
|
}
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
},
|
||||||
// An empty object to use as replacement for null-contexts
|
// An empty object to use as replacement for null-contexts
|
||||||
nullContext: Object.seal({}),
|
nullContext: Object.seal({}),
|
||||||
|
|
||||||
@@ -161,7 +170,8 @@ export function template(templateSpec, env) {
|
|||||||
container.helpers = Utils.extend({}, env.helpers, options.helpers);
|
container.helpers = Utils.extend({}, env.helpers, options.helpers);
|
||||||
|
|
||||||
if (templateSpec.usePartial) {
|
if (templateSpec.usePartial) {
|
||||||
container.partials = Utils.extend({}, env.partials, options.partials);
|
// Use mergeIfNeeded here to prevent compiling global partials multiple times
|
||||||
|
container.partials = container.mergeIfNeeded(options.partials, env.partials);
|
||||||
}
|
}
|
||||||
if (templateSpec.usePartial || templateSpec.useDecorators) {
|
if (templateSpec.usePartial || templateSpec.useDecorators) {
|
||||||
container.decorators = Utils.extend({}, env.decorators, options.decorators);
|
container.decorators = Utils.extend({}, env.decorators, options.decorators);
|
||||||
|
|||||||
@@ -334,4 +334,31 @@ describe('Regressions', function() {
|
|||||||
|
|
||||||
shouldCompileTo('{{helpa length="foo"}}', [obj, helpers], 'foo');
|
shouldCompileTo('{{helpa length="foo"}}', [obj, helpers], 'foo');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('GH-1598: Performance degradation for partials since v4.3.0', function() {
|
||||||
|
// Do not run test for runs without compiler
|
||||||
|
if (!Handlebars.compile) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var newHandlebarsInstance;
|
||||||
|
beforeEach(function() {
|
||||||
|
newHandlebarsInstance = Handlebars.create();
|
||||||
|
});
|
||||||
|
afterEach(function() {
|
||||||
|
sinon.restore();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should only compile global partials once', function() {
|
||||||
|
var templateSpy = sinon.spy(newHandlebarsInstance, 'template');
|
||||||
|
newHandlebarsInstance.registerPartial({
|
||||||
|
'dude': 'I am a partial'
|
||||||
|
});
|
||||||
|
var string = 'Dudes: {{> dude}} {{> dude}}';
|
||||||
|
newHandlebarsInstance.compile(string)(); // This should compile template + partial once
|
||||||
|
newHandlebarsInstance.compile(string)(); // This should only compile template
|
||||||
|
equal(templateSpy.callCount, 3);
|
||||||
|
sinon.restore();
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user