目标是发送要从服务器检索的项目列表,该列表查询文件系统或数据库,理想情况下返回二进制文件数组。
我目前的方法是将base64编码二进制文件转换为JSON数组。
// Extend Array class methods to NodeList data type
Object.getOwnPropertyNames( Array.prototype ).forEach( function(method){
if (method !== 'length')
NodeList.prototype[method]=Array.prototype[method];
});
// Find People
var nodeList = document.querySelectorAll('div.people');
var people = nodeList.map(function(el){ return el.dataset.personid; });
// Search Server
var request = new XMLHttpRequest();
var skip_cache = '?' + new Date().getTime();
request.open('POST', 'cgi.script' + skip_cache );
request.responseType = 'json';
request.onload = function(){
// response handler
/* receives json from server, including an array of base64 files for each person
loop over array and append base64 values to images (data uri) and prepare other HTML elements
*/
};
request.send( JSON.stringify({ids:people}) );
瓶颈是请求的大小 - 我已经将人数分成多个请求。虽然base64在未压缩状态下仅增加约37%;当你有1k文件要下载时,它并不重要。
目标是减少每个请求的大小(不牺牲时间),这可以归结为更好的压缩方法(lzma vs gzip),或改进数据格式(ascii上的二进制)。
是否可以一次传输多个二进制文件,甚至可以直接在JSON中嵌入它们而不会产生副作用?作为预防措施,我从未尝试过这种方法,考虑可能会对过去的技术构成挑战的副作用。