Skip to content

GrinZero/chrome-inject-eval

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

chrome-inject-eval

use eval in chrome extension v3+

你可以通过引入本包从而实现在 chrome 插件 v3 版本中使用 eval

Start

我们推荐你使用npm安装而不是yarn或者pnpm,因为chrome插件开发时(没有webpack/rollup时)如果使用pnpm这种软链接安装的包管理工具是会出问题的

npm i chrome-inject-eval

Usage

manifest.json

{
  ...
  "content_scripts": [
    {
      ...
      "js": [
        "./node_modules/chrome-inject-eval/dist/umd.min.js",
        "./src/[your inject].js"
      ],
      ...
    }
  ],
  ...
}

[your inject].js

  • 基本
const evil = evalCore.getEvalInstance(window);

evil("const a=1;");
console.log(a); // 1
  • 高阶
const { evalModule, transformCode } = evalCore;

const { Interpreter } = evalModule;
Interpreter.global = window;
const interpreter = new Interpreter();
// 现在你可以使用eval5的所有功能

interpreter.evaluate(transformCode("const a=1;"));

console.log(a); // 1

Caveats

chrome-inject-eval的导出对象有三个属性,其中evalModule本质上等于require("eval5"),而 transform 则是通过 babel 把字符串编译成 ES5 代码,所以如果想使用更多 eval 相关的功能,可以参考 eval5官网

const evil = require("eval5");
const { transform } = require("@babel/standalone");

const transformCode = (codeStr) =>
  transform(codeStr, { presets: ["env"] }).code;

const getEvalInstance = (obj) => {
  const interpreter = new evil.Interpreter(obj, {
    timeout: 1000,
  });
  return (codeStr) => interpreter.evaluate(transformCode(codeStr));
};

module.exports = {
  evalModule: evil,
  getEvalInstance,
  transformCode,
};

About

use eval in chrome extension v3+

Resources

Stars

Watchers

Forks

Packages

No packages published