前端webpack构建优化

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

一.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/

三.优化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>:hash:<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/static/favicon.ico

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

很简单,只要与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.

期待和大家交流,共同进步,欢迎大家加入我创建的与前端开发密切相关的技术讨论小组:

努力成为优秀前端工程师!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容