热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于前端:vuecli5-webpack5-vue26x-打包优化

vue-cli5版本曾经内置了webpack5,且很多配置都内置化了,换言之,根底打包无需在vue.config.js中配置了,大大简化了配置过程。因为次要是针对我的项目的优化,所

我的项目的版本是基于@vue/cli 5.0.4webpack@5.73.0

vue-cli5版本曾经内置了webpack5,且很多配置都内置化了,换言之,根底打包无需在vue.config.js中配置了,大大简化了配置过程。因为次要是针对我的项目的优化,所以创立的过程会简略,上面是优化的具体详情。

我的项目初始化

  • 装置 vue-cli

    npm install -g @vue/cli
  • 创立我的项目
    应用vue create xx创立我的项目,依据本人的我的项目自行抉择即可;初始化我的项目结束后,可看到我的项目的目录构造中曾经存在vue.config.js文件了。

    publicPath

    配置打包后的门路,须要留神的一点是当路由是history模式时,门路须要设置为绝对路径,即/而不是./。同时 nginx 须要配置try_files $uri $uri/ /index.html;

    module.exports = defineConfig({
    publicPath: process.env.NODE_ENV === 'production' ? '/' : '/',
    })

    outputDir

    配置打包文件的寄存目录。

    module.exports = defineConfig({
    outputDir: 'dist',
    })

    productionSourceMap

    是否在生产环境中应用 sourcemap,用于定位到谬误源码。(不倡议应用,会影响打包速度,且会让人看到本人的代码)

    module.exports = defineConfig({
    outputDir: 'dist',
    })

    devServer

    配置 api 以及跨域端口等设置。

    module.exports = defineConfig({
    devServer: {
      port: 8887,
      hot: true,
      compress: true, // 是否启动压缩 gzip
      proxy: {
        '/api': {
          target: 'http://www.galaxychips.com',
          changeOrigin: true,
          pathRewrite: {
            '^/api': ''
          }
        }
      }
    },
    })

    css 优化

    创立我的项目时曾经抉择了 sass,打包时会主动转化为根底 css,且文件会独立分离出来。所以这里我只引入了一个全局变量文件。

    module.exports = defineConfig({
    css: {
      loaderOptions: {
        scss: {
          additionalData: '@import "@/assets/scss/variables.scss";'
        }
      }
    },
    })

    js 优化

    生产环境下内置的插件曾经会解决压缩并用 babel 转化代码的操作。

    cdn 减速

    将专用库改为cdn引入形式,放慢访问速度,注入html的插件无需装置,曾经内置。externalscdn常量依据本人的我的项目而定。(文末会贴出代码)

    module.exports = defineConfig({
    chainWebpack: cOnfig=> {
      if (process.env.NODE_ENV === 'production') {
        config.externals(externals)
        // 通过 html-webpack-plugin 将 cdn 注入到 index.html 之中
        config.plugin('html')
          .tap(args => {
            args[0].cdn = cdn
            return args
          })
      }
    }
    })

    public/index.html 中须要写入注入代码。

    
      
      
      
      
    <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.css) { %>
      ">
    <% } %>
    
    
      
      <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %>
        
      <% } %>
    

    留神:我应用的 ui 框架是vuetify,应用 cdn 引入的话就不须要通过 import 引入款式,否则打包时会出错。

    代码宰割

    lru-cache是我的项目中的额定插件,提取为一个独自的 chunk。

    config
      .optimization.splitChunks({
        cacheGroups: {
          styles: {
            name: 'styles',
            test: /\.(s?css|less|sass)$/,
            chunks: 'all',
            priority: 10
          },
          common: {
            name: 'chunk-common',
            chunks: 'all',
            minChunks: 2, // 拆分前必须共享模块的最小 chunks 数。
            maxInitialRequests: 5, // 打包后的入口文件加载时,还能同时加载js文件的数量(包含入口文件)
            minSize: 0, // 生成 chunk 的最小体积(≈ 20kb)
            priority: 1, // 优化将优先思考具备更高 priority(优先级)的缓存组
            reuseExistingChunk: true // 如果以后 chunk 蕴含已从主 bundle 中拆分出的模块,则它将被重用,而不是生成新的模块
          },
          vendors: {
            name: 'chunk-vendors',
            test: /[\\/]node_modules[\\/]/,
            chunks: 'all',
            priority: 2,
            reuseExistingChunk: true
          },
          lrucache: {
            name: 'chunk-lrucache',
            test: /[\\/]node_modules[\\/]_?lru-cache(.*)/,
            chunks: 'all',
            priority: 3,
            reuseExistingChunk: true
          }
        }
      })

    gzip压缩

    运行npm install compression-webpack-plugin -D装置压缩插件。

    config.plugin('CompressionPlugin').use('compression-webpack-plugin', [{
      filename: '[path][base].gz',
      algorithm: 'gzip',
      test: /\.js$|\.css$|\.html$/,
      threshold: 10240, // 只解决比这个值大的资源。按字节计算
      minRatio: 0.8 // 只有压缩率比这个值小的资源才会被解决
    }])

    整个配置详情如下

    const { defineConfig } = require('@vue/cli-service')
    const path = require('path')
    
    // 门路解决办法
    function resolve (dir) {
    return path.join(__dirname, dir)
    }
    
    const externals = [
    {
      vue: 'Vue'
    },
    {
      'vue-router': 'VueRouter'
    },
    {
      axios: 'axios'
    },
    {
      vuetify: 'Vuetify'
    },
    {
      md5: 'MD5'
    },
    {
      qs: 'Qs'
    }
    ]
    const cdn = {
    css: [],
    js: [
      'https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.min.js',
      'https://cdn.jsdelivr.net/npm/vue-router@3.5.1/dist/vue-router.min.js',
      'https://cdn.jsdelivr.net/npm/axios@0.27.2/dist/axios.min.js',
      'https://cdn.jsdelivr.net/npm/vuetify@2.6.0/dist/vuetify.min.js',
      'https://cdn.jsdelivr.net/npm/md5@2.3.0/dist/md5.min.js',
      'https://cdn.jsdelivr.net/npm/qs@6.11.0/dist/qs.min.js'
    ]
    }
    
    module.exports = defineConfig({
    publicPath: process.env.NODE_ENV === 'production' ? '/' : '/',
    outputDir: 'dist',
    productionSourceMap: false,
    lintOnSave: process.env.NODE_ENV !== 'production',
    devServer: {
      port: 8887,
      hot: true,
      compress: true, // 是否启动压缩 gzip
      proxy: {
        '/api': {
          target: 'http://www.xxxx.com',
          changeOrigin: true,
          pathRewrite: {
            '^/api': ''
          }
        }
      }
    },
    css: {
      loaderOptions: {
        scss: {
          additionalData: '@import "@/assets/scss/variables.scss";'
        }
      }
    },
    configureWebpack: {
      resolve: {
        extensions: ['.vue', '.js', '.json', 'scss', 'css'],
        alias: {
          '@': resolve('src')
        },
        modules: [resolve('src'), 'node_modules']
      },
      module: {
      },
      plugins: [
      ]
    },
    chainWebpack: cOnfig=> {
      if (process.env.NODE_ENV === 'production') {
        config.externals(externals)
        // 通过 html-webpack-plugin 将 cdn 注入到 index.html 之中
        config.plugin('html')
          .tap(args => {
            args[0].cdn = cdn
            return args
          })
        config.plugin('CompressionPlugin').use('compression-webpack-plugin', [{
          filename: '[path][base].gz',
          algorithm: 'gzip',
          test: /\.js$|\.css$|\.html$/,
          threshold: 10240, // 只解决比这个值大的资源。按字节计算
          minRatio: 0.8 // 只有压缩率比这个值小的资源才会被解决
        }])
        config
          .optimization.splitChunks({
            cacheGroups: {
              styles: {
                name: 'styles',
                test: /\.(s?css|less|sass)$/,
                chunks: 'all',
                priority: 10
              },
              common: {
                name: 'chunk-common',
                chunks: 'all',
                minChunks: 2, // 拆分前必须共享模块的最小 chunks 数。
                maxInitialRequests: 5, // 打包后的入口文件加载时,还能同时加载js文件的数量(包含入口文件)
                minSize: 0, // 生成 chunk 的最小体积(≈ 20kb)
                priority: 1, // 优化将优先思考具备更高 priority(优先级)的缓存组
                reuseExistingChunk: true // 如果以后 chunk 蕴含已从主 bundle 中拆分出的模块,则它将被重用,而不是生成新的模块
              },
              vendors: {
                name: 'chunk-vendors',
                test: /[\\/]node_modules[\\/]/,
                chunks: 'all',
                priority: 2,
                reuseExistingChunk: true
              },
              lrucache: {
                name: 'chunk-lrucache',
                test: /[\\/]node_modules[\\/]_?lru-cache(.*)/,
                chunks: 'all',
                priority: 3,
                reuseExistingChunk: true
              }
            }
          })
      }
    }
    })

推荐阅读
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限
    小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ... [详细]
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • 数字图书馆近期展出了一批精选的Linux经典著作,这些书籍虽然部分较为陈旧,但依然具有重要的参考价值。如需转载相关内容,请务必注明来源:小文论坛(http://www.xiaowenbbs.com)。 ... [详细]
  • 本指南详细介绍了在Linux环境中高效连接MySQL数据库的方法。用户可以通过安装并使用`mysql`客户端工具来实现本地连接,具体命令为:`mysql -u 用户名 -p 密码 -h 主机`。例如,使用管理员账户连接本地MySQL服务器的命令为:`mysql -u root -p pass`。此外,还提供了多种配置优化建议,以确保连接过程更加稳定和高效。 ... [详细]
  • Vue应用预渲染技术详解与实践 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
  • 解析 /etc/pki/tls/certs/cabundle.crt 文件的主要功能与应用场景 ... [详细]
  • 在腾讯云服务器上部署Nginx的详细指南中,首先需要确保安装必要的依赖包。如果这些依赖包已安装,可直接跳过此步骤。具体命令包括 `yum -y install gcc gcc-c++ wget net-tools pcre-devel zlib-devel`。接下来,本文将详细介绍如何下载、编译和配置Nginx,以确保其在腾讯云服务器上顺利运行。此外,还将提供一些优化建议,帮助用户提升Nginx的性能和安全性。 ... [详细]
  • 在IIS上运行的WebApi应用程序在开发环境中能够正常进行文件的读写操作。然而,在尝试通过FTP访问实时服务器上的文件列表时,遇到了无法显示的问题,尽管服务器配置与开发环境相同。这可能涉及权限设置、FTP服务配置或网络连接等方面的问题。 ... [详细]
author-avatar
迪迪
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有