expose.js
exports.expose = async function (page, name) {
/** 暴露每个模块方法到浏览器 */
const object = require(name);
for (const key in object) {
if (Object.hasOwnProperty.call(object, key)) {
const element = object[key];
if ((element && typeof element === "function") || typeof element?.default === "function") {
await page.exposeFunction(name + "_expose_" + key, element);
}
}
}
};
exports.exposeRequire = async function (page) {
/** 生成一个模块引入方法,并注入到 window 对象, 使用 require(name) 即可引入模块 */
await page.evaluate(() => {
window.require = (name) => {
const keys = Reflect.ownKeys(window)
.filter((key) => key.startsWith(name + "_expose_"))
.map((key) => key.replace(name + "_expose_", ""));
const object = {};
for (const key of keys) {
Reflect.set(object, key, window[name + "_expose_" + key]);
}
/** 组装成一个对象,并返回 */
return object;
};
});
};
index.js
const puppeteer = require("puppeteer");
const { expose, exposeRequire } = require("./expose");
puppeteer
.launch({
executablePath: "C:/Program Files/Google/Chrome/Application/chrome.exe",
defaultViewport: null,
headless: false,
})
.then(async (browser) => {
const [page] = await browser.pages();
// 暴露 自定义的require 方法到浏览器
await exposeRequire(page);
// 暴露本地模块
await expose(page, "fs");
await expose(page, "path");
await expose(page, "http");
})
.catch((err) => {});
效果