webpack4 target:“electron-renderer“ 打包加速配置

背景

昨天写得一篇Electron-vue asar 局部打包优化处理方案------绕开每次npm run build 超级慢的打包问题-CSDN博客文章浏览阅读754次,点赞19次,收藏11次。因为组员对于 Electron 打包过程存在比较迷糊的状态,且自己也没主动探索 Electron-vue 打包细节,导致每次打包过程都消耗 5-6 分钟的时间,在需要测试生产打包时,极其浪费时间,为此针对 Electron-vue 打包的几个环节进行拆解,来减少打包时间,提高开发效率。https://blog.csdn.net/wangsenling/article/details/142364579

打包超级慢的原因不是最终electron-builder环节的问题,而是webpack打包渲染进程的问题,今天经过与ChatGPT一起优化,终于把速度降了大概5倍左右,直接让文件打包速度快了很多。

具体配置

  1. 主要是多进程处理,这里追加了4个worker,自己的cpu核心有几个可以配置几个,这个主要加速点

  2. 去掉了原来的一个没有用的plugin

  3. 增加了缓存机制

    'use strict'

    process.env.BABEL_ENV = 'renderer'

    const path = require('path')
    const {dependencies} = require('../package.json')
    const webpack = require('webpack')

    const CopyWebpackPlugin = require('copy-webpack-plugin')
    const MiniCssExtractPlugin = require('mini-css-extract-plugin')
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    const {VueLoaderPlugin} = require('vue-loader')
    const TerserPlugin = require('terser-webpack-plugin');

    /**

    let rendererConfig = {
    // 添加以下一行,设置 mode
    mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',
    devtool: process.env.NODE_ENV === 'production' ? false : '#cheap-module-eval-source-map',
    entry: {
    renderer: path.join(__dirname, '../src/renderer/main.js'),
    },
    externals: [
    ...Object.keys(dependencies || {}).filter(
    (d) => !whiteListedModules.includes(d)
    ),
    ],
    module: {
    rules: [
    {
    test: /.scss/, use: ['vue-style-loader', 'css-loader', 'sass-loader'], }, { test: /\.sass/,
    use: ['vue-style-loader', 'css-loader', 'sass-loader?indentedSyntax'],
    },
    {
    test: /.less/, use: ['vue-style-loader', 'css-loader', 'less-loader'], }, { test: /\.css/,
    use: ['vue-style-loader', 'css-loader'],
    },
    {
    test: /.html/, use: 'vue-html-loader', }, { test: /\.js/,
    use: [
    {
    loader: 'thread-loader',
    options: {
    workers: 4, // 设置 worker 数量
    },
    }, {
    loader: 'babel-loader',
    options: {
    cacheDirectory: true
    }
    }
    ],
    exclude: /node_modules/,
    },
    {
    test: /.node/, use: 'node-loader', }, { test: /\.vue/,
    use: {
    loader: 'vue-loader',
    options: {
    extractCSS: process.env.NODE_ENV === 'production',
    loaders: {
    sass: 'vue-style-loader!css-loader!sass-loader?indentedSyntax=1',
    scss: 'vue-style-loader!css-loader!sass-loader',
    less: 'vue-style-loader!css-loader!less-loader',
    },
    },
    },
    },
    {
    test: /.(png|jpe?g|gif|svg)(?.)?/, use: { loader: 'url-loader', query: { limit: 10000, name: 'imgs/[name]--[folder].[ext]', }, }, }, { test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?/,
    loader: 'url-loader',
    options: {
    limit: 10000,
    name: 'media/[name]--[folder].[ext]',
    },
    },
    {
    test: /.(woff2?|eot|ttf|otf)(?.
    )?/, use: { loader: 'url-loader', query: { limit: 10000, name: 'fonts/[name]--[folder].[ext]', }, }, }, ], }, node: { __dirname: process.env.NODE_ENV !== 'production', __filename: process.env.NODE_ENV !== 'production', }, plugins: [ new VueLoaderPlugin(), new MiniCssExtractPlugin({filename: 'styles.css'}), new HtmlWebpackPlugin({ filename: 'index.html', template: path.resolve(__dirname, '../src/index.ejs'), templateParameters(compilation, assets, options) { return { compilation: compilation, webpack: compilation.getStats().toJson(), webpackConfig: compilation.options, htmlWebpackPlugin: { files: assets, options: options, }, process, } }, minify: { collapseWhitespace: true, removeAttributeQuotes: true, removeComments: true, }, nodeModules: process.env.NODE_ENV !== 'production' ? path.resolve(__dirname, '../node_modules') : false, }), new webpack.NoEmitOnErrorsPlugin(), ], output: { filename: '[name].js', chunkFilename: "cities/[name].js", libraryTarget: 'commonjs2', path: path.join(__dirname, '../dist/electron'), }, resolve: { alias: { '@': path.join(__dirname, '../src/renderer'), vue: 'vue/dist/vue.esm.js',
    },
    extensions: ['.js', '.vue', '.json', '.css', '.node'],
    },
    optimization: {
    minimize: true,
    minimizer: [
    new TerserPlugin({
    parallel: true, // 开启多线程压缩
    cache: true,
    terserOptions: {
    // 在这里添加 Terser 的配置选项
    compress: {
    drop_console: true, // 例如,移除 console.log
    },
    },
    }),
    ],
    },
    target: 'electron-renderer',
    }

    /**

    • Adjust rendererConfig for development settings
      */
      if (process.env.NODE_ENV !== 'production') {
      rendererConfig.plugins.push(
      new webpack.HotModuleReplacementPlugin(),
      new webpack.DefinePlugin({
      __static: "${path.join(__dirname, '../static').replace(/\\/g, '\\\\')}",
      })
      )
      }

    /**

    • Adjust rendererConfig for production settings
      */
      if (process.env.NODE_ENV === 'production') {
      rendererConfig.devtool = ''

      rendererConfig.plugins.push(
      new CopyWebpackPlugin([
      {
      from: path.join(__dirname, '../static'),
      to: path.join(__dirname, '../dist/electron/static'),
      ignore: ['.*'],
      },
      ]),
      new webpack.DefinePlugin({
      'process.env.NODE_ENV': '"production"',
      })
      )
      }

    module.exports = rendererConfig

相关推荐
musk121213 分钟前
electron 打包太大 试试 tauri , tauri 安装打包demo
前端·electron·tauri
翻滚吧键盘42 分钟前
js代码09
开发语言·javascript·ecmascript
万少1 小时前
第五款 HarmonyOS 上架作品 奇趣故事匣 来了
前端·harmonyos·客户端
OpenGL1 小时前
Android targetSdkVersion升级至35(Android15)相关问题
前端
rzl022 小时前
java web5(黑马)
java·开发语言·前端
Amy.Wang2 小时前
前端如何实现电子签名
前端·javascript·html5
海天胜景2 小时前
vue3 el-table 行筛选 设置为单选
javascript·vue.js·elementui
今天又在摸鱼2 小时前
Vue3-组件化-Vue核心思想之一
前端·javascript·vue.js
蓝婷儿2 小时前
每天一个前端小知识 Day 21 - 浏览器兼容性与 Polyfill 策略
前端
百锦再2 小时前
Vue中对象赋值问题:对象引用被保留,仅部分属性被覆盖
前端·javascript·vue.js·vue·web·reactive·ref