标签:javascript json google-chrome google-chrome-extension
A message can contain any valid JSON object (null, boolean, number, string, array, or object)
chrome扩展规范表明在后台和内容脚本之间传递的消息可以是Javascript对象,这意味着我们可以在不使用JSON.stringify的情况下传递Javascript对象.这是否意味着Chrome在发送邮件之前会在内部执行JSON.stringify?如果没有,如果我只是在没有JSONification的情况下传递Javascript对象,是否有性能提升?
解决方法:
这些消息在Chrome的JavaScript填充层中自动进行JSON序列化(字面意思是使用JSON.stringify),该层与扩展交互,如source code of messaging.js所示:
PortImpl.prototype.postMessage = function(msg) {
if (!$Object.hasOwnProperty(ports, this.portId_))
throw new Error(kPortClosedError);
// JSON.stringify doesn't support a root object which is undefined.
if (msg === undefined)
msg = null;
msg = $JSON.stringify(msg);
if (msg === undefined) {
// JSON.stringify can fail with unserializable objects. Log an error and
// drop the message.
//
// TODO(kalman/mpcomplete): it would be better to do the same validation
// here that we do for runtime.sendMessage (and variants), i.e. throw an
// schema validation Error, but just maintain the old behaviour until
// there's a good reason not to (http://crbug.com/263077).
console.error('Illegal argument to Port.postMessage');
return;
}
messagingNatives.PostMessage(this.portId_, msg);
};
同样适用于JSON.parse:
// Called by native code when a message has been sent to the given port.
function dispatchOnMessage(msg, portId) {
var port = ports[portId];
if (port) {
if (msg)
msg = $JSON.parse(msg);
port.onMessage.dispatch(msg, port);
}
};
注: chrome.runtime.postMessage / sendMessage只是上面显示的PortImpl的包装器.
标签:javascript,json,google-chrome,google-chrome-extension 来源: https://codeday.me/bug/20191002/1841960.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。