前端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.


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


相关文章
|
4天前
|
缓存 前端开发 JavaScript
利用代码分割优化前端性能:策略与实践
在现代Web开发中,代码分割是提升页面加载性能的有效手段。本文介绍代码分割的概念、重要性及其实现策略,包括动态导入、路由分割等方法,并探讨在React、Vue、Angular等前端框架中的具体应用。
|
10天前
|
编解码 前端开发 JavaScript
从入门到精通:揭秘前端开发中那些不为人知的优化秘籍!
前端开发是充满无限可能的领域,从初学者到资深专家,每个人都追求更快、更稳定、更用户体验友好的网页。本文介绍了四大优化秘籍:1. HTML的精简与语义化;2. CSS的优雅与高效;3. JavaScript的精简与异步加载;4. 图片与资源的优化。通过这些方法,可以显著提升网页性能和用户体验。
16 3
|
16天前
|
监控 前端开发 JavaScript
探索微前端架构:构建可扩展的现代Web应用
【10月更文挑战第29天】本文探讨了微前端架构的核心概念、优势及实施策略,通过将大型前端应用拆分为多个独立的微应用,提高开发效率、增强可维护性,并支持灵活的技术选型。实际案例包括Spotify和Zalando的成功应用。
|
19天前
|
缓存 前端开发 JavaScript
前端性能优化:Webpack与Babel的进阶配置与优化策略
【10月更文挑战第28天】在现代Web开发中,Webpack和Babel是不可或缺的工具,分别负责模块打包和ES6+代码转换。本文探讨了它们的进阶配置与优化策略,包括Webpack的代码压缩、缓存优化和代码分割,以及Babel的按需引入polyfill和目标浏览器设置。通过这些优化,可以显著提升应用的加载速度和运行效率,从而改善用户体验。
36 6
|
20天前
|
缓存 监控 前端开发
前端工程化:Webpack与Gulp的构建工具选择与配置优化
【10月更文挑战第26天】前端工程化是现代Web开发的重要趋势,通过将前端代码视为工程来管理,提高了开发效率和质量。本文详细对比了Webpack和Gulp两大主流构建工具的选择与配置优化,并提供了具体示例代码。Webpack擅长模块化打包和资源管理,而Gulp则在任务编写和自动化构建方面更具灵活性。两者各有优势,需根据项目需求进行选择和优化。
49 7
|
20天前
|
缓存 前端开发 JavaScript
前端工程化:Webpack与Gulp的构建工具选择与配置优化
【10月更文挑战第27天】在现代前端开发中,构建工具的选择对项目的效率和可维护性至关重要。本文比较了Webpack和Gulp两个流行的构建工具,介绍了它们的特点和适用场景,并提供了配置优化的最佳实践。Webpack适合大型模块化项目,Gulp则适用于快速自动化构建流程。通过合理的配置优化,可以显著提升构建效率和性能。
31 2
|
8天前
|
缓存 前端开发 JavaScript
前端性能优化:让你的网站更快、更流畅
前端性能优化:让你的网站更快、更流畅
14 0
|
1月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
133 2
|
1月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
43 0
|
1月前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
下一篇
无影云桌面