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
相关产品推荐
相关产品推荐

