mirror of
https://github.com/NeteaseCloudMusicApiEnhanced/api-enhanced.git
synced 2026-02-04 04:43:10 +00:00
fix: add fallback for Node.js built-in modules in webpack config
This commit is contained in:
parent
d8ecb31f7b
commit
f25e752a04
14
main.js
14
main.js
@ -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
|
||||||
|
|||||||
@ -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
@ -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内置模块的警告
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user