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.
 
 
 
 
 
 

148 lines
4.0 KiB

const path = require('path')
const { defineConfig } = require('@vue/cli-service')
// 强制禁用所有eval相关功能
process.env.VUE_CLI_BABEL_TRANSPILE_MODULES = 'false'
process.env.VUE_CLI_MODERN_BUILD = 'false'
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")'
},
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: false,
liveReload: false,
allowedHosts: "all",
static: {
directory: path.join(__dirname, 'dist/renderer'),
watch: false
},
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';"
}
},
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')
// 禁用动态导入的eval
config.plugin('hot').use(require('webpack').HotModuleReplacementPlugin, [{
multiStep: false,
fullBuildTimeout: 200
}])
}
})