mirror of
https://github.com/marko-js/marko.git
synced 2025-12-08 19:26:05 +00:00
Fixes #225 - Marko v3: Migrate <cached-fragment>
This commit is contained in:
parent
e8e4ef332d
commit
763b8b7c70
@ -145,6 +145,7 @@ taglibLookup.registerTaglib(require.resolve('../taglibs/core/marko.json'));
|
||||
taglibLookup.registerTaglib(require.resolve('../taglibs/layout/marko.json'));
|
||||
taglibLookup.registerTaglib(require.resolve('../taglibs/html/marko.json'));
|
||||
taglibLookup.registerTaglib(require.resolve('../taglibs/async/marko.json'));
|
||||
taglibLookup.registerTaglib(require.resolve('../taglibs/cache/marko.json'));
|
||||
|
||||
|
||||
|
||||
|
||||
9
taglibs/cache/cached-fragment-tag-transformer.js
vendored
Normal file
9
taglibs/cache/cached-fragment-tag-transformer.js
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
var defaultCacheManagerPath = require.resolve('./default-cache-manager');
|
||||
|
||||
module.exports = function(el, context) {
|
||||
if (!el.hasAttribute('cache-manager')) {
|
||||
var requirePath = context.getRequirePath(defaultCacheManagerPath);
|
||||
var defaultCacheManagerVar = context.importModule('__defaultCacheManager', requirePath);
|
||||
el.setAttributeValue('cache-manager', defaultCacheManagerVar);
|
||||
}
|
||||
};
|
||||
49
taglibs/cache/cached-fragment-tag.js
vendored
Normal file
49
taglibs/cache/cached-fragment-tag.js
vendored
Normal file
@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Copyright 2011 eBay Software Foundation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
module.exports = {
|
||||
render: function (input, out) {
|
||||
var cacheKey = input.cacheKey;
|
||||
if (!cacheKey) {
|
||||
throw new Error('cache-key is required for <cached-fragment>');
|
||||
}
|
||||
|
||||
var cacheManager = input.cacheManager;
|
||||
|
||||
var cache = cacheManager.getCache(input.cacheName || 'marko/cached-fragment');
|
||||
|
||||
var asyncOut = out.beginAsync();
|
||||
|
||||
cache.get(cacheKey,
|
||||
{
|
||||
builder: function(callback) {
|
||||
var result = out.captureString(function () {
|
||||
if (input.renderBody) {
|
||||
input.renderBody(out);
|
||||
}
|
||||
});
|
||||
callback(null, result);
|
||||
}
|
||||
}, function(err, result) {
|
||||
if (err) {
|
||||
return asyncOut.error(err);
|
||||
}
|
||||
|
||||
asyncOut.end(result);
|
||||
});
|
||||
}
|
||||
};
|
||||
37
taglibs/cache/default-cache-manager.js
vendored
Normal file
37
taglibs/cache/default-cache-manager.js
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
var caches = {};
|
||||
|
||||
function createCache() {
|
||||
var cache = {};
|
||||
|
||||
return {
|
||||
get: function(cacheKey, options, callback) {
|
||||
var value = cache[cacheKey];
|
||||
if (value !== undefined) {
|
||||
return callback(null, value);
|
||||
}
|
||||
|
||||
var builder = options.builder;
|
||||
builder(function(err, value) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
if (value === undefined) {
|
||||
value = null;
|
||||
}
|
||||
|
||||
cache[cacheKey] = value;
|
||||
|
||||
callback(null, value);
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
var defaultCacheManager = {
|
||||
getCache: function(cacheName) {
|
||||
return caches[cacheName] || (caches[cacheName] = createCache());
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = defaultCacheManager;
|
||||
9
taglibs/cache/marko.json
vendored
Normal file
9
taglibs/cache/marko.json
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
{
|
||||
"<cached-fragment>": {
|
||||
"renderer": "./cached-fragment-tag",
|
||||
"@cache-key": "string",
|
||||
"@cache-name": "string",
|
||||
"@cache-manager": "string",
|
||||
"transformer": "./cached-fragment-tag-transformer.js"
|
||||
}
|
||||
}
|
||||
1
test/fixtures/async-render/autotest/cached-fragment-cache-manager-attr/expected.html
vendored
Normal file
1
test/fixtures/async-render/autotest/cached-fragment-cache-manager-attr/expected.html
vendored
Normal file
@ -0,0 +1 @@
|
||||
myCacheManager:Count: 0Count: 0myCacheManager:Count: 1myCacheManager:Count: 2Count: 2myCacheManager:Count: 3
|
||||
15
test/fixtures/async-render/autotest/cached-fragment-cache-manager-attr/template.marko
vendored
Normal file
15
test/fixtures/async-render/autotest/cached-fragment-cache-manager-attr/template.marko
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
<var count=0/>
|
||||
|
||||
<macro foo(cacheName, cacheKey)>
|
||||
<cached-fragment cache-key=cacheKey cache-name=cacheName cache-manager=data.myCacheManager>
|
||||
Count: ${count++}
|
||||
</cached-fragment>
|
||||
</macro>
|
||||
|
||||
<foo('cacheA', 'keyA')/>
|
||||
<foo('cacheA', 'keyA')/>
|
||||
<foo('cacheA', 'keyB')/>
|
||||
|
||||
<foo('cacheB', 'keyA')/>
|
||||
<foo('cacheB', 'keyA')/>
|
||||
<foo('cacheB', 'keyB')/>
|
||||
41
test/fixtures/async-render/autotest/cached-fragment-cache-manager-attr/test.js
vendored
Normal file
41
test/fixtures/async-render/autotest/cached-fragment-cache-manager-attr/test.js
vendored
Normal file
@ -0,0 +1,41 @@
|
||||
var caches = {};
|
||||
|
||||
function createCache() {
|
||||
var cache = {};
|
||||
|
||||
return {
|
||||
get: function(cacheKey, options, callback) {
|
||||
setTimeout(function() {
|
||||
var value = cache[cacheKey];
|
||||
if (value !== undefined) {
|
||||
return callback(null, value);
|
||||
}
|
||||
|
||||
var builder = options.builder;
|
||||
builder(function(err, value) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
if (value === undefined) {
|
||||
value = null;
|
||||
}
|
||||
|
||||
cache[cacheKey] = value;
|
||||
|
||||
callback(null, 'myCacheManager:' + value);
|
||||
});
|
||||
}, 10);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
var myCacheManager = {
|
||||
getCache: function(cacheName) {
|
||||
return caches[cacheName] || (caches[cacheName] = createCache());
|
||||
}
|
||||
};
|
||||
|
||||
exports.templateData = {
|
||||
myCacheManager: myCacheManager
|
||||
};
|
||||
15
test/fixtures/async-render/autotest/cached-fragment/template.marko
vendored
Normal file
15
test/fixtures/async-render/autotest/cached-fragment/template.marko
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
<var count=0/>
|
||||
|
||||
<macro foo(cacheName, cacheKey)>
|
||||
<cached-fragment cache-key=cacheKey cache-name=cacheName>
|
||||
Count: ${count++}
|
||||
</cached-fragment>
|
||||
</macro>
|
||||
|
||||
<foo('cacheA', 'keyA')/>
|
||||
<foo('cacheA', 'keyA')/>
|
||||
<foo('cacheA', 'keyB')/>
|
||||
|
||||
<foo('cacheB', 'keyA')/>
|
||||
<foo('cacheB', 'keyA')/>
|
||||
<foo('cacheB', 'keyB')/>
|
||||
@ -1,15 +0,0 @@
|
||||
<var name="count" value="0"/>
|
||||
|
||||
<def function="foo(cacheName, cacheKey)">
|
||||
<cached-fragment cache-key="$cacheKey" cache-name="$cacheName">
|
||||
Count: ${count++}
|
||||
</cached-fragment>
|
||||
</def>
|
||||
|
||||
<invoke function="foo('cacheA', 'keyA')"/>
|
||||
<invoke function="foo('cacheA', 'keyA')"/>
|
||||
<invoke function="foo('cacheA', 'keyB')"/>
|
||||
|
||||
<invoke function="foo('cacheB', 'keyA')"/>
|
||||
<invoke function="foo('cacheB', 'keyA')"/>
|
||||
<invoke function="foo('cacheB', 'keyB')"/>
|
||||
Loading…
x
Reference in New Issue
Block a user