前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Vue打包优化

Vue打包优化

作者头像
码客说
发布于 2023-04-27 07:16:49
发布于 2023-04-27 07:16:49
1.1K00
代码可运行
举报
文章被收录于专栏:码客码客
运行总次数:0
代码可运行

前言

Vue项目打包后JS文件特别大?

怎么解决呢?

http1.1下面分割的chunk也不宜太多,因为在同一个域下面的资源并发下载的资源数量是有限的,比如chrome大约是6个资源同时下载,这6个资源中必须要有某个资源下载完毕后才会下载其他资源,但也不一定非要少于6个,因为某些资源可能直接读取内存,某些资源可以通过cdn从别的域中读取。

实现方式

不生成SourceMap

VueCli

在 vue.config.js 中配置

production环境不生成SourceMap

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module.exports = {
  lintOnSave: false,
  productionSourceMap: process.env.NODE_ENV !== "production", //打包不生成map文件
}

WebPack

在 webpack 配置中配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module.exports = {
  devtool: 'none'  // 或者 false
}

externals

externals 配置选项提供了「从输出的 bundle 中排除依赖」的方法。

1、引入链接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>标题</title>
</head>

<body>
  <div id="app"></div>
</body>

<script src="/librarys/vue@2.6.11/vue.min.js"></script>  
<script src="/librarys/vue-router@3.2.0/vue-router.min.js"></script>
<script src="/librarys/vuex@3.2.0/vuex.min.js"></script>
<script src="/librarys/axios@0.21.1/axios.min.js"></script>
<style>
  body{
    margin: 0;
    padding: 0;
  }
</style>
</html>

2、配置 externals

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module.exports = {
  //...
   externals: {
    "vue": "Vue",
    "vue-router": "VueRouter",
    "vuex": "Vuex",
    "axios": "axios",
  },
};

其中引用更推荐CDN引用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html>
  <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></title>
    <!-- 引入 cdn 地址 -->
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.5.10/vue.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue-router/3.0.1/vue-router.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.18.0/axios.min.js"></script>
  </head>
  <body>
    <div id="app"></div>
  </body>
</html>

路由动态引用

异步引入的块,也就是import('')方式引入的资源,包括异步模块,路由加载等,会生成单独的chunk。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const routes = [
  {
    path: '/page1',
    component: () => import('@/views/Page1.vue')
  },
  {
    path: '/page2',
    component: () => import('@/views/Page2.vue')
  }
]

这会使 Page1.vue 和 Page2.vue 分别打包到单独的 chunk 中,访问对应路由时按需加载。

设置生成文件名称

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    path: "/login",
    name: "Login",
    component: () =>
    import(/* webpackChunkName: "login" */ "../views/Login.vue"),
},

实际会生成login.1681894249346.js文件。

图片

VueCli

在 Vue 项目中,可以通过 vue.config.js 中的 chainWebpack 配置来设置图片转 Base64 的大小限制。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module.exports = {
  chainWebpack: config => {
    config.module
      .rule('images')
      .use('url-loader')
      .loader('url-loader')
      .tap(options => Object.assign(options, {
        limit: 10000  // 小于10k的图片转为base64格式
      }))
  }
}

这里使用 url-loader,将小于 10000 字节(约 10kb)的图片转为 base64 格式,超过的图片仍使用 file-loader 进行 copy 和 url-replace。

WebPack

安装url-loader

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm i url-loader@4.1.1 file-loader@6.2.0 -D

在webpack.config.js中添加处理url路径的loader模块:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{test: /\.(jpg|png|gif|bmp|jpeg)$/, use: 'url-loader?esModule=false&limit=500&name=imgs/[hash:8]-[name].[ext]'},

上面这种输入参数的方式还有另一种方式,以对象的键值对方式,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  test: /\.(jpg|png|gif|bmp|jpeg|jfif)$/,
  use: [{
    loader: 'url-loader',
    options: {
      esModule: false,
      limit: 500,   //是把小于500B的文件打成Base64的格式,写入JS
      name: 'imgs/[hash:8]-[name].[ext]' // [hash:8] 在名称前面设置8位哈希值,[name] 设置文件的原名, [ext] 设置文件的原后缀
    }
  }]
},// 处理 图片路径的 loader

对比

file-loader 可以指定要复制和放置资源文件的位置,以及如何使用版本哈希命名以获得更好的缓存。此外,这意味着 你可以就近管理图片文件,可以使用相对路径而不用担心部署时 URL 的问题。使用正确的配置,webpack 将会在打包输出中自动重写文件路径为正确的 URL。 url-loader 允许你有条件地将文件转换为内联的 base-64 URL (当文件小于给定的阈值),这会减少小文件的 HTTP 请求数。如果文件大于该阈值,会自动的交给 file-loader 处理。

Tree Shaking

使用 Tree Shaking:这可以移除未使用的代码,减小 bundle 大小。

Tree Shaking是指在打包时,只将使用的代码打包进最终的输出文件,未使用的代码被自动剔除,从而减小输出文件的大小。

VueCli

Vue CLI的Tree Shaking功能默认是开启的,不需要额外的配置。

WebPack

Webpack中Tree Shaking主要有以下配置:

  1. 设置mode为production,因为Tree Shaking只在生产环境下起作用。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module.exports = {
  mode: 'production',
  // other configurations
}
  1. 在optimization配置中设置usedExports为true。此选项告诉Webpack检测哪些导入导出被使用,在生成的代码中只包含被使用的代码,从而减少生成的代码体积。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const webpack = require('webpack');

module.exports = {
  // ...other configurations
  optimization: {
    usedExports: true
  }
};
  1. 如果你使用的是ES6的模块语法,确保在package.json中设置了sideEffects属性。这可以帮助Webpack确定哪些模块没有副作用,可以进行Tree Shaking。 副作用是指模块执行时会导致除了导入导出之外的行为,比如在模块中修改全局变量、执行HTTP请求等。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "name": "example-project",
  "version": "1.0.0",
  "description": "Example project for demonstrating Tree Shaking in Webpack",
  "main": "src/index.js",
  "sideEffects": false // 或者设置为数组指定哪些模块有副作用
}
  1. 使用UglifyJS插件或Terser插件等压缩插件进行代码压缩,减少生成的代码体积。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const UglifyJSPlugin = require('uglifyjs-webpack-plugin');

module.exports = {
  // ...other configurations
  optimization: {
    minimizer: [new UglifyJSPlugin()]
  }
};

当你完成以上配置后,Webpack会自动启用Tree Shaking功能,对未使用的代码进行消除,从而减少生成的文件体积。

查看VueCli生成的Webpack配置

查看vue-cli中配置项最终生成的webpack配置 在package.json中添加

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"scripts": {
    "inspect": "vue inspect > webpack.inspect.json",
}

执行一下 npm run inspect 那么就可以生成一个webpack.inspect.json的文件

设置生成文件的名称

VueCli

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const Timestamp = new Date().getTime();
module.exports = {
  productionSourceMap: process.env.NODE_ENV !== "production",
  configureWebpack: {
    output: {
      // 输出重构  打包编译后的 文件名称  【模块名称.版本号.时间戳】
      filename: `js/[name].${Timestamp}.js`,
      chunkFilename: `js/[name].${Timestamp}.js`,
    },
  },
};

依赖大小分析

VueCli

在 Vue CLI 项目中,可以很方便地使用这个工具。具体步骤如下:

  1. 安装依赖
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install webpack-bundle-analyzer -D
  1. 在 vue.config.js 中配置插件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin

module.exports = {
  chainWebpack: config => {
    config.plugin('webpack-bundle-analyzer')
      .use(BundleAnalyzerPlugin)
  }
}
  1. 运行打包分析
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm run build --report

构建完成后,会自动打开浏览器端口(默认8888),展示 bundle 分析报告。

WebPack

借助插件webpack-bundle-analyzer我们可以直观的看到打包结果中,文件的体积大小、各模块依赖关系、文件是够重复等问题,极大的方便我们在进行项目优化的时候,进行问题诊断。

1、安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm i -D webpack-bundle-analyzer

2、配置插件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 引入插件
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin

module.exports = {
  // ...
  plugins:[ 
    // ...
    // 配置插件 
    new BundleAnalyzerPlugin({
    })
  ],
};

3、修改启动命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"scripts": {
   "analyzer": "cross-env NODE_ENV=prod webpack --progress --mode production"
},

4、执行编译命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm run analyzer

打包结束后,会自行启动地址为 http://127.0.0.1:8888 的 web 服务

如果,我们只想保留数据不想启动 web 服务,这个时候,我们可以加上两个配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new BundleAnalyzerPlugin({
   analyzerMode: 'disabled',  // 不启动展示打包报告的http服务器
   generateStatsFile: true, // 是否生成stats.json文件
})

这样再次执行打包的时候就只会产生 state.json 的文件了

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
前端性能优化——包体积压缩82%、打包速度提升65%
压缩项目打包后的体积大小、提升打包速度,是前端性能优化中非常重要的环节,笔者结合工作中的实践总结,梳理出一些 常规且有效 的性能优化建议
@超人
2023/05/12
3K0
前端性能优化——包体积压缩82%、打包速度提升65%
vue.config.js打包优化(有效)「建议收藏」
//百度上的资料五花八门让人眼花缭乱,别急,这时候我替你亲身经历了,有需要的可以参考下,先上效果图,以免你们以为我吹牛逼,嘻嘻
全栈程序员站长
2022/07/01
1.9K0
vue.config.js打包优化(有效)「建议收藏」
Webpack Bundle Analyzer:深入分析与优化你的包
Webpack Bundle Analyzer是一个用于可视化的工具,它可以帮助你分析Webpack打包后的输出文件,查看哪些模块占用了最多的空间,从而进行优化。
天涯学馆
2024/08/19
6220
​(非软文)Webpack从入门到实战搭建Vue脚手架(一万字总结)
安装依赖包 (-D 将依赖记录成开发依赖, 只是开发中需要用的依赖, 实际上线不需要的)
Vam的金豆之路
2021/12/01
1.3K0
webpack构建优化:bundle体积从3M到400k之路
在CQM平台开发时,把demo网站给同事体验,都纷纷反馈第一次打开页面的时候需要等待很久,页面一直在转菊花。作为一个为韩国头部厂商提供优质服务的网站,接到这种反馈,这不是啪啪打脸吗。
RubyLiao廖彩明
2018/12/06
4.1K0
webpack构建优化:bundle体积从3M到400k之路
使用Webpack5创建Vue2项目及优化
之前我们大多都是用Vue-Cli来创建项目,但是Vue-Cli已经停止更新了,并且Vue-Cli相当于一堆插件的集合体,我们想替换以下,或者想根据我们的项目优化以下,提升编译的性能,这时候可以自己用Webpack来配置项目。
码客说
2022/09/27
3.1K0
使用Webpack5创建Vue2项目及优化
前端工程化之Webpack优化
好久没更文了,其实这段时间,一直没闲着。在准备一些比较重要的东西。忙着跑步,忙着学习,忙着xx。 总之就是,一直在忙着,从未停歇。
前端柒八九
2022/09/16
1.2K2
【Webpack】320- Webpack4 入门手册(共 18 章)(下)
最近和部门老大,一起在研究团队【EFT - 前端新手村】的建设,目的在于:帮助新人快速了解和融入公司团队,帮助零基础新人学习和入门前端开发并且达到公司业务开发水平。
pingan8787
2019/08/20
2.4K0
【Webpack】320- Webpack4 入门手册(共 18 章)(下)
webpack的进阶使用
Webpack 是一个模块打包器,可以将多个模块打包成一个或多个文件。除了基本的打包功能外,Webpack 还提供了很多高级功能,可以优化打包结果、提高构建速度等。在本文中,我们将介绍 Webpack 的一些进阶使用技巧,并提供相应的代码示例。
世间万物皆对象
2024/03/20
1200
webpack 学习笔记系列06-打包优化
可选值:async(默认) | initial | all(推荐),针对下面的 a.js 和 b.js
CS逍遥剑仙
2021/06/27
2K0
Webpack4 性能优化实践
在使用 Webpack 时,如果不注意性能优化,可能会产生性能问题,会导致在开发体验上不是非常丝滑,性能问题主要是编译速度慢,打包体积过大,因此性能优化也主要从这些方面来分析。本文主要是自己平时的工作积累和参考别人的文章,而进行总结,基于 Webpack4 版本。
发声的沉默者
2021/06/14
1.3K0
Webpack4 性能优化实践
Vue-Cli优化编译速度
Vue-Cli脚手架会有webpack的很多默认行为,因此我们得知道基于Vue-Cli的项目,当前的webpack都配置了啥,然后才能做针对性的分析与优化。
码客说
2022/09/27
3.8K0
Vue-Cli优化编译速度
[分享]Webpack打包分析工具
原创不易,未经作者允许禁止转载!! Webpack打包分析 分享时间和文件的分析工具,便于进行打包优化。 打包的时间分析 如果希望看到每一个Loader、每一个Plugin消耗的打包时间,可以借助于一个插件:speed-measure-webpack-plugin 注意:该插件在最新的webpack版本中存在一些兼容性的问题(和部分Plugin不兼容) 截止2021-3-10日,但是目前该插件还在维护,所以可以等待后续是否更新; 安装 npm i speed-measure-webpack-plugin
前端LeBron
2021/12/08
1.2K0
[分享]Webpack打包分析工具
webpack5快发布了,你还没用过4吗?
webpack5 预计会在 2020 年年初发布,之前从 alpha 版本就有关注,本次重点更新在长期缓存,tree shakking 和 es6 打包这块。具体变更可以参考https://github.com/webpack/changelog-v5/blob/master/README.md。
前端森林
2020/04/23
1.6K0
webpack5快发布了,你还没用过4吗?
Webpack组件库打包超详细指南
我们的打包配置有一个基类文件,并根据不同的打包需求,有不同子类文件——完整组件库打包、单个组件打包、打包示例工程。
luciozhang
2023/04/22
3.3K1
Webpack组件库打包超详细指南
【Cute-Webpack】Webpack4 入门手册(共 18 章)
最近和部门老大,一起在研究团队【EFT - 前端新手村】的建设,目的在于:帮助新人快速了解和融入公司团队,帮助零基础新人学习和入门前端开发并且达到公司业务开发水平。
pingan8787
2019/08/15
2.4K1
Vue webpack 压缩打包上线 首屏加载时间过长 优化方案
最近博客上线,但是在首次加载的时候,需要消耗很多时间,大概在50秒左右,就是说第一页登录页面,就需要用户等待50秒(服务器是最低配置也是一个原因),看了一下network,发现有两个文件加载的时间特别长,一个是vendor.js,一个是app.js,打包的时候,这两个文件也提示文件过大
Autooooooo
2020/11/09
1.9K0
Vue webpack 压缩打包上线 首屏加载时间过长 优化方案
Vue官网开发实践:从零开始构建一个现代化的单页应用
在阅读这篇文章前,推荐一篇“好”文章:【鸿蒙技术分享:探索 HarmonyOS 开发之旅】
lyushine
2024/11/26
3110
重学webpack4之构建速度提升和体积优化
5.执行npm run build,发现那些被拆分的包,没有打进业务代码中,符合预期
疯狂的技术宅
2020/12/15
1.2K0
重学webpack4之构建速度提升和体积优化
梳理 6 项 webpack 的性能优化
webpack在启动后,会根据Entry配置的入口,递归解析所依赖的文件。这个过程分为「搜索文件」和「把匹配的文件进行分析、转化」的两个过程,因此可以从这两个角度来进行优化配置。
Nealyang
2020/07/24
1.9K0
推荐阅读
相关推荐
前端性能优化——包体积压缩82%、打包速度提升65%
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验