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