ci: Add webpack configuration and license file for bundle.js

- Created webpack.config.js to configure the build process for the application.
- Set entry point to app.js and output to precompiled/bundle.js.
- Excluded node_modules from the bundle and specified external dependencies.
- Added Babel loader for transpiling JavaScript files.
- Included a license file for regenerator-runtime in precompiled directory.
This commit is contained in:
ElyPrism 2026-01-31 13:35:04 +08:00
parent 2b69e9dda5
commit d8ecb31f7b
No known key found for this signature in database
6 changed files with 2128 additions and 6 deletions

View File

@ -11,7 +11,11 @@
"prepare": "husky install", "prepare": "husky install",
"pkgwin": "pkg . -t node18-win-x64 -C GZip -o bin/app --no-bytecode", "pkgwin": "pkg . -t node18-win-x64 -C GZip -o bin/app --no-bytecode",
"pkglinux": "pkg . -t node18-linux-x64 -C GZip -o bin/app --no-bytecode", "pkglinux": "pkg . -t node18-linux-x64 -C GZip -o bin/app --no-bytecode",
"pkgmacos": "pkg . -t node18-macos-x64 -C GZip -o bin/app --no-bytecode" "pkgmacos": "pkg . -t node18-macos-x64 -C GZip -o bin/app --no-bytecode",
"build": "webpack --config webpack.config.js",
"build:prod": "webpack --mode production --config webpack.config.js",
"build:dev": "webpack --mode development --config webpack.config.js",
"start:bundle": "node precompiled/bundle.js"
}, },
"bin": "./app.js", "bin": "./app.js",
"pkg": { "pkg": {
@ -83,6 +87,8 @@
"yargs": "^18.0.0" "yargs": "^18.0.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.28.6",
"@babel/preset-env": "^7.28.6",
"@eslint/eslintrc": "^3.3.3", "@eslint/eslintrc": "^3.3.3",
"@eslint/js": "^9.39.2", "@eslint/js": "^9.39.2",
"@types/express": "^5.0.6", "@types/express": "^5.0.6",
@ -91,6 +97,7 @@
"@types/node": "25.0.9", "@types/node": "25.0.9",
"@typescript-eslint/eslint-plugin": "8.46.3", "@typescript-eslint/eslint-plugin": "8.46.3",
"@typescript-eslint/parser": "8.53.0", "@typescript-eslint/parser": "8.53.0",
"babel-loader": "^10.0.0",
"eslint": "9.39.0", "eslint": "9.39.0",
"eslint-config-prettier": "10.1.8", "eslint-config-prettier": "10.1.8",
"eslint-plugin-html": "8.1.3", "eslint-plugin-html": "8.1.3",
@ -104,6 +111,8 @@
"pkg": "^5.8.1", "pkg": "^5.8.1",
"power-assert": "1.6.1", "power-assert": "1.6.1",
"prettier": "3.7.4", "prettier": "3.7.4",
"typescript": "5.9.3" "typescript": "5.9.3",
"webpack": "^5.104.1",
"webpack-cli": "^6.0.1"
} }
} }

1996
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

51
precompiled/README.md Normal file
View File

@ -0,0 +1,51 @@
# Webpack Bundle 使用说明
本项目已配置为使用 Webpack 构建单文件 bundle放置在 `./precompiled` 目录下。
## 构建命令
```bash
# 开发模式构建
npm run build:dev
# 生产模式构建(默认)
npm run build
# 或
npm run build:prod
```
## 注意事项
由于本项目使用了动态模块加载(特别是 `./module` 目录下的 API 模块),完全的单文件打包会有一些限制:
1. Webpack 生成的 bundle 文件 (`precompiled/bundle.js`) 依赖于项目根目录的 `module` 文件夹来动态加载 API 模块
2. 因此,部署时需要同时包含 `bundle.js``module` 文件夹
3. 完整的部署结构应如下:
```
project/
├── precompiled/
│ └── bundle.js
├── module/
│ ├── album_detail.js
│ ├── artist_album.js
│ └── ... (所有API模块文件)
├── node_modules/
└── ... (其他依赖文件夹)
```
## 运行
```bash
node precompiled/bundle.js
```
## 替代方案
如果您需要真正的单文件部署,可以考虑使用项目中已有的 pkg 配置:
```bash
npm run pkgwin # Windows
npm run pkglinux # Linux
npm run pkgmacos # macOS
```
这些命令会创建真正的单文件可执行程序,其中包含了所有必要的依赖。

2
precompiled/bundle.js Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */

71
webpack.config.js Normal file
View File

@ -0,0 +1,71 @@
const path = require('path');
module.exports = {
entry: './app.js',
target: 'node',
output: {
path: path.resolve(__dirname, 'precompiled'),
filename: 'bundle.js',
libraryTarget: 'commonjs2',
},
resolve: {
extensions: ['.js', '.json'],
},
// 排除所有node_modules中的依赖因为它们在运行时会被require
externals: [
// 项目依赖的所有外部模块
'express',
'fs',
'path',
'os',
'child_process',
'crypto-js',
'dotenv',
'express-fileupload',
'md5',
'music-metadata',
'node-forge',
'pac-proxy-agent',
'qrcode',
'safe-decode-uri-component',
'tunnel',
'xml2js',
'yargs',
'axios',
'@neteasecloudmusicapienhanced/unblockmusic-utils',
/\.node$/, // 排除.node文件
],
module: {
rules: [
{
test: /\.js$/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env'],
},
},
exclude: /node_modules/,
},
],
},
mode: 'production',
optimization: {
minimize: true,
},
stats: {
errorDetails: true
},
// 为动态模块提供上下文
plugins: [
new (require('webpack')).ContextReplacementPlugin(
/util[\/\\]request/, // 针对request模块路径
path.resolve(__dirname)
)
],
// 避免对Node.js内置模块的警告
node: {
__dirname: false,
__filename: false,
}
};