fix: add fallback for Node.js built-in modules in webpack config

This commit is contained in:
ElyPrism 2026-01-31 13:47:58 +08:00
parent d8ecb31f7b
commit f25e752a04
No known key found for this signature in database
4 changed files with 66 additions and 27 deletions

14
main.js
View File

@ -11,7 +11,19 @@ if (!fs.existsSync(anonymousTokenPath)) {
/** @type {Record<string, any>} */ /** @type {Record<string, any>} */
let obj = {} let obj = {}
const modulePath = path.join(__dirname, 'module') // 当打包后运行时__dirname会指向bundle.js的位置需要回退到上级目录查找module
// 检查当前目录下是否存在module文件夹如果不存在则尝试在上级目录查找
// 如果上级目录也不存在,抛出错误
let modulePath = path.join(__dirname, 'module')
if (!fs.existsSync(modulePath)) {
modulePath = path.join(__dirname, '..', 'module')
}
if (!fs.existsSync(modulePath)) {
throw new Error(
`Module directory not found at ${path.join(__dirname, 'module')} or ${modulePath}`,
)
}
const moduleFiles = fs.readdirSync(modulePath).reverse() const moduleFiles = fs.readdirSync(modulePath).reverse()
let requestModule = null let requestModule = null

View File

@ -1,6 +1,6 @@
# Webpack Bundle 使用说明 # Webpack Bundle 使用说明
本项目已配置为使用 Webpack 构建单文件 bundle放置在 `./precompiled` 目录下。 本项目已配置为使用 Webpack 构建 bundle放置在 `./precompiled` 目录下。
## 构建命令 ## 构建命令
@ -14,38 +14,46 @@ npm run build
npm run build:prod npm run build:prod
``` ```
## 注意事项 ## 重要说明
由于本项目使用了动态模块加载(特别是 `./module` 目录下的 API 模块),完全的单文件打包会有一些限制: 由于本项目设计上使用了动态模块加载(特别是 `./module` 目录下的 API 模块),使用 Webpack 打包存在技术限制:
1. Webpack 生成的 bundle 文件 (`precompiled/bundle.js`) 依赖于项目根目录的 `module` 文件夹来动态加载 API 模块 1. **当前限制**:项目中的动态 require 语句(如 `require(filePath)`,其中 filePath 是变量)在 Webpack 打包时难以完全处理。
2. 因此,部署时需要同时包含 `bundle.js``module` 文件夹 2. **部署要求**:要运行 `precompiled/bundle.js`,必须保持原始项目结构,包括 `module``util` 等文件夹。
3. 完整的部署结构应如下: 3. **推荐方案**:对于真正的单文件部署,建议使用项目自带的 pkg 配置:
``` ```bash
project/ npm run pkgwin # Windows
├── precompiled/ npm run pkglinux # Linux
│ └── bundle.js npm run pkgmacos # macOS
├── module/
│ ├── album_detail.js
│ ├── artist_album.js
│ └── ... (所有API模块文件)
├── node_modules/
└── ... (其他依赖文件夹)
``` ```
## 运行 ## 完整部署结构
如果要使用 Webpack bundle需要保留的文件夹
```
project/
├── precompiled/
│ └── bundle.js
├── module/ # API 模块
├── util/ # 工具函数
├── public/ # 静态资源
├── data/ # 数据文件
├── node_modules/ # 依赖包
└── ... (其他文件夹)
```
## 运行(需要完整项目结构)
```bash ```bash
node precompiled/bundle.js node precompiled/bundle.js
``` ```
## 替代方案 ## 推荐的部署方式
如果您需要真正的单文件部署,可以考虑使用项目中已有的 pkg 配置: 对于生产环境,我们推荐使用 pkg 构建的单文件
```bash ```bash
npm run pkgwin # Windows npm run pkgwin
npm run pkglinux # Linux # 生成的可执行文件位于 bin/app.exe
npm run pkgmacos # macOS
``` ```
这些命令会创建真正的单文件可执行程序,其中包含了所有必要的依赖。 种方式会创建完全自包含的可执行文件,不需要额外的模块文件夹

File diff suppressed because one or more lines are too long

View File

@ -10,6 +10,25 @@ module.exports = {
}, },
resolve: { resolve: {
extensions: ['.js', '.json'], extensions: ['.js', '.json'],
// 为 Node.js 内置模块提供 fallback
fallback: {
"fs": false,
"path": false,
"os": false,
"crypto": false,
"url": false,
"querystring": false,
"http": false,
"https": false,
"zlib": false,
"stream": false,
"util": false,
"buffer": false,
"events": false,
"string_decoder": false,
"process": false,
"console": false
}
}, },
// 排除所有node_modules中的依赖因为它们在运行时会被require // 排除所有node_modules中的依赖因为它们在运行时会被require
externals: [ externals: [
@ -59,8 +78,8 @@ module.exports = {
// 为动态模块提供上下文 // 为动态模块提供上下文
plugins: [ plugins: [
new (require('webpack')).ContextReplacementPlugin( new (require('webpack')).ContextReplacementPlugin(
/util[\/\\]request/, // 针对request模块路径 /main\.js$/, // 针对main.js中的动态require
path.resolve(__dirname) path.resolve(__dirname, 'module')
) )
], ],
// 避免对Node.js内置模块的警告 // 避免对Node.js内置模块的警告