You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

254 lines
6.8 KiB

const path = require('path')
const { defineConfig } = require('@vue/cli-service')
// 设置环境变量
process.env.VUE_CLI_BABEL_TRANSPILE_MODULES = 'false'
process.env.VUE_CLI_MODERN_BUILD = 'false'
// 设置日志级别
process.env.VUE_CLI_LOG_LEVEL = 'info'
process.env.VUE_CLI_DEBUG = 'true'
// 设置编码 - 增强版
process.env.LANG = 'zh_CN.UTF-8'
process.env.LC_ALL = 'zh_CN.UTF-8'
process.env.NODE_OPTIONS = '--max-old-space-size=4096'
process.env.CHROME_BIN = process.env.CHROME_BIN || 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe'
// 强制设置控制台编码
if (process.platform === 'win32') {
process.env.PYTHONIOENCODING = 'utf-8'
process.env.PYTHONLEGACYWINDOWSSTDIO = 'utf-8'
}
const appRoot = path.resolve(__dirname)
module.exports = defineConfig({
outputDir: path.join(appRoot, 'dist/renderer'),
publicPath: '',
configureWebpack: {
target: 'electron-renderer',
// 完全禁用eval,强制使用安全的sourcemap
devtool: false,
resolve: {
alias: {
'@': path.join(appRoot, 'src/renderer'),
'views': path.join(appRoot, 'src/renderer/views')
},
extensions: ['.js', '.vue', '.json']
},
externals: {
electron: 'require("electron")',
fs: 'require("fs")',
path: 'require("path")',
'element-plus': '{}',
'@element-plus/icons-vue': '{}'
},
plugins: [
// 定义全局变量
new (require('webpack')).DefinePlugin({
'global': 'globalThis',
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development')
}),
// 提供全局变量
new (require('webpack')).ProvidePlugin({
global: 'globalThis',
process: 'process/browser'
})
],
node: {
global: true
},
// 强制禁用eval相关功能
optimization: {
minimize: false,
minimizer: [],
splitChunks: {
chunks: 'all',
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chunks: 'all',
}
}
}
},
// 禁用所有可能导致eval的webpack功能
experiments: {
topLevelAwait: false,
asyncWebAssembly: false
}
},
pages: {
index: {
entry: path.join(appRoot, 'src/renderer/main.js'),
template: path.join(appRoot, 'public/index.html'),
filename: 'index.html'
}
},
pluginOptions: {
electronBuilder: {
preload: path.join(appRoot, 'src/preload.js'),
mainProcessFile: path.join(appRoot, 'src/main/index.js'),
builderOptions: {
extraResources: [{
from: path.join(appRoot, 'dist/renderer'),
to: 'app',
filter: ["**/*"]
}]
}
}
},
devServer: {
hot: true, // 启用热重载
liveReload: true, // 启用实时重载
allowedHosts: "all",
static: {
directory: path.join(__dirname, 'dist/renderer'),
watch: true // 启用文件监听
},
compress: false,
proxy: null,
// 安全配置
headers: {
"Content-Security-Policy": "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; font-src 'self' data:; connect-src 'self' ws: wss:; object-src 'none'; frame-src 'none';"
},
// 增强日志配置 - 解决中文乱码
client: {
logging: 'info',
overlay: {
errors: true,
warnings: false
},
progress: true
},
// 详细日志 - 增强编码支持
logLevel: 'info',
stats: {
colors: true,
modules: false,
children: false,
chunks: false,
chunkModules: false,
entrypoints: false,
warnings: true,
errors: true,
errorDetails: true,
reasons: true,
timings: true,
builtAt: true,
version: true,
hash: true,
assets: true,
assetsSort: 'field',
chunksSort: 'field',
modulesSort: 'field'
},
// 编码设置
setupMiddlewares: (middlewares, devServer) => {
// 强制设置响应头编码
devServer.app.use((req, res, next) => {
res.setHeader('Content-Type', 'text/html; charset=utf-8')
next()
})
return middlewares
}
},
chainWebpack: config => {
// 强制禁用所有sourcemap,避免eval
config.devtool(false)
// 禁用所有可能导致eval的webpack功能
config.optimization.minimize(false)
// 静态资源处理
config.module
.rule('images')
.set('generator', {
filename: 'img/[name].[hash:8][ext]'
})
// 全局变量定义
config.plugin('define').tap(args => {
args[0]['global'] = 'globalThis'
args[0]['process.env.NODE_ENV'] = JSON.stringify(process.env.NODE_ENV || 'development')
args[0]['process.browser'] = true
args[0]['globalThis'] = 'globalThis'
args[0]['window.global'] = 'window'
args[0]['global["webpackChunkGoFaster"]'] = 'globalThis["webpackChunkGoFaster"]'
// 明确禁用eval
args[0]['__webpack_require__.e'] = 'undefined'
return args
})
// 添加全局polyfill
config.resolve.alias.set('global', 'globalThis')
// 确保所有模块都能访问全局变量
config.resolve.alias.set('process', 'process/browser')
// 添加webpack chunk名称处理
config.output.chunkFilename('[name].js')
config.output.globalObject('globalThis')
// 配置热重载插件
config.plugin('hot').use(require('webpack').HotModuleReplacementPlugin, [{
multiStep: false,
fullBuildTimeout: 200
}])
// 确保热重载正常工作
config.plugin('hmr').use(require('webpack').HotModuleReplacementPlugin)
// 增强日志配置
config.stats({
colors: true,
modules: false,
children: false,
chunks: false,
chunkModules: false,
entrypoints: false,
warnings: true,
warningsFilter: /export.*was not found in/,
errors: true,
errorDetails: true,
reasons: true,
usedExports: false,
providedExports: false,
optimizationBailout: false,
source: false,
publicPath: false,
timings: true,
builtAt: true,
version: true,
hash: true
})
// 添加进度条
config.plugin('progress').use(require('webpack/lib/ProgressPlugin'), [{
activeModules: false,
entries: true,
handler(percentage, message, ...args) {
if (percentage === 0) {
console.log('🚀 开始构建...')
} else if (percentage === 1) {
console.log('✅ 构建完成!')
} else if (percentage % 0.1 === 0) {
console.log(`📊 构建进度: ${Math.round(percentage * 100)}%`)
}
},
modules: false,
modulesCount: 5000,
profile: false,
dependencies: false,
dependenciesCount: 10000,
percentBy: null
}])
}
})