You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Electron+TypeScript集成Knex出现node_modules模块解析错误

Electron + TypeScript 集成 Knex 时出现模块缺失错误

我有一个正常运行的Electron+TypeScript应用,主进程是main.ts。取消注释顶部6行Knex相关代码后,出现10条「Module not found. Can't resolve...」错误,涉及better-sqlite3、tedious、mysql2等模块;实际使用MySQL且已安装mysql包,但仍报错。


主进程代码(main.ts)

import { app, BrowserWindow } from 'electron';
import * as path from 'path';
import * as url from 'url';

// import knex from 'knex';
// import config from '../knexconfig';

// const db = knex(config);

let mainWindow: Electron.BrowserWindow | null;


async function init() {
    // db.select('*').from('users').then((rows) => {
    //     console.log(rows);
    // });

    createWindow();
}

function createWindow() {
    mainWindow = new BrowserWindow({
        webPreferences: {
            nodeIntegration: true,
            contextIsolation: false,
        },
    });

    process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = '1';

    if (process.env.NODE_ENV === 'development') {
        mainWindow.loadURL(`http://localhost:4000`);
        mainWindow.webContents.openDevTools();
    } else {
        mainWindow.loadURL(
            url.format({
                pathname: path.join(__dirname, 'index.html'),
                protocol: 'file:',
                slashes: true
            })
        );
    }

    mainWindow.on('closed', () => {
        mainWindow = null;
    });
}

app.on('ready', init);

错误详情

ERROR in ./node_modules/knex/lib/dialects/better-sqlite3/index.js 7:11-36
Module not found: Error: Can't resolve 'better-sqlite3' in 'C:\Users\timom\WebstormProjects\am-calendar\node_modules\knex\lib\dialects\better-sqlite3'
 @ ./node_modules/knex/lib/dialects/index.js 6:26-53
 @ ./node_modules/knex/lib/knex-builder/internal/config-resolver.js 5:36-61
 @ ./node_modules/knex/lib/knex-builder/Knex.js 7:26-63
 @ ./node_modules/knex/lib/index.js 1:13-43
 @ ./node_modules/knex/knex.js 8:13-35
 @ ./electron/main.ts 8:0-24 10:9-13

ERROR in ./node_modules/knex/lib/dialects/mssql/index.js 94:16-34
Module not found: Error: Can't resolve 'tedious' in 'C:\Users\timom\WebstormProjects\am-calendar\node_modules\knex\lib\dialects\mssql'
 @ ./node_modules/knex/lib/dialects/index.js 8:15-33
 @ ./node_modules/knex/lib/knex-builder/internal/config-resolver.js 5:36-61
 @ ./node_modules/knex/lib/knex-builder/Knex.js 7:26-63
 @ ./node_modules/knex/lib/index.js 1:13-43
 @ ./node_modules/knex/knex.js 8:13-35
 @ ./electron/main.ts 8:0-24 10:9-13

ERROR in ./node_modules/knex/lib/dialects/mysql2/index.js 15:11-28
Module not found: Error: Can't resolve 'mysql2' in 'C:\Users\timom\WebstormProjects\am-calendar\node_modules\knex\lib\dialects\mysql2'
 @ ./node_modules/knex/lib/dialects/index.js 10:16-35
 @ ./node_modules/knex/lib/knex-builder/internal/config-resolver.js 5:36-61
 @ ./node_modules/knex/lib/knex-builder/Knex.js 7:26-63
 @ ./node_modules/knex/lib/index.js 1:13-43
 @ ./node_modules/knex/knex.js 8:13-35
 @ ./electron/main.ts 8:0-24 10:9-13

ERROR in ./node_modules/knex/lib/dialects/oracledb/index.js 37:21-40
Module not found: Error: Can't resolve 'oracledb' in 'C:\Users\timom\WebstormProjects\am-calendar\node_modules\knex\lib\dialects\oracledb'
 @ ./node_modules/knex/lib/dialects/index.js 12:18-39
 @ ./node_modules/knex/lib/knex-builder/internal/config-resolver.js 5:36-61
 @ ./node_modules/knex/lib/knex-builder/Knex.js 7:26-63
 @ ./node_modules/knex/lib/index.js 1:13-43
 @ ./node_modules/knex/knex.js 8:13-35
 @ ./electron/main.ts 8:0-24 10:9-13

ERROR in ./node_modules/knex/lib/dialects/oracledb/utils.js 40:19-38
Module not found: Error: Can't resolve 'oracledb' in 'C:\Users\timom\WebstormProjects\am-calendar\node_modules\knex\lib\dialects\oracledb'
 @ ./node_modules/knex/lib/dialects/oracledb/index.js 16:4-22
 @ ./node_modules/knex/lib/dialects/index.js 12:18-39
 @ ./node_modules/knex/lib/knex-builder/internal/config-resolver.js 5:36-61
 @ ./node_modules/knex/lib/knex-builder/Knex.js 7:26-63
 @ ./node_modules/knex/lib/index.js 1:13-43
 @ ./node_modules/knex/knex.js 8:13-35
 @ ./electron/main.ts 8:0-24 10:9-13

ERROR in ./node_modules/knex/lib/dialects/pgnative/index.js 13:11-31
Module not found: Error: Can't resolve 'pg' in 'C:\Users\timom\WebstormProjects\am-calendar\node_modules\knex\lib\dialects\pgnative'
 @ ./node_modules/knex/lib/dialects/index.js 13:18-39
 @ ./node_modules/knex/lib/knex-builder/internal/config-resolver.js 5:36-61
 @ ./node_modules/knex/lib/knex-builder/Knex.js 7:26-63
 @ ./node_modules/knex/lib/index.js 1:13-43
 @ ./node_modules/knex/knex.js 8:13-35
 @ ./electron/main.ts 8:0-24 10:9-13

ERROR in ./node_modules/knex/lib/dialects/postgres/index.js 63:11-24
Module not found: Error: Can't resolve 'pg' in 'C:\Users\timom\WebstormProjects\am-calendar\node_modules\knex\lib\dialects\postgres'
 @ ./node_modules/knex/lib/dialects/index.js 14:18-39
 @ ./node_modules/knex/lib/knex-builder/internal/config-resolver.js 5:36-61
 @ ./node_modules/knex/lib/knex-builder/Knex.js 7:26-63
 @ ./node_modules/knex/lib/index.js 1:13-43
 @ ./node_modules/knex/knex.js 8:13-35
 @ ./electron/main.ts 8:0-24 10:9-13

ERROR in ./node_modules/knex/lib/dialects/postgres/index.js 192:8-34
Module not found: Error: Can't resolve 'pg-query-stream' in 'C:\Users\timom\WebstormProjects\am-calendar\node_modules\knex\lib\dialects\postgres'
 @ ./node_modules/knex/lib/dialects/index.js 14:18-39
 @ ./node_modules/knex/lib/knex-builder/internal/config-resolver.js 5:36-61
 @ ./node_modules/knex/lib/knex-builder/Knex.js 7:26-63
 @ ./node_modules/knex/lib/index.js 1:13-43
 @ ./node_modules/knex/knex.js 8:13-35
 @ ./electron/main.ts 8:0-24 10:9-13

ERROR in ./node_modules/knex/lib/dialects/redshift/index.js 44:11-24
Module not found: Error: Can't resolve 'pg' in 'C:\Users\timom\WebstormProjects\am-calendar\node_modules\knex\lib\dialects\redshift'
 @ ./node_modules/knex/lib/dialects/index.js 15:18-39
 @ ./node_modules/knex/lib/knex-builder/internal/config-resolver.js 5:36-61
 @ ./node_modules/knex/lib/knex-builder/Knex.js 7:26-63
 @ ./node_modules/knex/lib/index.js 1:13-43
 @ ./node_modules/knex/knex.js 8:13-35
 @ ./electron/main.ts 8:0-24 10:9-13

ERROR in ./node_modules/knex/lib/dialects/sqlite3/index.js 42:11-29
Module not found: Error: Can't resolve 'sqlite3' in 'C:\Users\timom\WebstormProjects\am-calendar\node_modules\knex\lib\dialects\sqlite3'
 @ ./node_modules/knex/lib/dialects/index.js 16:17-37
 @ ./node_modules/knex/lib/knex-builder/internal/config-resolver.js 5:36-61
 @ ./node_modules/knex/lib/knex-builder/Knex.js 7:26-63
 @ ./node_modules/knex/lib/index.js 1:13-43
 @ ./node_modules/knex/knex.js 8:13-35
 @ ./electron/main.ts 8:0-24 10:9-13

10 errors have detailed information that is not shown.
Use 'stats.errorDetails: true' resp. '--stats-error-details' to show it.

webpack 5.89.0 compiled with 10 errors and 2 warnings in 1270 ms

Electron Webpack 配置文件

const path = require('path');

module.exports = {
    resolve: {
        extensions: ['.tsx', '.ts', '.js'],
    },
    devtool: 'source-map',
    entry: './electron/main.ts',
    target: 'electron-main',
    module: {
        rules: [
            {
                test: /\.(js|ts|tsx)$/,
                exclude: /node_modules/,
                use: {
                    loader: 'babel-loader',
                },
            }
        ],
    },
    output: {
        path: path.resolve(__dirname, './dist'),
        filename: '[name].js',
    },
};

package.json

{
  "name": "am-calendar",
  "version": "1.0.0",
  "description": "",
  "main": "./dist/main.js",
  "scripts": {
    "dev:electron": "cross-env NODE_ENV=development webpack --config webpack.electron.config.js --mode development && electron .",
    "dev:react": "cross-env NODE_ENV=development webpack-dev-server --config webpack.react.config.js --mode development"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@babel/plugin-proposal-decorators": "^7.23.3",
    "@babel/preset-react": "^7.23.3",
    "@types/node": "^20.10.0",
    "electron": "^27.1.0",
    "file-loader": "^6.2.0",
    "html-webpack-plugin": "^5.5.3",
    "ts-loader": "^9.5.1",
    "typescript": "^5.3.2",
    "url-loader": "^4.1.1"
  },
  "dependencies": {
    "@babel/core": "^7.23.3",
    "@babel/preset-env": "^7.23.3",
    "@babel/preset-typescript": "^7.23.3",
    "@types/react": "^18.2.38",
    "@types/react-dom": "^18.2.17",
    "babel-loader": "^9.1.3",
    "cross-env": "^7.0.3",
    "knex": "^3.0.1",
    "mysql": "^2.18.1",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "webpack": "^5.89.0",
    "webpack-cli": "^5.1.4",
    "webpack-dev-server": "^4.15.1"
  }
}

解决方案

1. 安装对应MySQL驱动

Knex默认优先使用mysql2而非mysql包,当前仅安装mysql但Knex的MySQL dialect引用的是mysql2,执行以下命令安装:

npm install mysql2

2. 配置Webpack忽略未使用的驱动

Webpack会尝试打包Knex所有dialect依赖的模块,即使你只用MySQL。通过webpack.IgnorePlugin忽略其他数据库的依赖:
修改Electron的Webpack配置文件,添加plugins配置:

const path = require('path');
const webpack = require('webpack');

module.exports = {
    resolve: {
        extensions: ['.tsx', '.ts', '.js'],
    },
    devtool: 'source-map',
    entry: './electron/main.ts',
    target: 'electron-main',
    module: {
        rules: [
            {
                test: /\.(js|ts|tsx)$/,
                exclude: /node_modules/,
                use: {
                    loader: 'babel-loader',
                },
            }
        ],
    },
    plugins: [
        new webpack.IgnorePlugin({
            resourceRegExp: /^(better-sqlite3|tedious|oracledb|pg|pg-query-stream|sqlite3)$/,
        }),
    ],
    output: {
        path: path.resolve(__dirname, './dist'),
        filename: '[name].js',
    },
};

3. 确认knexconfig配置正确

确保knexconfig.js指定正确的dialect:

module.exports = {
  client: 'mysql2', // 对应你安装的驱动,也可设为'mysql'
  connection: {
    host: '你的数据库地址',
    user: '数据库用户名',
    password: '数据库密码',
    database: '目标数据库名'
  }
};

4. 清理缓存重新构建

执行以下命令清理缓存并重新启动项目:

rm -rf node_modules/.cache
npm run dev:electron

内容的提问来源于stack exchange,提问作者Timo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 05:43:11