Chrome 扩展可以访问到各种用户敏感数据,比如 cookie 之类,所以 Chrome 团队对它的限制非常严格(见 Using eval in Chrome Extensions. Safely.),比如常规环境下完全不能使用 eval
和 new Function()
。这给我们使用 Handlebars 之类的模板工具带来不小的麻烦。
一个解决方案就是使用上文中介绍的 sandbox。将可能使用到 eval
的代码放到一个独立沙盒中,不让它访问到那些敏感信息;然后通过 postMessage
API 与之进行数据通讯,完成模板生成工作。
我觉得这个方案不太理想。首先我不喜欢 <iframe>
;其次每次渲染模板还要 post 来 post 去,渲染结果也是异步传递(这点暂时存疑)。
另一套方案,则是利用 Handlebars 的预编译功能,将模板在开发环境中编译成函数,在扩展中直接使用。这样做的好处也很明显,因为发布插件时也会先处理代码,这个时候将模板处理完,工作效率更高。
等写完再补充具体代码吧。
欢迎吐槽,共同进步