vue项目打包优化---vue-config.js的常用配置项

本文主要讲了vue-config.js的几个常用配置项,和打包优化npm的插件。
更详细的配置项用法请浏览官网:
Vue CLI 官网:https://cli.vuejs.org/zh/config/#pages
webpack官网:https://webpack.js.org/plugins/compression-webpack-plugin/#root

一、TerserWebpackPlugin

它是用来打包压缩混淆 ,打包的时候可以去除console,debugger的等。

在vue项目中怎么找到webpack的版本?
一般在package.json,没有的话就全局搜索一下。

webpack官网链接
在这里插入图片描述
用法说明

vue-config.js

const TerserPlugin = require("terser-webpack-plugin");

 // 用法压缩混淆
    plugins.push(new TerserPlugin({
        terserOptions: {
            output: {
                comments: false, // 去除注释
            },
            warnings: false, // 去除黄色警告,
            compress: {
                drop_console: true,
                drop_debugger: true, // 特定情况需要利用debugger防止调试
                pure_funcs: ['console.log'], // 移除console.log 避免console.error
            }
        }
    }))

二、transpileDependencies

vue-cli 官网地址
在这里插入图片描述
优点:transpileDependencies 为true 的时候可以把es6以上的语法改为es5,便于浏览器兼容,它也可以指定某个库,局部编译。
缺点:打包速度比较慢。

vue-config.js

module.exports = {

    ...defineConfig({
        transpileDependencies: true  // 它也可以这样写 ['element-ui'] 指定某个库在打包的时候需要编译
    }),
}

三、productionSourceMap

主要用于减少打包后的体积
在这里插入图片描述
vue-config.js

  productionSourceMap: false,

四、devServer

前端vue配置代理
在这里插入图片描述
vue-cli 5.0配置代理的方法如下,配置代理的时候一定要看清楚webpack的版本,不同的webpack版本写法有差异。

vue-config.js

module.exports = defineConfig({
  devServer: {
    port: 9000,
    server: 'https',
    client: {
      webSocketURL: 'auto://0.0.0.0:0/ws'
    },
    headers: {
      'Access-Control-Allow-Origin': '*'
    },
    proxy: {
      //第一种写法
      '/api': { //代理接口的名字
        target: {
          host: '111.XXX.XXX.XXX',
          protocol:'https:',  //可以代理https 或者http
          port: '9002'
        },
        ignorePath: false,
        changeOrigin: true,
        secure: false
      },
      //第二种写法
       '/baidu':{
        target:'http://baidu.com'
       }
  },

五、compression-webpack-plugin

gzip压缩

npm install compression-webpack-plugin --save-dev

vue-config.js

const CompressionWebpackPlugin = require('compression-webpack-plugin')
 // Gzip压缩大于10kb以上的js|json|css文件
    plugins.push(new CompressionWebpackPlugin({
        test:/\.(js|json|css)$/i,  // 图片一般不Gzip压缩 webpack-image-loader
        threshold:10240, // 只有在10kb以上才压缩
    }))

为何要使用gzip压缩?
打包的时候开启gzip可以很大程度减少包的大小,页面大小可以变为原来的30%甚至更小,非常适合于上线部署。更小的体积对于用户体验来说就意味着更快的加载速度以及更好的用户体验。

为什么gzip压缩后页面加载速度提升
浏览器向服务器发出请求,并且在请求头中声明可以使用gzip的编码格式,服务器接受到请求之后,读取压缩后的文件,服务器直接返回给浏览器gzip格式的文件,浏览器进行解压缩,这样以来就节省了服务器压缩的时间。

用法请参考其他原文链接:https://blog.csdn.net/duanhy_love/article/details/125069009

六、cdn加载vue的文件

配置cdn 加载网上的资源,减少本地资源的内存。
这些cdn的链接需要在官网自己找,至于需要加载版本,需要自己在node包查看原来引用的是哪个版本的js。

vue-config.js

//定义cdn的各种链接对象
let cdn = {
    build:{
        js:[
            "https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.min.js",
            "https://unpkg.com/vuex@3.6.2/dist/vuex.min.js",
            'https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js',
            'https://unpkg.com/vue-router@3.6.5/dist/vue-router.min.js',
        ]
    },
    dev:{
        js:[],
        css:[]
    }
}

//应用的时候
module.exports = {
    ...defineConfig({
        transpileDependencies: true
    }),
    productionSourceMap:false,
    configureWebpack: {
        devServer: {
            // open: true,
            // host: '127.0.0.1',
            proxy: {
                '/api': {
                    logLevel: 'debug',
                    // "@vue/cli-service": "~5.0.0",
                    logProvider:()=>console,
                    target: 'http://xxx.xxx.xx.xxx:8004/',
                }
            }
        },
        plugins,
        externals
    },
    // 再加工
    chainWebpack(config){
        // 去除html-webpack-plugin
        config.plugin('html').tap(args=>{
            // 只是处理一个html=>index.html
            if (isProduction) {
                args[0].myCdn = cdn.build;
            } else {
                args[0].myCdn = cdn.dev;
            }
            return args;
        })
    }
}

public文件下的index.html

<!DOCTYPE html>
<html lang="">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title><%= htmlWebpackPlugin.options.title %></title>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
    <!-- 下面这句是加载cdn的文件 -->
    <% for (var i in htmlWebpackPlugin.options.myCdn && htmlWebpackPlugin.options.myCdn.js) { %>
        <script src="<%= htmlWebpackPlugin.options.myCdn.js[i] %>"></script>
    <% } %>

  
  </body>
</html>

七、FileManagePlugin

此文件管理器插件允许您在webpack/rollup/wite构建前后删除、压缩/解压缩(.zip/.tar/.tar.gz)、移动、重命名、复制文件或目录
当打包的dist文件并不是你希望的位置,你想把移位到vue工程外的某个位置,此时可以用到FileManagePlugin。

npm install filemanager-webpack-plugin --save-dev

vue-config.js


const FileManagePlugin = require('filemanager-webpack-plugin')

module.exports = defineConfig({
  configureWebpack: {
    plugins: [
      new FileManagePlugin({
        events: {
          onEnd: {
          //复制某个文件
            delete: [
              {
                source: '../dist',
                options: {
                  force: true
                }
              }
            ],
            copy: [
              {
                source: './demoFile',
                destination: '../test/dist02',
                options: {
                  overwrite: true
                }
              }
            ],
            //可以移动某个文件
            // move: [
            //    { source: './dist/', destination: './test/dist02' }
           // ]

          }
        },
        runOnceInWatchMode: true
      })
    ]
  }
  
  })

八、vue-config.js 配置的demo

vue-config文件 开一个新的项目就配置一次,很容易忘记 ,做个demo记录一下。

const TerserPlugin = require("terser-webpack-plugin");
const CompressionWebpackPlugin = require('compression-webpack-plugin')
const isProduction = process.env.NODE_ENV === 'production'
const { defineConfig } = require('@vue/cli-service')
const version = require('./package.json').version;
const moment = require('moment');

let plugins = [];
let externals = {
    // 'import form的东西': 'CDN向外暴露的对象名'
};
let cdn = {
    build:{
        js:[
            "https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.min.js",
            "https://unpkg.com/vuex@3.6.2/dist/vuex.min.js",
            'https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js',
            'https://unpkg.com/vue-router@3.6.5/dist/vue-router.min.js',
        ]
    },
    dev:{
        js:[],
        css:[]
    }
}

// 是生产环境
if (isProduction) {

    // CDN优化 不处理,而是全局使用右边的名字遍历
    externals = {
        vue:'Vue',
        'vue-router':'VueRouter',
        axios:'axios',
        vuex:'Vuex'
    }

    // 压缩混淆
    plugins.push(new TerserPlugin({
        terserOptions: {
            output: {
                comments: false, // 去除注释
            },
            warnings: false, // 去除黄色警告,
            compress: {
                drop_console: true,
                drop_debugger: true, // 特定情况需要利用debugger防止调试
                pure_funcs: ['console.log'], // 移除console.log 避免console.error
            }
        }
    }))
    // Gzip压缩大于10kb以上的js|json|css文件
    plugins.push(new CompressionWebpackPlugin({
        test:/\.(js|json|css)$/i,  // 图片一般不Gzip压缩 webpack-image-loader
        threshold:10240, // 只有在10kb以上才压缩
    }))
}

// 添加版本信息及打包信息
process.env.VUE_APP_VERSION = 'demo version ' + version + ' build ' + moment().format('YYYY-MM-DD HH:mm:ss');

module.exports = defineConfig({
  publicPath: process.env.NODE_ENV === 'production'
    ? './'
    : '/',
  transpileDependencies: true,
  lintOnSave: false,
  outputDir: 'dist',
  productionSourceMap: !isProduction,
  configureWebpack:{
     plugins,
     externals
  },
  devServer: {
    port: 9002,
    server: 'https',
    client: {
      webSocketURL: 'auto://0.0.0.0:0/ws'
    },
    headers: {
      'Access-Control-Allow-Origin': '*'
    },
    proxy: {
    //配置多个代理 不止一个后台的时候 可以配置多个代理
  
      [`/${process.env.VUE_APP_BASE_PROXY}`]: { //代理1
        target: {
          host: process.env.VUE_APP_BASE_HOST,
          protocol: 'https',
          port: process.env.VUE_APP_BASE_PORT
        },
        ignorePath: false,
        changeOrigin: true,
        secure: false
      },
      [`/${process.env.VUE_APP_HALL_PROXY}`]: {  //代理2
        target: {
          host: process.env.VUE_APP_BASE_HOST,
          protocol:'https',
          port: process.env.VUE_APP_BASE_PORT
        },
        ignorePath: false,
        changeOrigin: true,
        secure: false
      }
    }
  },
            // 再加工
    chainWebpack(config){
        // 去除html-webpack-plugin
        config.plugin('html').tap(args=>{
            // 只是处理一个html=>index.html
            if (isProduction) {
                args[0].myCdn = cdn.build;
            } else {
                args[0].myCdn = cdn.dev;
            }
            return args;
        })
    }

})

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: vue-cli5中的vue.config.js是用来配置Vue项目配置文件。它可以用来配置webpack的一些选项,如入口文件、输出文件、模块解析、插件等等。在vue.config.js中,我们可以设置一些常用配置项,如publicPath、outputDir、devServer等等,来满足我们的需求。同时,我们也可以通过vue.config.js配置一些自定义的loader和plugin,来满足我们的特殊需求。总之,vue.config.js是一个非常重要的配置文件,它可以帮助我们更好地定制化我们的Vue项目。 ### 回答2: Vue CLI5 为我们提供了一种简单易用的方式来配置我们的Vue.js应用程序。Vue.js是一款非常受欢迎的JavaScript框架,Vue CLI5帮助我们快速构建Vue.js应用程序并提供了一个灵活的配置系统,其中包括一个名为vue.config.js配置文件。 vue.config.js是一个可选的配置文件,它允许我们自定义Vue应用程序的行为。在该文件中,我们可以定义不同的选项来控制构建和开发过程的不同方面,如Webpack配置、启用CSS预处理器、配置代理服务器,以及添加或修改Webpack的loader和插件。 下面是一些常见的选项可以在vue.config.js中进行配置: - publicPath: 配置公共路径,用于指定应用程序在生产环境下的根路径。 - outputDir: 配置输出目录,用于指定生成的应用程序的输出目录。 - assetsDir: 配置静态资源目录,用于指定放置生成的静态资源的目录相对于outputDir的路径。 - configureWebpack: 配置Webpack对象,用于覆盖默认的Webpack配置。 - chainWebpack: 配置Webpack链,用于在默认Webpack配置下修改Webpack选项。 - devServer: 配置开发服务器对象,用于启用开发服务器并代理API请求到API服务器。 - css: 配置CSS选项,例如启用CSS预处理器,设置CSS loader选项。 下面是一个简单的vue.config.js示例: ```javascript module.exports = { publicPath: '/my-app/', outputDir: 'dist', assetsDir: 'static', configureWebpack: { plugins: [ new MyPlugin() ] }, devServer: { proxy: { '/api': { target: 'http://localhost:3000', ws: true, changeOrigin: true } } }, css: { loaderOptions: { css: { // options here } } } } ``` 这是Vue CLI5应用程序的默认配置,通过在vue.config.js中添加自定义选项,我们可以在不触碰默认选项的情况下扩展和定制应用程序的功能。 总之,Vue CLI5帮助我们加速Vue.js应用程序的开发,并提供了一个非常有用的配置文件vue.config.js,让我们可以轻松地自定义和定制Vue应用程序的各个方面。 ### 回答3: vue.config.jsVue配置文件,可以用于配置Webpack、Babel、ESLint、反向代理等。vue-cli5(Vue CLI的5.x版本)是Vue CLI的下一代版本,为Vue项目的创建和调试提供了更加便利的方法。 下面介绍如何使用vue.config.js进行Vue项目配置。 1.创建vue.config.js文件 在项目的根目录中创建vue.config.js文件,并按照以下格式进行基本配置: ``` module.exports = { // 基本路径 publicPath: process.env.NODE_ENV === 'production' ? '/production-sub-path/' : '/', // 输出路径 outputDir: 'dist', // 配置devServer devServer: { port: 8888, // 端口号 proxy: { '/api': { target: 'http://api.example.com', changeOrigin: true, pathRewrite: { '^/api': '' } } } } } ``` 2.配置Webpack 可以使用chainWebpack或configureWebpack来配置Webpack。chainWebpack可以修改Webpack的配置,而configureWebpack可以覆盖Webpack的配置。 ``` module.exports = { chainWebpack: config => { // 移除prefetch插件 config.plugins.delete('prefetch') }, configureWebpack: { // 修改输出文件名 output: { filename: '[name].[hash:8].js', chunkFilename: '[name].[hash:8].js' } } } ``` 3.配置Babel 通过babel配置可以添加新的babel插件和babel预设。 ``` module.exports = { transpileDependencies: [ 'vuetify' ], babel: { plugins: ['@babel/plugin-proposal-optional-chaining'], presets: [ '@babel/preset-env' ] } } ``` 4.配置ESLint 可以使用lintOnSave配置项来开启/关闭ESLint。也可以修改ESLint的规则。 ``` module.exports = { lintOnSave: process.env.NODE_ENV !== 'production', rules: { 'vue/no-unused-components': 'off' } } ``` 5.反向代理 可以使用devServer.proxy来配置反向代理,解决前端接口跨域的问题。 ``` module.exports = { devServer: { proxy: { '/api': { target: 'http://api.example.com', changeOrigin: true, pathRewrite: { '^/api': '' } } } } } ``` 以上是关于vue-cli5配置vue.config.js的介绍。Vue CLI是Vue项目开发的重要工具,其强大的开发环境能够大幅度提高开发效率。透过配置vue.config.js,我们可以更好地调整Vue项目配置以满足项目需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值