有多种方法可以解决此问题,并且不可能将它们写入单个答案。不过我可以在上面提供一些指导nexe
and electron
。还有enclosejs
and pkg
以及。
在下面的两个解决方案中,最重要的规则之一是不要捆绑您的 node_modules 文件夹。如果捆绑 Chromium 二进制文件,它将无法工作。
Nexe
您可以使用nexe https://github.com/nexe/nexe。这将下载您的 Nodejs 脚本并将其捆绑到单个可执行文件中。全局安装,
npm i -g nexe
然后创建你的木偶脚本。这是一个示例文件,
const puppeteer = require("puppeteer");
async function scraper(url) {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(url);
const title = await page.title();
await browser.close();
return title;
}
scraper("http://example.com").then(console.log);
现在将其捆绑使用,
nexe index.js
最后复制节点模块文件夹和捆绑可执行文件文件发送给您的客户。
Electron
您可以使用电子创建一个漂亮的 GUI,并使用电子生成器创建可执行文件。
PS:GUI 是可选的,不是这个答案的一部分。它只是为了展示如何为您的客户端提供可执行文件,它的作用不仅仅是运行浏览器。
我不会讨论什么是电子及其工作原理,而是使用一个快速入门示例。如果你想得到最终的代码,检查这个仓库 https://github.com/entrptaher/electron-quickstart-puppeteer.
首先克隆快速启动存储库,
git clone https://github.com/electron/electron-quick-start
然后安装 puppeteer 和 electro-builder,
yarn add puppeteer
npm i -g electron-builder
现在编辑main.js
并添加nodeIntegration: true
to webPreferences
,
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
nodeIntegration: true // <-- this line
}
})
现在编辑index.html
并添加一个按钮和结果容器,
<p><button>Get Result</button><div id="result"></div></p>
Edit renderer.js
并粘贴我们在下一个示例中使用的示例代码。另外使用这些线,
document.querySelector("button").addEventListener("click", async function() {
const result = await scraper("http://example.com");
document.querySelector("#result").innerHTML = result;
});
现在打开 package.json 并添加这些选项,以便我们可以运行 chromium 二进制文件,
"build": {
"extraResources": "node_modules",
"files": [
"!node_modules"
]
}
现在构建应用程序,
electron-builder
Open dist
文件夹,您将获得您的软件包应用程序。你可以运行并得到结果,