Chrome插件商店即将全面停止对 manifest v2版本清单的支持,也就促使开发者们将逐渐将插件向MV3迁移。但迁移中会遇到的一些问题,比如清单格式的改变,由数组变成对象,或者由对象变成数组,不过这些问题也只是算格式上的不兼容而已,很好修改。而一些大麻烦比如MV3中CSP的策略更加严格,不仅限制了脚本注入,更是完全禁止使用
让注入的脚本(unsafe-inline)重新工作
我在content.js中生成了一个script标签,并手动将其注入到页面中,如下:
1 | // content.js |
作为结果,你会发现:
对于这种情况,我们只需要将上面的js代码单独写到一个文件中,并在清单中声明此文件,方便Google进行代码审查,这样就满足MV3的要求了
1 | // inject.js |
1 | // content.js |
1 | // manifest.json |
使用沙盒(sandbox)让Vue重新工作
由于Vue使用了
使用沙盒的好处是很明显的,比如原先使用Vue写的页面不需要修改就可继续使用,减少迁移的工作量。但是坏处也很明显,比如说在沙盒中无法调用插件相关的api,但其实这个问题也非常好解决,我们只需要在原来的插件环境和隔离出的沙盒环境中,添加一个数据交换的中间层就可以了。
1 | <!-- sandbox.html --> |
1 | <!-- warpper.html --> |
1 | // manifest.json |
接下来,我们在需要添加一个中间层,让
沙盒和父级通信
1 | // sandbox.js |
父级和沙盒通信
1 | // wrapper.js |
由于发送和接收数据是异步进行的,所以我们要对上面的方法按照发布-订阅的设计模式进行封装,以便让业务代码不需要大幅度修改即可使用
譬如在MV2中的代码:
1 | // sandbox.js |
对象
1 | // sandbox.js |
1 | // warpper.js |
如此,利用一个订阅—发布的中间件,我们不需要对代码进行大幅度修改,即可将插件迁移至MV3