前端webpack构建优化

简介: 从0到1负责手上项目一年多了,webpack虽然是老生常谈的话题,但只有出现问题时,才会去思考怎么去优化。由于项目里引入了越来越多的依赖,所以本地开发编译过程越来越慢,因此才有了这一次的webpack优化。顺便对一些生产环境的静态资源也做了一些优化。

image.png


一.HappyPack多线程编译


Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz 8核16线程


webpack 3.12.0 ThreadPool.size:16


本地构建速度:


51281ms(未引入happypack)


43750ms(引入happypack eslint-loader)


35862ms(引入happypack eslint-loader, vue-loader)


35476ms(引入happypack eslint-loader, vue-loader, babel-loader)


打包dist速度:


58192ms(未引入happypack)


49745ms(引入happypack eslint-loader)


46505ms(引入happypack eslint-loader, vue-loader)


43358ms(引入happypack eslint-loader, vue-loader, babel-loader)


从上面的实验数据可以得出:无论是本地构建还是打包dist,eslint-loader,vue-loader,babel-loader的happypack对编辑速度都是有提升的。


二.TinyPng优化静态图片资源


https://tinypng.com/


image.png


image.png


三.优化loader配置


cacheDirectory开启缓存,include去除无需处理文件。


// 配置前
{
    test: /\.js$/,
    loader: ‘babel-loader',
    include: [resolve('src'), resolve(’test'), resolve('node_modules/webpack-dev-server/client')],
},
// 配置后
{
    test: /\.js$/,
    loader: ‘babel-loader?cacheDirectory=true’,// 开启缓存加速
    include: [resolve('src'), resolve('node_modules/webpack-dev-server/client')], // 并无单测,去除test目录
},


四.优化包查找路径


使用绝对路径,只在给定目录中搜索,省去了查找依赖的时间损耗


因为默认设置是[node modules]。 从当前目录找node_modules,若没有,从../node_modules找,若是再没有,继续找../node_modules,直到找到为止。


我手上的项目是直接存在src,build目录同级的node_modules下的,所以可以按照下面这样修改。



// 配置前
resolve: {
    modules: ["node_modules”],
}
// 配置后
resolve: {
    modules: [path.join(__dirname, '..', "node_modules”)] // 这个路径根据构建文件所在位置去调整,此处是build/webpack.base.conf.js,node_modules目录与src目录同级
}


五.消除无更新的图片资源计算


由于项目中的一些图片资源是一直不变的,因此没有必要每次都通过url-loader或file-loader加载打包,消除转换base64url或者<hashType><digestType>,所以图片资源尽可能使用绝对路径引入/static下的文件,而不是通过import去引入。


出于优化成本考虑,我这次仅仅将超过limit的图片进行转移。


转移前:vue.40add6f.png


转移后:vue.png


例如预发环境,若是不同环境的BASE_URL不一样,可以通过DefinePlugin和<=%BASE_URL%=>传入。


config.js



{
    dev:{
        BASE_URL:’/’,
    },
    build:{
        BASE_URL:’/foo/bar/’,
    }
}

webpack.dev.conf.js


plugins:{
    new webpack.DefinePlugin({
        BASE_URL:JSON.stringify(config.dev.BASE_URL),
    }),
},


webpack.prod.conf.js


plugins:{
    new webpack.DefinePlugin({
        BASE_URL:JSON.stringify(config.build.BASE_URL),
    }),
},


<link rel="icon" href=“<%=BASE_URL=%>static/favicon.ico">

favicon.ico的路径地址如下:


在开发环境是:localhost:9090/static/favicon.ico


在生产环境是:https://www.jsnb.com/foo/bar/...


在单文件组件内该如何操作呢?


很简单,只要与src同级创建一个baseUrl.js,然后在文件中绑定到组件data函数上即可。

// eslint-disable-next-line no-undef
export default BASE_URL;
<img :src=“Logo" />
const Logo = `${baseUrl}static/logo.png`;
data(){
    return {
        Logo,
    }
}


优点:


1.迁移assets下大文件到static,减少计算hash时间,通过/static引入。


2.DefinePlugin,根据环境切换static引入路径统一引入。(若通过webpack的resolve.alias统一引入,还是会被url-loader加载,还是会去做计算)。


缺点:


1.构建提升速度收效甚微


2.有缓存文件不能用此方法,会有缓存


3.图片文件存放分散,不便于管理


建议:在没有遇到由于url-loader,file-loader加载图片,视频等本地资源慢的情况下,可以一直使用assets的方式,不用折腾。


六.提升开发环境rebuild速度


source map众所周知是为了webpack debug的一个配置,有7个配置。可以参考官方文档https://webpack.js.org/configuration/devtool/和我之前做的一个小实验https://github.com/FrankKai/FrankKai.github.io/issues/58做对比。


开发环境:


devtool:’source-map’->devtool: ‘eval-source-map’

rebuild速度从--slow提升到了+pretty fast。


提速原因是:SourceMap转换为DataUrl加载到eval()中。重新构建时速度更快,


官方文档介绍如下:

eval-source-map - Each module is executed with eval() and a SourceMap is added as a DataUrl to the eval(). Initially it is slow, but it provides fast rebuild speed and yields real files. Line numbers are correctly mapped since it gets mapped to the original code. It yields the best quality SourceMaps for development.


斯世浊清,全赖吾辈激扬!


相关文章
|
1天前
|
缓存 监控 前端开发
【Flutter 前端技术开发专栏】Flutter 应用的启动优化策略
【4月更文挑战第30天】本文探讨了Flutter应用启动优化策略,包括理解启动过程、资源加载优化、减少初始化工作、界面布局简化、异步初始化、预加载关键数据、性能监控分析以及案例和未来优化方向。通过这些方法,可以缩短启动时间,提升用户体验。使用Flutter DevTools等工具可助于识别和解决性能瓶颈,实现持续优化。
【Flutter 前端技术开发专栏】Flutter 应用的启动优化策略
|
1天前
|
缓存 前端开发 JavaScript
如何优化前端性能:关键步骤和技巧
提高前端性能是网站和应用程序开发中至关重要的一步。本文将介绍一些关键的优化步骤和技巧,帮助开发人员有效地提升前端性能,包括资源压缩、减少HTTP请求、使用CDN加速、优化图片等方面的方法。
|
1天前
|
前端开发 JavaScript 安全
【网络安全】WebPack源码(前端源码)泄露 + jsmap文件还原
【网络安全】WebPack源码(前端源码)泄露 + jsmap文件还原
15 0
|
1天前
|
缓存 前端开发 JavaScript
优化前端性能:提升网页加载速度的10个技巧
在当今互联网时代,网页加载速度已成为用户体验的重要指标之一。本文将介绍10个有效的前端优化技巧,帮助开发人员提升网页加载速度,提升用户体验,包括减少HTTP请求、压缩资源、优化图像等方面的实用建议。
|
1天前
|
前端开发 测试技术 持续交付
《跨界合作:前端与后端如何优化协作效率》
在当今软件开发领域,前端和后端开发团队通常是分开工作的,但他们的协作质量直接影响着项目的成功与否。本文将探讨如何通过优化前端与后端的协作方式,提高开发效率和项目质量,从而实现更好的跨界合作。
|
1天前
|
存储 JavaScript 前端开发
使用Vue.js构建交互式前端的技术探索
【5月更文挑战第12天】Vue.js是渐进式前端框架,以其简洁和强大的特性深受开发者喜爱。它聚焦视图层,采用MVVM模式实现数据与视图的双向绑定,简化开发。核心特性包括响应式数据绑定、组件化、模板系统和虚拟DOM。通过创建Vue实例、编写模板及定义方法,可以构建交互式前端,如计数器应用。Vue.js让复杂、交互式的前端开发变得更加高效和易维护。
|
1天前
|
缓存 前端开发 UED
实战指南:如何优化前端性能提升用户体验
本文探讨了在当今互联网时代,前端性能优化对于提升用户体验的重要性,以及如何利用各种技术手段实现前端性能的优化。通过介绍前端性能优化的原则、常见的性能优化技巧和工具,以及实际案例分析,帮助开发者深入了解并掌握提升前端性能的方法,从而提升网站的加载速度、响应速度,提高用户的满意度和留存率。
|
1天前
|
Web App开发 缓存 前端开发
如何优化前端网页加载速度:最佳实践和工具推荐
本文探讨了如何通过采用最佳实践和利用先进的工具来优化前端网页加载速度。从压缩资源到使用CDN,从减少HTTP请求到利用缓存策略,我们将介绍一系列提高网页性能的技术手段。同时,我们还将推荐一些广受好评的工具,帮助开发者更轻松地实施这些优化策略。
|
1天前
|
缓存 前端开发 JavaScript
优化前端性能的5个技巧
提高网站的性能是前端开发中的重要任务之一。本文将介绍5个实用的技巧,帮助前端开发者优化网页加载速度、提升用户体验,并降低服务器负载。
|
1天前
|
缓存 前端开发 JavaScript
如何优化前端性能:最佳实践与工具推荐
在当今互联网时代,用户对网页加载速度和性能的要求越来越高。本文将介绍一些优化前端性能的最佳实践,包括代码压缩、资源合并、懒加载等技术,并推荐一些实用的工具,帮助开发者提升网页加载速度和用户体验。
http://www.vxiaotou.com