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

相关推荐
高山我梦口香糖21 分钟前
[react]searchParams转普通对象
开发语言·前端·javascript
m0_7482352424 分钟前
前端实现获取后端返回的文件流并下载
前端·状态模式
m0_748240251 小时前
前端如何检测用户登录状态是否过期
前端
black^sugar1 小时前
纯前端实现更新检测
开发语言·前端·javascript
寻找沙漠的人2 小时前
前端知识补充—CSS
前端·css
GISer_Jing2 小时前
2025前端面试热门题目——计算机网络篇
前端·计算机网络·面试
m0_748245522 小时前
吉利前端、AI面试
前端·面试·职场和发展
理想不理想v2 小时前
webpack最基础的配置
前端·webpack·node.js
pubuzhixing2 小时前
开源白板新方案:Plait 同时支持 Angular 和 React 啦!
前端·开源·github
2401_857600953 小时前
SSM 与 Vue 共筑电脑测评系统:精准洞察电脑世界
前端·javascript·vue.js