Some checks failed
Deploy to GitHub Pages / Deploy to GitHub Pages (push) Has been cancelled
205 lines
5.5 KiB
Vue
205 lines
5.5 KiB
Vue
#!/usr/bin/env node
|
||
|
||
// 禁用弃用警告
|
||
process.noDeprecation = true
|
||
|
||
const { rspack } = require('@rspack/core')
|
||
const path = require('path')
|
||
const fs = require('fs')
|
||
// 引入layouts中的donationConsole函数
|
||
const { donationConsole } = require('./layouts')
|
||
|
||
// 在命令行控制台打印信息
|
||
donationConsole()
|
||
|
||
const configPath = path.resolve(__dirname, 'rspack.config.js')
|
||
const config = require(configPath)
|
||
const mode = process.argv[2] === 'build' ? 'production' : 'development'
|
||
|
||
// 增加archiver依赖用于创建压缩包
|
||
const archiver = require('archiver')
|
||
const { promisify } = require('util')
|
||
const pipeline = promisify(require('stream').pipeline)
|
||
|
||
// 增强环境变量设置,确保所有编译阶段都使用相同的NODE_ENV值
|
||
process.env.NODE_ENV = mode
|
||
// 设置webpack特定的环境变量,以避免冲突
|
||
process.env.WEBPACK_ENV = mode
|
||
process.env.BABEL_ENV = mode
|
||
console.log('设置环境变量 NODE_ENV =', process.env.NODE_ENV)
|
||
|
||
// 读取配置
|
||
config.mode = mode
|
||
|
||
if (mode === 'production') {
|
||
// 生产环境配置
|
||
console.log('正在极速打包中,预计用时5秒,请稍后...')
|
||
|
||
// 生产环境下增加额外配置
|
||
config.optimization = {
|
||
...config.optimization,
|
||
moduleIds: 'deterministic', // 稳定的模块ID以优化长期缓存
|
||
chunkIds: 'deterministic', // 稳定的chunk ID以优化长期缓存
|
||
removeEmptyChunks: true, // 移除空的chunks
|
||
}
|
||
|
||
// 在构建前删除dist目录
|
||
const distPath = path.resolve(__dirname, 'dist')
|
||
if (fs.existsSync(distPath)) {
|
||
fs.rmSync(distPath, { recursive: true })
|
||
console.log('已删除旧的dist目录')
|
||
}
|
||
|
||
rspack(config).run((err, stats) => {
|
||
if (err) {
|
||
console.error(err.stack || err)
|
||
if (err.details) {
|
||
console.error(err.details)
|
||
}
|
||
process.exit(1)
|
||
return
|
||
}
|
||
|
||
const info = stats.toJson()
|
||
|
||
if (stats.hasErrors()) {
|
||
console.error(info.errors)
|
||
}
|
||
|
||
if (stats.hasWarnings()) {
|
||
console.warn(info.warnings)
|
||
}
|
||
|
||
console.log(
|
||
stats.toString({
|
||
colors: true,
|
||
modules: false,
|
||
children: false,
|
||
chunks: false,
|
||
chunkModules: false,
|
||
})
|
||
)
|
||
|
||
// 打包完成后创建压缩包
|
||
createArchive()
|
||
})
|
||
} else {
|
||
// 开发环境配置
|
||
try {
|
||
// 尝试使用rspack的dev server
|
||
const { RspackDevServer } = require('@rspack/dev-server')
|
||
|
||
const compiler = rspack(config)
|
||
|
||
// 使用rspack.config.js中的所有devServer配置
|
||
const devServerOptions = config.devServer || {}
|
||
|
||
// 设置mock服务器
|
||
if (process.env.VUE_APP_MOCK_ENABLE === 'true' && !devServerOptions.setupMiddlewares) {
|
||
devServerOptions.setupMiddlewares = (middlewares, devServer) => {
|
||
if (!devServer) {
|
||
throw new Error('dev-server is not defined')
|
||
}
|
||
|
||
const mockServer = require('./mock/index')
|
||
mockServer(devServer.app)
|
||
|
||
return middlewares
|
||
}
|
||
}
|
||
|
||
const server = new RspackDevServer(devServerOptions, compiler)
|
||
|
||
server.start().catch((err) => {
|
||
console.error('启动RspackDevServer失败:', err)
|
||
})
|
||
} catch (error) {
|
||
console.error('加载@rspack/dev-server失败,尝试使用webpack-dev-server:', error)
|
||
|
||
// 如果rspack dev server失败,尝试回退到webpack
|
||
try {
|
||
const webpack = require('webpack')
|
||
const WebpackDevServer = require('webpack-dev-server')
|
||
|
||
const webpackConfig = {
|
||
...config,
|
||
// 添加webpack特定配置
|
||
mode: config.mode,
|
||
}
|
||
|
||
const compiler = webpack(webpackConfig)
|
||
const devServerOptions = config.devServer || {}
|
||
|
||
if (process.env.VUE_APP_MOCK_ENABLE === 'true') {
|
||
const originalBefore = devServerOptions.before
|
||
devServerOptions.before = (app, server) => {
|
||
if (originalBefore) {
|
||
originalBefore(app, server)
|
||
}
|
||
const mockServer = require('./mock/index')
|
||
mockServer(app)
|
||
}
|
||
}
|
||
|
||
const server = new WebpackDevServer(devServerOptions, compiler)
|
||
|
||
server.start().catch((err) => {
|
||
console.error('启动WebpackDevServer失败:', err)
|
||
})
|
||
} catch (webpackError) {
|
||
console.error('回退到webpack-dev-server也失败:', webpackError)
|
||
process.exit(1)
|
||
}
|
||
}
|
||
}
|
||
|
||
// 创建压缩包的函数
|
||
async function createArchive() {
|
||
const outputPath = path.resolve(__dirname, 'dist')
|
||
// 修改为在dist目录内创建压缩包
|
||
const archivePath = path.resolve(__dirname, 'dist', 'dist.zip')
|
||
|
||
// 检查dist目录是否存在
|
||
if (!fs.existsSync(outputPath)) {
|
||
console.error('dist目录不存在,请先执行构建')
|
||
return
|
||
}
|
||
|
||
console.log('正在创建压缩包...')
|
||
|
||
try {
|
||
// 创建写入流
|
||
const output = fs.createWriteStream(archivePath)
|
||
// 创建archiver实例
|
||
const archive = archiver('zip', {
|
||
zlib: { level: 9 } // 设置压缩级别
|
||
})
|
||
|
||
// 监听完成事件
|
||
output.on('close', function() {
|
||
console.log(`压缩包创建完成: ${archivePath}`)
|
||
console.log(`压缩包大小: ${(archive.pointer() / 1024 / 1024).toFixed(2)} MB`)
|
||
})
|
||
|
||
// 监听错误事件
|
||
archive.on('error', function(err) {
|
||
throw err
|
||
})
|
||
|
||
// 关联archiver和输出流
|
||
archive.pipe(output)
|
||
|
||
// 添加整个dist目录到压缩包,但排除dist.zip自身
|
||
archive.glob('**/*', {
|
||
cwd: outputPath,
|
||
ignore: 'dist.zip' // 忽略压缩包自身
|
||
})
|
||
|
||
// 完成归档
|
||
await archive.finalize()
|
||
|
||
console.log('打包并压缩完成!')
|
||
} catch (error) {
|
||
console.error('创建压缩包时出错:', error)
|
||
}
|
||
} |