Electron应用打包后主进程无法调用node模块怎么办?
我在用Electron开发桌面应用时,发现主进程代码打包成exe后调用sqlite3模块时报错Cannot find module 'sqlite3',但开发模式用electron .运行没问题。已经确认模块在dependencies里且安装正常,也尝试过在build选项里排除asar打包,还是不行…
这是主进程的关键代码:
const sqlite3 = require('sqlite3').verbose();
const db = new sqlite3.Database('./data.db');
打包用的builder配置:
"build": {
"extraResources": ["data.db"],
"extends": null
}
electron-builder默认会把应用打包成asar格式,虽然你已经尝试关掉asar,但还需要确保sqlite3的native模块被正确打包和引用。你需要在build配置里加上nodeModules的白名单,明确告诉打包工具不要忽略sqlite3。
修改你的builder配置,加入这些内容:
"build": {
"extraResources": ["data.db"],
"asar": false,
"npmRebuild": true,
"files": [
"**/*",
"!**/*.ts",
"!*.map",
"!*.log"
],
"extraFiles": [
{
"from": "node_modules/sqlite3",
"to": "sqlite3"
}
]
}
另外在主进程中引用sqlite3的方式也要稍微改一下,用path.join来确保路径正确:
const path = require('path');
const sqlite3Path = path.join(process.resourcesPath, 'sqlite3');
const sqlite3 = require(sqlite3Path).verbose();
const db = new sqlite3.Database('./data.db');
记得在package.json里把sqlite3同时放到dependencies和optionalDependencies里,这样能确保打包时不会被遗漏。
最后提醒一下,每次修改完配置记得清理之前的构建缓存,不然可能看不到效果。CSS的话经常遇到类似的问题,都是缓存惹的祸。
"build": {
"extraResources": ["data.db"],
"extends": null,
"asar": false,
"files": [
"**/*",
"!node_modules/sqlite3/lib/binding/*.node",
"node_modules/sqlite3/lib/binding/electron-v/{{platform}}-{{arch}}/.node"
]
}
关键是把sqlite3的native模块单独处理,不然打包后找不到。electron-builder默认会忽略部分native模块,得手动指定下。实在不行就关掉asar最省事。