|
|
|
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
|
|
|
|
}])
|
|
|
|
}
|
|
|
|
})
|