产生的问题:我使用nodejs和electron开发应用,make后生成的exe可执行文件没有nodejs引入的模块涉及的功能。
左图是开发环境使用命令“npm start”正常运行的界面,右图是make后产生的exe文件运行界面。引入的模块是child_process(经测试,任何nodejs引入的模块都无法使用)。
开发环境:
开发使用的操作系统:windows 11企业版22H2
node版本:19.6.0
npm版本:9.4.1
electron版本:23.0.0
相关代码如上图所示,我在electron项目中的preload.js文件中添加了子进程模块child_process,在make后并没有起作用。preload.js具体代码如下:
const { fork } = require('child_process')
const netcheck = fork('./netcheck.js')
window.addEventListener('DOMContentLoaded', () => {
const status = document.getElementById('status')
netcheck.on('message', (m)=>{
netcheck.send('check')
status.innerText = m.data
})
netcheck.send('check')
})
子进程文件netcheck.js的代码如下:
const dns = require('node:dns')
process.on('message',()=>{
setTimeout(getNetstatus,3000)
})
function getNetstatus(){
dns.lookup('cloud.tencent.com',(err)=>{
if (err){
msg = {code:0,data:"网络出错,请检查网络连接"}
process.send(msg)
}else{
msg = {code:1,data:"网络连接正常"}
process.send(msg)
}
})
}
前端html、javascript、css都正常,仅仅是nodejs部分没有起作用。
上面看到的“正在检测网络状态”的字样是预先在html里设定好的。
以下是入口程序main.js的代码:
// main.js
const { app, BrowserWindow} = require('electron')
const { join } = require('path')
const createWindow = () => {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegrationInWorker: true,
preload: join(__dirname, 'preload.js')
}
})
mainWindow.loadFile('index.html')
mainWindow.webContents.openDevTools()
}
app.whenReady().then(() => {
createWindow()
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) createWindow()
})
})
以下是index.html文件:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
<title>检测</title>
<link type="text/css" rel="stylesheet" href="resources/bootstrap-icons.css">
<link type="text/css" rel="stylesheet" href="resources/main.css">
</head>
<body>
<div id="brand">
<i class="bi bi-globe2"></i><div><span>好抓</span>网络抓取客户端</div>
</div>
<div id="status">正在检测网络状态</div>
<div id="list" class="list-normal"></div>
<script type="text/javascript" src="resources/require.js" data-main="resources/index.js"></script>
</body>
</html>
打包过程:
- 下载electron-forge并导入项目
npm install --save-dev @electron-forge/cli npx electron-forge import
- 然后make
npm run make