一篇关于vue-cli3打包优化的文章

在开发过程中vue项目打包是需要做一些性能优化的,这里写了关于我知道的要做的优化的部分,废话不多说直接上代码了,仅供参考 欢迎提出意见
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
const path = require('path')
// 开启Gzip需要的依赖 yarn add compression-webpack-plugin -D
const CompressionWebpackPlugin = require('compression-webpack-plugin')
function resolve(dir) {
    return path.join(__dirname, dir)
}
// 标记是否是生产环境
const isPruction = process.env.NODE_ENV === "production" 
const devNeedCdn = false // 标记本地是否需要cdn引入
// cdn配置
// CDN的本质上是将媒体资源,动静态图片(Flash),HTML,CSS,JS等等内容缓存到距离你更近的IDC,
// 从而让用户进行共享资源,实现缩减站点间的响应时间等等需求,而网游加速器的本质则是通过建立高带宽机房,
// 架设多节点服务器来为用户进行加速。我们可以将一些大体积的模块,让cdn帮我们提供相应的资源,
// 这样就可以缓解我们自己的服务器的压力,同时提供更快更好的资源响应

const cdn = {
    // 模块名称和作用域名(对应的是window里面的全局变量名)
    external: {
        vuex: 'Vuex',
        'vue-router': 'VueRouter'
    },
    //cdn的css链接
    css: [],
    //cdn的js连接 这里的资源地址请根据自己的连接
    js: [
        'https://cdn.staticfile.org/vuex/3.0.2/vuex.min.js', 
        'https://cdn.staticfile.org/vue-router/3.0.2/vue-router.min.js'
    ]
}
module.exports = {
    // devServer : {
    //     proxy: 'localhost:8080'
    // },
    productionSourceMap: false, // 上线后不生成map文件
    chainWebpack: (config) => {
        // 配置路径别名
        config.resolve.alias
        .set('@', resolve('src'))
        .set('components', resolve('src/components'))
        .set('assets', resolve('src/assets'))
        .set('api', resolve('src/api'))
        .set('views', resolve('src/views'))
        // 上线压缩图片 首先要安装 image-webpack-loader 命令 yarn add image-webpack-loader -D
        config.module.rule('images')
        .use('image-webpack-loader')
        .loader('image-webpack-loader')
        .options({bypassOnDebug:true})
        .end()

        // 注入cdn 
        config.plugin('html').tap(args => {
            // console.log(args)
            //  生产环境或本地需要cdn时,才注入cdn
            if(isPruction || devNeedCdn) {
                if (isPruction || devNeedCdn) {
                    args[0].cdn = cdn
                } 
            }
            return args
        })
    },

    configureWebpack: config => {
        // 用cdn方式引入,则构建时要忽略相关资源
        if (isPruction || devNeedCdn) {
            config.externals = cdn.externals
        } 
        if(isPruction) { // 判断是否是生产环境
            config.mode = "production";
            // 上线关闭console和debugger
            // 代码压缩
            config.optimization.minimizer = [
                new UglifyJsPlugin({
                    uglifyOptions: {
                        compress: {
                            warnings: false, // 如果打包产生错误 可注释掉这里
                            drop_console: true,
                            drop_debugger: true,
                            pure_funcs: ['console.log']
                        }
                    }
                })
            ]
            // 打包文件大小配置
            config["performance"] = {
                "maxEntrypointSize": 10000000, // 此选项根据入口起点的最大体积,控制 webpack 何时生成性能提示 单位是(bytes)
                "maxAssetSize": 3000000 // 此选项根据单个资源体积,控制 webpack 何时生成性能提示 单位是(bytes)
            }

            // gzip压缩
            const productionGzipExtensions = ['html', 'js', 'css']
            config.plugins.push({
                filename:'[path].gz[query]',
                algorithm: 'gzip',
                test: new RegExp( // 进行压缩的文件类型
                    '\\.(' + productionGzipExtensions.join('|') + ')$'
                ),
                threshold: 10240, // 定义只有大小大于该值的资源会被处理
                minRatio: 0.7, // 只有压缩率小于这个值的资源被处理
                deleteOriginalAssets: false // 删除原文件
            })

            // 公共代码抽离
            config.optimization.splitChunks = {
                cacheGroups: {
                    vendor: {
                        chunks: 'all',
                        test: /node_modules/,
                        name: 'vendor',
                        minChunks: 1,
                        maxInitialRequests: 5,
                        minSize: 0,
                        priority: 100
                    },
                    common: {
                        chunks: 'all',
                        test: /[\\/]src[\\/]js[\\/]/,
                        name: 'common',
                        minChunks: 2,
                        maxInitialRequests: 5,
                        minSize: 0,
                        priority: 60
                    },
                    styles: {
                        name: 'styles',
                        test: /\.(sa|sc|c)ss$/,
                        chunks: 'all',
                        enforce: true
                    },
                    runtimeChunk: {
                        name: 'manifest'
                    }
                }
            }
        } else {
            config.mode = 'development'
        }
    }
}
```

### cdn配置如果添加了那么html文件也要做相应的修改,这里是修改后的html文件
```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">
    <!-- 使用CDN的CSS文件 -->
    <% for (var i in htmlWebpackPlugin.options.cdn &&
    htmlWebpackPlugin.options.cdn.css) { %>
    <link
        href="<%= htmlWebpackPlugin.options.cdn.css[i] %>"
        rel="stylesheet"
    />
    <% } %>
    <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的JS文件 -->
     <% for (var i in htmlWebpackPlugin.options.cdn &&
     htmlWebpackPlugin.options.cdn.js) { %>
     <script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
     <% } %>
  </body>
</html>

```
  • 17
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: vue-cli2和vue-cli3有一些重要的区别: 1.配置文件: vue-cli2使用的是`config/index.js`文件来配置项目,而vue-cli3使用的是`.env`和`.env.xxx`文件来配置项目. 2.构建工具: vue-cli2使用的是webpack1,而vue-cli3使用的是webpack4. 3.项目结构: vue-cli2项目结构比较简单,而vue-cli3提供了更灵活的项目结构. 4.插件系统: vue-cli2使用的是全局插件,而vue-cli3使用的是局部插件. 5.使用方式: vue-cli2是全局安装,而vue-cli3是局部安装. ### 回答2: Vue-cli是一个vue.js的官方脚手架工具,它可以帮助我们更快地搭建一个基于Vue的项目。Vue-cli2和Vue-cli3是Vue-cli的不同版本,在一些方面存在一些显著的差异。 1. 项目结构: Vue-cli2生成的项目结构中,代码和配置信息都放在同一个文件夹中,每一个功能模块都需要手动创建;而Vue-cli3采用了新的配置方案,将项目的配置信息单独抽离出来,并且在工具创建项目时自动生成了更完整的项目结构,使项目结构更清晰和易于管理。 2. 配置方式: Vue-cli2是通过修改webpack.config.js文件来进行项目配置的,而Vue-cli3则是通过创建vue.config.js文件来进行项目配置的。在Vue-cli3中,我们可以直接在vue.config.js中添一些特定的配置,而无需修改webpack.config.js文件。这样做更方便,也更容易管理项目的开发和部署。 3. 优化: 在Vue-cli3中,作者对项目进行了一些自动优化的处理,例如:自动抽取第三方库等,以优化打包和运行速度。而Vue-cli2则需要手动配置优化选项。 总之,Vue-cli3相比Vue-cli2在工程化方面有了更多的改进和优化,我们将会更方便、快捷地构建一个基于Vue的项目。 ### 回答3: Vue是一个流行的JavaScript框架,它允许开发人员构建动态Web应用程序。而Vue CLI是Vue的脚手架工具,用于快速构建Vue项目。Vue CLI 2和Vue CLI 3是Vue CLI的不同版本,下面将介绍它们之间的不同: 1.项目结构:Vue CLI 2生成的项目结构是采用传统的单一的Webpack配置文件,而Vue CLI 3则是基于插件的灵活的配置,将Webpack配置拆分为多个小的配置文件。 2.依赖:Vue CLI 2使用的是Vue Router 2,而Vue CLI 3升级到了Vue Router 3,同时也使用了全新的Vuex。 3.插件化: Vue CLI 3采用了插件化的概念,每个插件都可以为开发者提供定制的Webpack配置和功能增强。 4.内置功能:Vue CLI 3集成了一些内置功能如:PWA支持、自动生成样式和文档等。 5.提高性能:Vue CLI 3对webpack的配置进行了深度优化,提供了更优秀的性能表现,同时还入了预编译,tree shaking 外置化了 `webpack`,对项目编译速度支持了更大的提升。 总的来说,Vue CLI 3采用了更先进的技术、更简单的配置结构、更多的内置功能和更好的性能。如果你计划开始一个新的Vue项目,强烈建议使用Vue CLI 3,以提高代码的开发效率和性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值