
一个普通 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 是个方法 |