一个普通 elctron 应用,集成进一个 sqlite3.因为结果回调很麻烦,换成了 better-sqlite3;
编译,开发运行一起正常,这里是指在npm run dev
的环境下。
打包正常,运行的时候麻烦来了,一直报构造函数不是方法:
const sqlite = require('better-sqlite3');
this.db = new sqlite(file);
打包编译命令npm run electron:build
打包配置vue.config.js
module.exports = {
configureWebpack: {
module: {
rules: [{
test: /\.less$/,
use: [{
loader: 'less-loader', options: {
javascriptEnabled: true,
},
}],
}],
},
// Configuration applied to all builds
},
pluginOptions: {
electronBuilder: {
builderOptions: {
'productName': xxx',
'appId': 'xxx.xxx',
'copyright': 'xxx',//版权 信息
'dmg': {
'contents': [
{
'x': 410,
'y': 150,
'type': 'link',
'path': '/Applications',
},
{
'x': 130,
'y': 150,
'type': 'file',
},
],
},
'mac': {
'icon': 'build/icons/icon.icns',
},
'win': {
'icon': 'build/icons/icon.ico',
'target': [
{
'target': 'nsis',
'arch': [
'ia32',
],
},
],
},
'linux': {
'icon': 'build/icons',
},
// 'asar': false,
'directories': {
'output': 'dist_electron',
'buildResources': 'build',
'app': 'dist_electron/bundled',
},
'files': ['**/*'],
'extraResources': [
{
'from': './public/assets',
'to': './app/assets',
},
],
'nsis': {
'oneClick': false,
'allowToChangeInstallationDirectory': true,
'createDesktopShortcut': true,
'createStartMenuShortcut': true,
},
},
},
},
};
我怀疑是编译后的.node 文件没有被打包进去。 求吴彦祖大神审阅下工作。不甚感激。
1
Rrrrrr 2020-01-07 17:00:37 +08:00
好歹把报错信息贴出来
|
2
sunzongzheng 2020-01-07 17:00:56 +08:00
|
3
VensonEEE OP |
4
VensonEEE OP @sunzongzheng 重新编译过了,不然 dev 就跑不起来
|
5
VensonEEE OP |
6
BarZu 2020-01-07 17:12:27 +08:00
new sqlite.Sqlite() 这样子 ? 你应该输出 sqlite 看看是什么来的
|
7
VensonEEE OP |
8
lovedebug 2020-01-07 17:16:24 +08:00
一般都是引用库的版本有问题
|
9
VensonEEE OP |
10
jtwor 2020-01-07 17:29:18 +08:00
不是应该去看看 package.json
|
12
jtwor 2020-01-07 17:39:39 +08:00
能运行是本地你已经下载了这个库在那个 node_model 什么的 但发布是读 pkg 配置的把 里面没有打包也没把
|
13
VensonEEE OP @jtwor 确实是这样,不过我查了 pkg 也有。
``` { "name": "xxx", "version": "1.0.0", "private": true, "description": "xxx", "author": "xxx", "scripts": { "serve": "vue-cli-service serve", "build": "vue-cli-service build", "lint": "vue-cli-service lint", "dev": "vue-cli-service electron:serve", "electron:build": "vue-cli-service electron:build", "electron:serve": "vue-cli-service electron:serve", "postinstall": "electron-builder install-app-deps", "postuninstall": "electron-builder install-app-deps" }, "main": "background.js", "dependencies": { "@types/strophe": "^1.2.31", "@xmpp/client": "^0.9.1", "@xmpp/debug": "^0.9.1", "axios": "^0.18.0", "better-sqlite3": "^5.4.3", "bignumber.js": "^9.0.0", "cropperjs": "^1.5.6", "iview": "^3.5.4", "md5-typescript": "^1.0.5", "reflect-metadata": "^0.1.13", "strophe": "^1.2.4", "v-viewer": "^1.5.1", "vue": "^2.6.11", "vue-class-component": "^7.1.0", "vue-i18n": "^8.15.3", "vue-property-decorator": "^8.3.0", "vue-router": "^3.1.3", "vuex": "^3.1.2", "vuex-class": "^0.3.2" }, "devDependencies": { "@types/jquery": "^3.3.31", "@vue/cli-plugin-babel": "^3.12.1", "@vue/cli-plugin-typescript": "^3.12.1", "@vue/cli-service": "^3.12.1", "electron": "^7.1.7", "electron-rebuild": "^1.8.8", "jquery": "^3.4.1", "less": "^3.10.3", "less-loader": "^5.0.0", "node-sass": "^4.13.0", "sass-loader": "^7.3.1", "typescript": "^3.7.4", "vue-cli-plugin-electron-builder": "^1.4.4", "vue-template-compiler": "^2.6.11" } } ``` |
14
kimiler 2020-01-07 17:51:40 +08:00
为什么你这个帖子是黑色主题?
|
17
UnluckyNinja 2020-01-07 18:05:06 +08:00
我看 better-sqlite3 官方文档没有写需要用 new 来调用吧
我猜测是因为开发环境和生产环境的语法严格程度不一样,导致一边报错另一边忽略了 不知楼主有没有用编辑器 linter 插件或者运行 lint 命令? 顺便吐槽下 nodejs 节点配色下的语法高亮,背景和字都是黑的,简直反人类 |
18
duan602728596 2020-01-07 18:14:05 +08:00 via iPhone
1. 可以试试把 require 替换成 global.require
2. 为什么不试试 IndexedDB 或者 WebSQL 呢 |
20
VensonEEE OP @UnluckyNinja 感谢老哥的仔细,我刚刚把 new 加上和去了在 dev 都可以,发布版依然不行,还是熟悉的臭虫味道。
@duan602728596 需要在本地持久化存储一个文件。 我觉得是版本的问题。难道我 electron 和 node 的版本太高了? |
21
ty89 2020-01-07 18:24:39 +08:00
你们可能需要招一个 webpack 配置工程师
|
22
jtwor 2020-01-07 18:26:56 +08:00
@UnluckyNinja 这是最坏的情况。。
|
23
duan602728596 2020-01-07 19:15:04 +08:00 via iPhone
奥,差点忘了,你可能需要用 electron-gyp 重新编译一下
|
24
duan602728596 2020-01-07 19:18:50 +08:00 via iPhone
如果模块原来是用 node-gyp 编译的,在 electron 里需要用 electron-gyp 重新编译
|
25
shadeofgod 2020-01-07 19:49:01 +08:00
前段时间给 better sqlite3 重新编译了一个 sqlcipher 的版本在项目里用,也是很多坑。
1. webpack output 的目录看看有没有 .node 文件就知道有没有成功打包进去了。 2. "postinstall": "electron-builder install-app-deps" 这个已经干了 node-gyp rebuild 的活了。 3. windows 上使用 asar 会有问题,没找到解法,所以 win 上我干脆关掉 asar 了 4. 因为 sqlcipher 依赖 openssl 所以我碰到了一些缺少动态库的问题,但是报错也可能是报构造函数不是方法,完全看不出来缺了啥,最后用 http://www.dependencywalker.com/ 和 https://docs.microsoft.com/en-us/sysinternals/downloads/procmon 查了半天缺哪些东西。 还有一些杂七杂八的有点忘了,直接使用 better-sqlite3 应该会简单很多。 |
26
crossle 2020-01-07 20:03:45 +08:00
你可以参考我们开源的桌面程序 https://github.com/mixinnetwork/desktop-app, 同样是使用的 Electron + Vue + Better-sqlite3
|
27
shadeofgod 2020-01-08 00:17:16 +08:00
@crossle 看了一下挺不错的,话说你们读写都在主窗口那个 renderer process 做吗?有没有引起过 UI 的卡顿问题?
|
28
crossle 2020-01-08 15:23:20 +08:00
@shadeofgod 都在 renderer process, 没感觉卡顿,难道还要在 main process ?
|
29
shadeofgod 2020-01-08 18:44:22 +08:00
@crossle 如果一次要写的数据比较多就可能卡顿,放 main 也会,因为 main 需要不断和 renderer 进行 ipc 通信,我们是把写入放在另一个隐藏的 renderer process
|
30
crossle 2020-01-10 22:21:08 +08:00
@shadeofgod 是个方法
|