首页 > 其他分享 >vue 文件打包太大 -- 体积优化

vue 文件打包太大 -- 体积优化

时间:2022-10-19 11:11:07浏览次数:63  
标签:vue plugin -- js webpack loader config 打包

最新打包vue cli 4.5 项目时,体积尽然达到了9M,页面访问的速度,因此进行尝试进行优化,最终压缩到 968k ,效果明显。下面是优化方法。

首先新建文件'vue.config.js',放在项目根目录下,与package.json在同一级目录下

1.BundleAnalyzer 

作用:展示打包图形化信息,会打开一个html页面,帮助自己分析哪些文件过大,可针对其进行优化,上线前 注释掉

 安装 webpack-bundle-analyzer 插件 

1 npm install webpack-bundle-analyzer --save-dev

 在 vue.config.js: 里面:

1 2 3 4 5 6 7 8 9 // 引入 const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;   // 展示图形化信息 chainWebpack: config => {   config       .plugin('webpack-bundle-analyzer')       .use(BundleAnalyzerPlugin) }

2.抽离 css 支持按需加载

安装 mini-css-extract-plugin 插件

1 npm install mini-css-extract-plugin -D

在 vue.config.js里面:

复制代码 复制代码
chainWebpack: config => {
  let miniCssExtractPlugin = new MiniCssExtractPlugin({
    filename: 'assets/[name].[hash:8].css',
    chunkFilename: 'assets/[name].[hash:8].css'
  })
  config.plugin('extract-css').use(miniCssExtractPlugin)
}
复制代码 复制代码

 

 3.图片按需加载

安装image-webpack-loader插件

npm install image-webpack-loader -D 

在 vue.config.js里面:  

复制代码 复制代码
config.module.rule('images')
    .test(/\.(png|jpe?g|gif|webp)(\?.*)?$/)
    .use('image-webpack-loader')
    .loader('image-webpack-loader')
    .options({
      bypassOnDebug: true
    })
    .end()
复制代码 复制代码

图片压缩可以在:https://tinypng.com/ 进行批量压缩

4.gzip压缩代码 

安装 compression-webpack-plugin 插件 

 npm install compression-webpack-plugin -D

在 vue.config.js里面: 

复制代码 复制代码
const CompressionWebpackPlugin = require('compression-webpack-plugin');

// 开启gzip压缩
  config.plugins.push(
    new CompressionWebpackPlugin(
      {
        filename: info => {
          return `${info.path}.gz${info.query}`
        },
        algorithm: 'gzip',
        threshold: 10240, // 只有大小大于该值的资源会被处理 10240
        test: new RegExp('\\.(' + ['js'].join('|') + ')$'
        ),
        minRatio: 0.8, // 只有压缩率小于这个值的资源才会被处理
        deleteOriginalAssets: false // 删除原文件
      }
    )
  )
复制代码 复制代码

5.element-ui 按需加载

安装 babel-plugin-component 插件

npm install babel-plugin-component --save-dev

在 babel.config.js里面:

复制代码 复制代码
module.exports = {
  presets: [
    '@vue/app'
  ],
  plugins: [
    [
      "component",
      {
        libraryName: "element-ui",
        styleLibraryName: "theme-chalk"
      }
    ]
  ]
}
复制代码 复制代码

6.Echarts 按需加载

安装 babel-plugin-equire 插件:

npm install babel-plugin-equire -D

创建 echarts.js

复制代码 复制代码
// eslint-disable-next-line
  const echarts = equire([
    // 写上你需要的 echarts api
    "tooltip",
    "line"
  ]);

  export default echarts;
复制代码 复制代码

 在 babel.config.js里面:

复制代码 复制代码
module.exports = {
  presets: [
    '@vue/app'
  ],
  plugins: [
    [
      "component",
      {
        libraryName: "element-ui",
        styleLibraryName: "theme-chalk"
      }
    ],
    "equire"
  ]
}
复制代码 复制代码

具体页面应用:

 // 直接引用
 import echarts from '@/lib/util/echarts.js' 
 
 this.myChart = echarts.init(this.$refs.chart) 

 7.lodash 按需加载

安装 lodash-webpack-plugin 插件

npm install lodash-webpack-plugin --save-dev

 在 babel.config.js里面:

复制代码 复制代码
module.exports = {
  presets: [
    '@vue/app'
  ],
  plugins: [
    [
      "component",
      {
        libraryName: "element-ui",
        styleLibraryName: "theme-chalk"
      }
    ],
    "lodash",
    "equire"
  ]
}
复制代码 复制代码

 在 vue.config.js里面:

复制代码 复制代码
const LodashModuleReplacementPlugin = require("lodash-webpack-plugin");

chainWebpack: config => {
    config
    .plugin("loadshReplace")
    .use(new LodashModuleReplacementPlugin());
}
复制代码 复制代码

8.prefetch 和 preload

删除无用的插件,避免加载多余的资源(如果不删除的话,则会在 index.html 里面加载 无用的 js 文件)

复制代码
chainWebpack: config => {
    // 移除prefetch插件,避免加载多余的资源
    config.plugins.delete('prefetch')
    / 移除 preload 插件,避免加载多余的资源
    config.plugins.delete('preload');
}
复制代码

 

vue.config.js文件中完整代码

复制代码 复制代码
onst MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CompressionWebpackPlugin = require('compression-webpack-plugin');
const LodashModuleReplacementPlugin = require("lodash-webpack-plugin");

module.exports = {
  productionSourceMap: false, // 关闭生产环境的 source map
  lintOnSave: false,
  publicPath: process.env.VUE_APP_PUBLIC_PATH,
  devServer: {
    host: "localhost",
    port: 3002,
    proxy: {
      '/api': {
        target: "https://tapi.quanziapp.com/api/",
        ws: true,
        changeOrigin: true,
        pathRewrite: {
          '^/api': ''
        }
      },
    }
  },

  chainWebpack: config => {

    // 移除 prefetch 插件
    config.plugins.delete('prefetch');
    // 移除 preload 插件,避免加载多余的资源
    config.plugins.delete('preload');
 
    config.optimization.minimize(true);

    config.optimization.splitChunks({
      chunks: 'all'
    })

    config
      .plugin('webpack-bundle-analyzer')
      .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin)

    if (process.env.NODE_ENV !== 'development') {

      let miniCssExtractPlugin = new MiniCssExtractPlugin({
        filename: 'assets/[name].[hash:8].css',
        chunkFilename: 'assets/[name].[hash:8].css'
      })
      config.plugin('extract-css').use(miniCssExtractPlugin)
      config.plugin("loadshReplace").use(new LodashModuleReplacementPlugin());

      config.module.rule('images')
        .test(/\.(png|jpe?g|gif|webp)(\?.*)?$/)
        .use('image-webpack-loader')
        .loader('image-webpack-loader')
        .options({
          bypassOnDebug: true
        })
        .end()
        .use('url-loader')
        .loader('file-loader')
        .options({
          name: 'assets/[name].[hash:8].[ext]'
        }).end()
      config.module.rule('svg')
        .test(/\.(svg)(\?.*)?$/)
        .use('file-loader')
        .loader('file-loader')
        .options({
          name: 'assets/[name].[hash:8].[ext]'
        })
    }
  },
  configureWebpack: config => {
    // config.plugins.push(["equire"]);

    if (process.env.NODE_ENV !== 'development') {
      config.output.filename = 'assets/[name].[hash:8].js'
      config.output.chunkFilename = 'assets/[name].[hash:8].js'
    }
    // 公共代码抽离
    config.optimization = {
      // 分割代码块
      splitChunks: {
        cacheGroups: {
          //公用模块抽离
          common: {
            chunks: 'initial',
            minSize: 0, //大于0个字节
            minChunks: 2, //抽离公共代码时,这个代码块最小被引用的次数
          },
          //第三方库抽离
          vendor: {
            priority: 1, //权重
            test: /node_modules/,
            chunks: 'initial',
            minSize: 0, //大于0个字节
            minChunks: 2, //在分割之前,这个代码块最小应该被引用的次数
          },
        },
      }
    }
    // 开启gzip压缩
    config.plugins.push(
      new CompressionWebpackPlugin(
        {
          filename: info => {
            return `${info.path}.gz${info.query}`
          },
          algorithm: 'gzip',
          threshold: 10240, // 只有大小大于该值的资源会被处理 10240
          test: new RegExp('\\.(' + ['js'].join('|') + ')$'
          ),
          minRatio: 0.8, // 只有压缩率小于这个值的资源才会被处理
          deleteOriginalAssets: false // 删除原文件
        }
      )
    )
  },
  css: {
    extract: true,
    sourceMap: false,
    loaderOptions: {
      sass: {
      },
    },
  },
}
复制代码 复制代码  

标签:vue,plugin,--,js,webpack,loader,config,打包
From: https://www.cnblogs.com/amujoe/p/16805526.html

相关文章

  • Windows下安装和运行Elasticsearch
      安装Elasticsearch之前,你需要先安装一个较新的版本的Java,最好的选择是,你可以从 www.java.com 获得官方提供的最新版本的Java。  点击查看:​​JavaJDK下载......
  • 【C语言知识碎片】字符串函数
    1.strlenize_tstrlen(constchar*str);字符串已经'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不含'\0')。注意如果字符串结尾没有\0s......
  • wangEditor集成Word导入
    由于工作需要必须将word文档内容粘贴到编辑器中使用但发现word中的图片粘贴后变成了file:///xxxx.jpg这种内容,如果上传到服务器后其他人也访问不了,网上找了很多编辑器发现没......
  • GNN 系列(三):GraphSAGE
    【引言】在GCN的博文中我们重点讨论了图神经网络的逐层传播公式是如何推导的,然而,GCN的训练方式需要将邻接矩阵和特征矩阵一起放到内存或者显存里,在大规模图数据上是不可取的......
  • 在FinClip中如何使用小程序插件?
    最近总发现很多萌新把小程序插件和小程序组件搞混淆。简单来说,组件和插件的区别在于,插件是可以直接提供服务的,组件是给开发者的轮子提高开发效率的,这是两回事。小程序插件是......
  • A page must have one and only one ‘@Entry‘ decorator with a struct.【BUG已解决
    项目场景:在学习基于OpenHarmony/HarmonyOS操作系统的ArkUI框架的过程中,使用DevEcoStudio3.0.0.993打开一个小的Demo的过程中。打开Previewer的时候爆出如下错误:mpile......
  • JavaWeb对于C3P0链接池的CURD实例原理详解
    一.java对于C3P0链接池的详解1.1C3P0是什么?c3p0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。1.2C3P0工作原理开源JDBC连接池......
  • 【转行测试开发-redis】(五)---使用redis的数据类型列表list
    昨天讲了使用java里maven配置redis来连接redis数据库,操作并获取数据库中的值.今天我们来说下另一个常用的数据类型---列表list  Redis列表是简单的字符串列表,按照插入顺......
  • 基于OpenHarmony/HarmonyOS操作系统的ArkUI框架深入学习——开篇1
    一.基于OpenHarmony/HarmonyOS操作系统的ArkUI框架——Harmony原生开发开发需要的IDE:HUAWEIDevEcoStudio1.1什么是ArkUI框架?ArkUI是一套构建分布式应用界面的声明......
  • PHP 文件写入和读取(必看篇)
    文章提纲:一.实现文件读取和写入的基本思路二.使用fopen方法打开文件三.文件读取和文件写入操作四.使用fclose方法关闭文件五.文件指针的移动六.Windows和UNIX下的回车和换行一.实现......