记录Vue打包

文章讲述了如何在Webpack配置中开启gzip压缩以减小文件体积,使用webpack-obfuscator和javascript-obfuscator进行代码混淆加密以增加安全性,但注意这会降低打包速度。同时,通过splitChunks进行代码分割以优化加载性能,特别是针对chunk-vendors进行处理。

一、开启gzip压缩

服务器那边已经开启了gzip压缩,考虑到服务器压力,本地也开一下

if (process.env.NODE_ENV === 'production') {
      // 有其他需要可以在这里添加
      const productionGzipExtensions = ['js', 'css', 'svg', 'ttf', 'otf', 'html']       return {
        plugins: [
          new BundleAnalyzerPlugin(), // 这个是打包分析
          new CompressionPlugin({
            algorithm: 'gzip', //'brotliCompress'
            test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'),
            threshold: 10240, //对超过10k的数据压缩
            minRatio: 0.8, // 只有压缩率小于这个值的资源才会被处理
            deleteOriginalAssets: false //不删除原文件
          }),
        ],
       }
}

二、代码混淆加密

用的是webpack-obfuscator+javascript-obfuscator,本地版本webpack-cli@4.8,所以对应的插件版本是webpack-obfuscator@2.6和javascript-obfuscator@4.0,同样写在plugins数组中。不过用了之后发现打包奇慢无比...

new JavaScriptObfuscator({
            rotateStringArray: true,
            // 压缩代码
            compact: true,
            // 代码自我保护,混淆后的代码,不能使用代码美化,同时需要配置 cpmpat:true;
            // 经多个不同环境测试,开启此项有可能报错:Maximum call stack size exceeded
            // 可禁用此项
            selfDefending: true,
            // 控制流平坦化,将一些逻辑处理块都统一加上一个前驱逻辑块,每个逻辑块都由前驱逻辑块进行条件判断和分发,构成一个个闭环逻辑,导致整个执行逻辑十分复杂难读。但会导致代码执行效率变慢,最多慢1.5倍。可以使用 controlFlowFlatteningThreshold 这个参数来控制比例,取值范围是 0 到 1,默认 0.75
            controlFlowFlattening: false,
            // 禁用控制台输出, 通过用空函数替换它们来禁用console
            disableConsoleOutput: true,
            // 调试保护,开启后开发者工具进去无限debug模式
            debugProtection: true,
            // 域名锁定,锁定混淆的源代码,使其仅在特定域和/或子域上运行,使用后发现会出问题,慎用
            domainLock: ['xxxx.com'],
            // 禁用map包,开启后会从map中找到源码,混淆就失去意义了
            sourceMap: false,
            // 字符串混淆,none或'base64'、'rc4'两种
            stringArrayEncoding: ['base64'],
            // 删除字符串文字并将它们放在一个特殊的数组中
            stringArray: true,
            // 变量名混淆,标识符的混淆方式 hexadecimal(十六进制) mangled(短标识符)
            identifierNamesGenerator: 'hexadecimal',
            // 对象键名替换,允许启用/禁用字符串转换为unicode转义序列。Unicode转义序列大大增加了代码大小,并且可以轻松地将字符串恢复为原始视图。建议仅对小型源代码启用此选项。
            transformObjectKeys: true,
            // 注入无意义代码并控制比例
            deadCodeInjection: false,
            deadCodeInjectionThreshold: 0.2,
          }, []), // 数组中写不需要混淆的文件名,如:app.js

打完包后是这样的!!!

chunk-vendors超巨大一个,估计加载是不过关的,再加个分割吧。

 三、代码分割

用了自带的splitChunks。和plugins平级写就行了

optimization: {
          splitChunks: {
            chunks: 'all',
            minSize: 30000,
            maxSize: 60000,
            cacheGroups: {
              vendors: {
                test: /[\\/]node_modules[\\/]/,
                priority: -10,
                name (module) {
                  const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1]
                  return `npm.${packageName.replace('@', '')}`
                }
              }
            }
          }
        }

再次打包就变成了这样

浩浩荡荡几十条,大多数都几k到几十k不等。到这里就完成了需要的功能,记录完毕。

### Vue 项目打包成 EXE 后出现空白页的原因分析 当 Vue 项目被打包成 EXE 文件后仍然遇到空白页问题,通常是因为资源文件的路径配置不正确或缺少必要的依赖项。具体来说: - **静态资源路径错误**:在构建过程中未正确设置 `publicPath` 参数可能导致应用无法找到所需的 CSS 和 JavaScript 资源[^1]。 - **HTML 模板解析失败**:如果 HTML 文件中的模板标签未能被正确替换,则会使得最终渲染出来的页面为空白。 - **路由模式冲突**:采用 History 模式的路由可能会因为服务器端缺乏对应的重定向机制而失效,在桌面环境中表现为找不到指定 URL 下的内容[^3]。 ### 解决方案 #### 修改公共基础路径 (Public Path) 对于 Electron 或其他类似的桌面应用程序开发框架而言,建议将项目的 `publicPath` 设置为相对路径 `'./'` 来确保所有静态资源都能相对于入口 HTML 文档加载成功[^4]。 ```javascript // vue.config.js 中配置 publicPath module.exports = { publicPath: './', }; ``` #### 更改路由模式至 Hash Mode 为了避免因缺失服务端支持而导致的历史记录 API 失效问题,推荐切换到哈希(Hash)模式来定义客户端侧导航逻辑。这样即使是在离线状态下也能保持正常的浏览体验[^2]。 ```javascript const router = new Router({ mode: 'hash', // 使用 hash 模式代替 history }); ``` #### 确认 Webpack 输出配置无误 检查 webpack 构建工具链的相关选项是否合理,特别是针对不同环境变量所作出的不同处理方式。例如,在生产环境下应确保 assets 相关参数指向正确的子目录位置。 ```javascript output: { path: path.resolve(__dirname, '../dist'), filename: '[name].js', chunkFilename: '[id].[chunkhash].js' } ``` #### 测试与调试 完成上述更改之后重新编译整个工程,并利用浏览器开发者工具仔细审查控制台日志以及网络请求列表,确认不存在任何 404 错误或其他异常状况后再尝试导出为独立执行程序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值