V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
VensonEEE
V2EX  ›  Node.js

被 node 环境整疯了

  •  
  •   VensonEEE · 2020-01-07 16:55:32 +08:00 · 9988 次点击
    这是一个创建于 1563 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一个普通 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 文件没有被打包进去。 求吴彦祖大神审阅下工作。不甚感激。

    30 条回复    2020-01-10 22:21:08 +08:00
    Rrrrrr
        1
    Rrrrrr  
       2020-01-07 17:00:37 +08:00
    好歹把报错信息贴出来
    sunzongzheng
        2
    sunzongzheng  
       2020-01-07 17:00:56 +08:00
    VensonEEE
        3
    VensonEEE  
    OP
       2020-01-07 17:05:45 +08:00
    VensonEEE
        4
    VensonEEE  
    OP
       2020-01-07 17:06:24 +08:00
    @sunzongzheng 重新编译过了,不然 dev 就跑不起来
    VensonEEE
        5
    VensonEEE  
    OP
       2020-01-07 17:07:12 +08:00
    @Rrrrrr
    @sunzongzheng
    传了图,求指导
    BarZu
        6
    BarZu  
       2020-01-07 17:12:27 +08:00
    new sqlite.Sqlite() 这样子 ? 你应该输出 sqlite 看看是什么来的
    VensonEEE
        7
    VensonEEE  
    OP
       2020-01-07 17:14:42 +08:00
    @BarZu 是发布版有问题。 dev 是能正常运行的。发布版的 console 自动都去了
    项目地址:
    https://www.npmjs.com/package/better-sqlite3
    lovedebug
        8
    lovedebug  
       2020-01-07 17:16:24 +08:00
    一般都是引用库的版本有问题
    VensonEEE
        9
    VensonEEE  
    OP
       2020-01-07 17:22:20 +08:00
    ![微信截图_20200107172108.png]( https://i.loli.net/2020/01/07/T7GxBQE1KFiCuez.png)

    sqlite 好像是一个空对象,截图
    jtwor
        10
    jtwor  
       2020-01-07 17:29:18 +08:00
    不是应该去看看 package.json
    VensonEEE
        11
    VensonEEE  
    OP
       2020-01-07 17:34:39 +08:00
    @jtwor 运行版本 开发版本在 package.json 中没有单独配置项,所以开始就排除了。
    jtwor
        12
    jtwor  
       2020-01-07 17:39:39 +08:00
    能运行是本地你已经下载了这个库在那个 node_model 什么的 但发布是读 pkg 配置的把 里面没有打包也没把
    VensonEEE
        13
    VensonEEE  
    OP
       2020-01-07 17:46:14 +08:00
    @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"
    }
    }

    ```
    kimiler
        14
    kimiler  
       2020-01-07 17:51:40 +08:00
    为什么你这个帖子是黑色主题?
    VensonEEE
        15
    VensonEEE  
    OP
       2020-01-07 17:55:32 +08:00
    @kimiler 我也不清楚... 看着有点费劲
    ashong
        16
    ashong  
       2020-01-07 17:56:43 +08:00 via iPhone
    @kimiler nodejs 就是黑的
    UnluckyNinja
        17
    UnluckyNinja  
       2020-01-07 18:05:06 +08:00
    我看 better-sqlite3 官方文档没有写需要用 new 来调用吧
    我猜测是因为开发环境和生产环境的语法严格程度不一样,导致一边报错另一边忽略了
    不知楼主有没有用编辑器 linter 插件或者运行 lint 命令?

    顺便吐槽下 nodejs 节点配色下的语法高亮,背景和字都是黑的,简直反人类
    duan602728596
        18
    duan602728596  
       2020-01-07 18:14:05 +08:00 via iPhone
    1. 可以试试把 require 替换成 global.require
    2. 为什么不试试 IndexedDB 或者 WebSQL 呢
    cppgohan
        19
    cppgohan  
       2020-01-07 18:17:17 +08:00   ❤️ 1
    node 节点的现在的样式, 代码效果有点刺眼啊 @livid 老大看看
    VensonEEE
        20
    VensonEEE  
    OP
       2020-01-07 18:23:14 +08:00
    @UnluckyNinja 感谢老哥的仔细,我刚刚把 new 加上和去了在 dev 都可以,发布版依然不行,还是熟悉的臭虫味道。

    @duan602728596 需要在本地持久化存储一个文件。

    我觉得是版本的问题。难道我 electron 和 node 的版本太高了?
    ty89
        21
    ty89  
       2020-01-07 18:24:39 +08:00
    你们可能需要招一个 webpack 配置工程师
    jtwor
        22
    jtwor  
       2020-01-07 18:26:56 +08:00
    @UnluckyNinja 这是最坏的情况。。
    duan602728596
        23
    duan602728596  
       2020-01-07 19:15:04 +08:00 via iPhone
    奥,差点忘了,你可能需要用 electron-gyp 重新编译一下
    duan602728596
        24
    duan602728596  
       2020-01-07 19:18:50 +08:00 via iPhone
    如果模块原来是用 node-gyp 编译的,在 electron 里需要用 electron-gyp 重新编译
    shadeofgod
        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 应该会简单很多。
    crossle
        26
    crossle  
       2020-01-07 20:03:45 +08:00
    你可以参考我们开源的桌面程序 https://github.com/mixinnetwork/desktop-app, 同样是使用的 Electron + Vue + Better-sqlite3
    shadeofgod
        27
    shadeofgod  
       2020-01-08 00:17:16 +08:00
    @crossle 看了一下挺不错的,话说你们读写都在主窗口那个 renderer process 做吗?有没有引起过 UI 的卡顿问题?
    crossle
        28
    crossle  
       2020-01-08 15:23:20 +08:00
    @shadeofgod 都在 renderer process, 没感觉卡顿,难道还要在 main process ?
    shadeofgod
        29
    shadeofgod  
       2020-01-08 18:44:22 +08:00
    @crossle 如果一次要写的数据比较多就可能卡顿,放 main 也会,因为 main 需要不断和 renderer 进行 ipc 通信,我们是把写入放在另一个隐藏的 renderer process
    crossle
        30
    crossle  
       2020-01-10 22:21:08 +08:00
    @shadeofgod 是个方法
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1076 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 22:49 · PVG 06:49 · LAX 15:49 · JFK 18:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.