vue-cli4打包最强优化(10M变300kb),字节跳动+京东+360+网易面试题整理

二、配置 alias 别名

使用vue-cli开发项目,最大特色是组件化。组件中频繁引用其他组件或插件。我们可以把一些常用的路径定义成简短的名字。方便开发中使用。

//加载path模块

const path = require(‘path’)

//定义resolve方法,把相对路径转换成绝对路径

const resolve = dir => path.join(__dirname, dir)

module.exports = {

chainWebpack: config => {

// 添加别名

config.resolve.alias

.set(‘@’, resolve(‘src’))

.set(‘assets’, resolve(‘src/assets’))

.set(‘api’, resolve(‘src/api’))

.set(‘views’, resolve(‘src/views’))

.set(‘components’, resolve(‘src/components’))

}

}

配置完成后,我们在项目中可以这样写路径

//之前这么写

import Home from ‘…/views/Home.vue’

//配置alias别名后

import Home from ‘views/Home.vue’

//也可以这么写

import Home from ‘@/views/Home.vue’

项目结束后打包前webpack配置

====================================================================================

目的:

  • 提高打包速度

  • 减小项目体积、提高首屏加载速度

  • 提高用户体验(骨架屏)

打包前必做

项目开发完成后,运行npm run build进行打包操作。打包前对webpack配置。

module.exports = {

publicPath: ‘./’, // 静态资源路径(默认/,打包后会白屏)

outputDir: ‘dist’, // 打包后文件的目录 (默认为dist)

assetsDir: ‘static’, // outputDir的静态资源(js、css、img、fonts)目录 默认为‘’没有单独目录js/css/img在根目录中。

}

一、去除生产环境sourceMap

问题: vue项目打包之后js文件夹中,会自动生成一些map文件,占用相当一部分空间

sourceMap资源映射文件,存的是打包前后的代码位置,方便开发使用,这个占用相当一部分空间。

map文件的作用在于:项目打包后,代码都是经过压缩加密的,如果运行时报错,输出的错误信息无法准确得知是哪里的代码报错,有了map就可以像未加密的代码一样,准确的输出是哪一行哪一列有错。

生产环境是不需要sourceMap的,如下配置可以去除

module.exports = {

//去除生产环境的productionSourceMap

productionSourceMap: false,

}

去除sourceMap前后对比,减少了很大体积。

前:dist大小为7M

后:dist大小为3M

二、去除console.log打印以及注释

下载插件

cnpm install uglifyjs-webpack-plugin --save-dev

const UglifyJsPlugin = require(‘uglifyjs-webpack-plugin’)

const isProduction = process.env.NODE_ENV === ‘production’;

configureWebpack: config => {

const plugins = [];

if (isProduction) {

plugins.push(

new UglifyJsPlugin({

uglifyOptions: {

output: {

comments: false, // 去掉注释

},

warnings: false,

compress: {

drop_console: true,

drop_debugger: false,

pure_funcs: [‘console.log’]//移除console

}

}

})

)

}

},

结论:重新打包,dist体积减少并不大。因为congsole.log()以及注释并不会占用太多体积(也就10-30kb)

三、使用CDN 加速优化

cdn优化是指把第三方库比如(vue,vue-router,axios)通过cdn的方式引入项目中,这样vendor.js会显著减少,并且大大提升项目的首页加载速度,下面是具体操作:

在这里插入图片描述

const isProduction = process.env.NODE_ENV === ‘production’;

// externals

const externals = {

vue: ‘Vue’,

‘vue-router’: ‘VueRouter’,

vuex: ‘Vuex’,

vant: ‘vant’,

axios: ‘axios’

}

// CDN外链,会插入到index.html中

const cdn = {

// 开发环境

dev: {

css: [],

js: []

},

// 生产环境

build: {

css: [‘https://cdn.jsdelivr.net/npm/vant@2.12/lib/index.css’],

js: [

‘https://cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.min.js’,

‘https://cdn.jsdelivr.net/npm/vue-router@3.1.5/dist/vue-router.min.js’,

‘https://cdn.jsdelivr.net/npm/axios@0.19.2/dist/axios.min.js’,

‘https://cdn.jsdelivr.net/npm/vuex@3.1.2/dist/vuex.min.js’,

‘https://cdn.jsdelivr.net/npm/vant@2.12/lib/vant.min.js’

]

}

}

module.exports = {

configureWebpack: config => {

// 为生产环境修改配置…

if (isProduction) {

// externals

config.externals = externals

}

},

chainWebpack: config => {

/**

  • 添加CDN参数到htmlWebpackPlugin配置中

*/

config.plugin(‘html’).tap(args => {

if (isProduction) {

args[0].cdn = cdn.build

} else {

args[0].cdn = cdn.dev

}

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) { %>

<% } %>

总结:配置了cdn引入,1.1M体积较少到660kb。效果很明显。

四、对资源文件进行压缩

需要下载 compression-webpack-plugin

cnpm i compression-webpack-plugin -D

vue.config.js 中按照如下方式进行配置:

const CompressionWebpackPlugin = require(‘compression-webpack-plugin’)

module.exports = {

// 根据你的实际情况更改这里

publicPath,

assetsDir: ‘assets’,

lintOnSave: true,

configureWebpack: {

plugins:[

new CompressionWebpackPlugin({

filename: ‘[path].gz[query]’,

algorithm: ‘gzip’,

// test: /.js ∣ h ˙ t m l |\.html h˙tml|.json$|.css/,

test: /.js ∣ j ˙ s o n |\.json j˙son|.css/,

threshold: 10240, // 只有大小大于该值的资源会被处理

minRatio: 0.8, // 只有压缩率小于这个值的资源才会被处理

// deleteOriginalAssets: true // 删除原文件

})

],

},

}

压缩后也会节省一部分空间,单后端要对nginx修改,配合前端

nginx配置示例:

location ~ .*.(js|json|css)$ {

gzip on;

gzip_static on; # gzip_static是nginx对于静态文件的处理模块,该模块可以读取预先压缩的gz文件,这样可以减少每次请求进行gzip压缩的CPU资源消耗。

gzip_min_length 1k;

gzip_http_version 1.1;

gzip_comp_level 9;

gzip_types text/css application/javascript application/json;

root /dist;

}

压缩前后大小大致如下:

在这里插入图片描述

可以看到相应头中存在 Content-Encoding:gzip 表示已经配置成功

在这里插入图片描述

五、图片压缩

一张图片压缩前后对比:

在这里插入图片描述

需要下载 image-webpack-loader

npm install image-webpack-loader --save-dev

module.exports = {

// 根据你的实际情况更改这里

publicPath,

assetsDir: ‘assets’,

lintOnSave: true,

// image 压缩 定义在chainWebpack中

chainWebpack: config => {

config.module

.rule(‘images’)

.use(‘image-webpack-loader’)

.loader(‘image-webpack-loader’)

.options({

bypassOnDebug: true

})

.end()}

}

此插件容易下载失败,导致运行报错

  1. 若安装过 image-webpack-loader 先卸载

//npm 安装的npm 则npm 移除

npm uninstall image-webpack-loader

//如果yarn安装的,则yarn 移除

yarn remove image-webpack-loader

2、使用 cnpm , 这一步意思就是安装 cnpm 然后将全局的 registry 设置成阿里的镜像,国内阿里比较快

npm install cnpm -g --registry=https://registry.npm.taobao.org

3、使用 cnpm 安装 image-webpack-loader 会发现很快就安装好了,【手动滑稽】

cnpm install --save-dev image-webpack-loader

六、只打包改变的文件

const { HashedModuleIdsPlugin } = require(‘webpack’);

configureWebpack: config => {

const plugins = [];

plugins.push(

new HashedModuleIdsPlugin()

)

}

七、公共代码抽离

如何提取公共代码?

从webpack4开始官方移除了commonchunk插件,改用了optimization属性进行更加灵活的配置,这也应该是从V3升级到V4的代码修改过程中最为复杂的一部分

splitChunks: {

chunks: "async”,//默认作用于异步chunk,值为all/initial/async/function(chunk),值为function时第一个参数为遍历所有入口chunk时的chunk模块,chunk._modules为chunk所有依赖的模块,通过chunk的名字和所有依赖模块的resource可以自由配置,会抽取所有满足条件chunk的公有模块,以及模块的所有依赖模块,包括css

minSize: 30000, //表示在压缩前的最小模块大小,默认值是30kb

minChunks: 1, // 表示被引用次数,默认为1;

maxAsyncRequests: 5, //所有异步请求不得超过5个

maxInitialRequests: 3, //初始话并行请求不得超过3个

automaticNameDelimiter:'',//名称分隔符,默认是

name: true, //打包后的名称,默认是chunk的名字通过分隔符(默认是~)分隔

cacheGroups: { //设置缓存组用来抽取满足不同规则的chunk,下面以生成common为例

common: {

name: ‘common’, //抽取的chunk的名字

chunks(chunk) { //同外层的参数配置,覆盖外层的chunks,以chunk为维度进行抽取

},

test(module, chunks) { //可以为字符串,正则表达式,函数,以module为维度进行抽取,只要是满足条件的module都会被抽取到该common的chunk中,为函数时第一个参数是遍历到的每一个模块,第二个参数是每一个引用到该模块的chunks数组。自己尝试过程中发现不能提取出css,待进一步验证。

},

priority: 10, //优先级,一个chunk很可能满足多个缓存组,会被抽取到优先级高的缓存组中

minChunks: 2, //最少被几个chunk引用

reuseExistingChunk: true,// 如果该chunk中引用了已经被抽取的chunk,直接引用该chunk,不会重复打包代码

enforce: true // 如果cacheGroup中没有设置minSize,则据此判断是否使用上层的minSize,true:则使用0,false:使用上层minSize

}

}

}

公共模块抽离

举例:

项目中分别有a.js, b.js, page1.js, page2.js这四个JS文件, page1.js 和

page2.js中同时都引用了a.js, b.js, 这时候想把a.js, b.js抽离出来合并成一个公共的js,然后在page1,page2中自动引入这个公共的js,怎么配置呢?

第三方模块抽离

页面中有时会引入第三方模块,比如import $ from ‘jquery’;

page1中需要引用,page2中也需要引用,这时候就可以用vendor把jquery抽离出来,

如下:

// 公共代码抽离

configureWebpack: config => {

//…

//优化项配置

config.optimization = {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

后话

对于面试,说几句个人观点。

面试,说到底是一种考试。正如我们一直批判应试教育脱离教育的本质,为了面试学习技术也脱离了技术的初心。但考试对于人才选拔的有效性是毋庸置疑的,几千年来一直如此。除非你有实力向公司证明你足够优秀,否则,还是得乖乖准备面试。这也并不妨碍你在通过面试之后按自己的方式学习。
其实在面试准备阶段,个人的收获是很大的,我也认为这是一种不错的学习方式。首先,面试问题大部分基础而且深入,这些是平时工作的基础。就好像我们之前一直不明白学习语文的意义,但它的意义就在每天的谈话间。

所谓面试造火箭,工作拧螺丝。面试往往有更高的要求,也迫使我们更专心更深入地去学习一些知识,也何尝不是一种好事。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

img-0YVgQ6iF-1712706076660)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-1Lp7AT5z-1712706076661)]

后话

对于面试,说几句个人观点。

面试,说到底是一种考试。正如我们一直批判应试教育脱离教育的本质,为了面试学习技术也脱离了技术的初心。但考试对于人才选拔的有效性是毋庸置疑的,几千年来一直如此。除非你有实力向公司证明你足够优秀,否则,还是得乖乖准备面试。这也并不妨碍你在通过面试之后按自己的方式学习。
其实在面试准备阶段,个人的收获是很大的,我也认为这是一种不错的学习方式。首先,面试问题大部分基础而且深入,这些是平时工作的基础。就好像我们之前一直不明白学习语文的意义,但它的意义就在每天的谈话间。

所谓面试造火箭,工作拧螺丝。面试往往有更高的要求,也迫使我们更专心更深入地去学习一些知识,也何尝不是一种好事。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-JrFYBDkB-1712706076661)]

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值