const path = require('path'); const glob = require('glob'); /** * 动态获取 src 目录下的所有入口文件 * 使用 glob.sync() 来获取 src 目录下的所有 .js 文件。 * 遍历这些文件,将文件路径转换为入口名称,去掉 src/ 前缀和 .js 后缀。 * 将入口名称和对应的文件路径添加到 entries 对象中。 * */ const getEntries = () => { const entries = {}; const files = glob.sync('src/**/*.js'); files.forEach((file) => { const entryName = file.replace(/^src\//, '').replace(/\.js$/, ''); entries[entryName] = `./${file}`; }); return entries; }; module.exports = { // 指定打包目标为 Electron 的主进程环境,确保 Webpack 能针对 Electron 主进程的特性进行打包。 target: 'electron-main', // 将 entry 设置为 getEntries() 的返回值,这样 Webpack 会根据动态获取的入口文件进行打包。 entry: getEntries(), output: { path: path.resolve(__dirname, 'dist'), // filename: '[name].js' 表示输出的文件名会根据入口名称来生成,这样可以保证按照文件夹分类打包。 filename: '[name].js', // 打包的库的模块类型,根据你写的代码,支持的写法有关,可以根据 ExeMainApp\package.json 的 "type": "commonjs", 配置来 // libraryTarget: 'umd', libraryTarget: 'commonjs2',// 让 Webpack 以 CommonJS 模块格式输出打包后的代码,便于 Node.js 和 Electron 环境使用。 // libraryTarget: 'commonjs', }, node: { // __dirname: false 和 __filename: false 使 Webpack 不改变 Node.js 中 __dirname 和 __filename 的行为,保证在打包后的代码里这些变量可以正常使用。 __dirname: false, __filename: false }, /** * 采用自定义函数来处理外部模块。正则表达式 /^[a-z\-0-9]+$/ 用于匹配 Node.js 核心模块和 node_modules 中的第三方模块, * 并将它们排除在打包范围之外,以 commonjs 形式引入,避免将这些模块打包进最终文件。 */ externals: [ function ({ context, request }, callback) { if (/^[a-z\-0-9]+$/.test(request)) { return callback(null, `commonjs ${request}`); } callback(); } ], resolve: { extensions: ['.js'], modules: [path.resolve(__dirname, 'src'), 'node_modules'] }, module: { // 使用 babel-loader 配合 @babel/preset-env 对 JavaScript 文件进行转译,确保代码能在目标环境中正常运行。 rules: [ { test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: ['@babel/preset-env'] } } } ] } };