webpack构建打包的性能优化实战指南

webpack构建打包的性能优化实战指南

目录

前言

一、优化打包构建速度,提升开发体验和效率

1.1优化babel-loader

1.2IgnorePlugin,避免引入无用模块

1.3noParse避免重复模块化解析

1.4happyPack多进程打包

1.5ParallelUglifyPlugin多进程压缩js

1.6热更新

1.7DllPlugin动态链接库插件

二、webpack性能优化-产出代码

总结

前言

开发的时候,如果每次我们修改了文件,webpack都能很迅速地帮我们编译完构建完而且浏览器能保存状态更新内容,体验会比较好;优化产出代码,减小体积,设置hash,可以提升生产环境上网页的加载速度

一、优化打包构建速度,提升开发体验和效率 1.1 优化babel-loader

开启缓存,只要是es6代码没有改动的部分,下次重新构建的时候可以使用缓存,不被重新编译。

rules: [ { test: /\.js$/, loader: ['babel-loader?cacheDirectory'], include: srcPath, //设置include或者exclude的范围,限定需要编译文件的目录范围 //exclude: /node_modules/ } ] 1.2 IgnorePlugin,避免引入无用模块

比如有些库包含多个国家的语言包(moment.js),我们只需要中文包或者英文报,所以我们需要避免引入不需要的语言包,

plugins: [ //忽略moment下的/locale目录,再手动import locale内部我们需要使用到的语言包 new webpack.IgnorePlugin(/\.\/local/,/moment/) ] 1.3 noParse 避免重复模块化解析

代码中如果有xx.min.js之类的文件,基本已经采用模块化处理过的,无需在对类似文件进行递归解析处理,会引入进项目

module: { noParse: [/xx\.min\.js$/] } 1.4 happyPack 多进程打包

开启多进程打包,提高构建速度

rules: [ { test: /\.js$/, //把对.js文件的处理转交给id为babel的HappyPack实例 use: ['happypack/loader?id=babel'], include: srcPath } ], plugins: [ new HappyPack({ //用唯一的标识符id来代表当前的HappyPack是用来处理一类特定的文件 id: 'babel', //如何处理.js文件,用法和loader配置中一样 loaders: ['babel-loader?cacheDirectory'] }) ] 1.5 ParallelUglifyPlugin多进程压缩js

在生产环境中使用,因为在开发环境下没有必要压缩js代码

plugins: [ new ParallelUglifyPlugin({ //还是使用的UglifyJs压缩,只不过帮助开启了多进程 uglifyJS: { output: { beautify: false,//最紧凑的输出 comments: false,//删除所有的注释 }, compress: { //删除所有的'console'语句,可以兼容ie浏览器 drop_console: true, //内嵌定义了但只用到一次的变量 collapse_vars: true, //提取出出现多次但是没定义成变量去引用的静态值 reduce_vars: true } } }) ] 1.6 热更新

改完代码,浏览器无需刷新,新代码生效,状态保留。

entry: { index: [ 'webpack-dev-server/client?http://localhost:8080/', 'webpack/hot/dev-server', path.join(srcPath, 'index.js') ], other: path.join(srcPath, 'other.js') } plugins: [ new HotModuleReplacementPlugin() ] devServer: { xxx: 'xx' hot: true //开启热更新 }

配置完后,修改样式,热更新生效了,但修改js,热更新没有生效,接下来还需要在js中设置允许热更新监听的模块

if(module.hot){ module.hot.accept(['xxx文件名'], () => { //在注册了热更新的js文件修改后,才会进行热更新 }) } 1.7 DllPlugin动态链接库插件

前端框架如Vue、React,体积大,构建慢,比较稳定,不常升级版本。这种情况下,同一个版本只构建一次,不用每次都重新构建; 由于webpack已内置DllPlugin,所以不需我们额外安装插件,包含两个插件 DllPlugin(用来打包出dll文件,只要打包过,就不需要再打包了),DllReferencePlugin(使用dll文件)

//webpack.dll.js文件中的配置 mode: 'development', entry: { //把react相关模块放到一个单独的动态链接库 react: ['react','react-dom'] }, output: { //输出动态链接库的文件名称,[name]代表当前动态链接库的名称 filename: '[name].dll.js', path: distPath, //存放动态链接库的全局变量名称,例如对应react来说就是 _dll_react //之所以在前面加上_dll_是为了防止全局变量冲突 library: '_dll_[name]' } plugins: [ new DllPlugin({ //动态链接库的全局变量名称,需要和output.library中保持一致 //该字段的值也就是输出的manifest.json文件中name字段的值 name: '_dll_[name]', path: path.join(distPath, '[name].manifest.json') }) ]

配置好webpack.dll.js后,在package.json文件中定义执行webpack.dll.js的命令

"script": { "dll": "webpack --config build/webpack.dll.js" }

以上配置完执行dll打包命令打包后会产出react.dll.js和react.manifest.json文件,需要在项目中使用到打包后的react.dll.js

//在inde.html中 <script src="./react.dll.js"></script> //在webpack.dev.js中 plugins: [ new DllReferencePlugin({ //描述react动态链接库的文件内容 manifest: require(path.join(distPath, 'react.manifest.json')) }) ] 二、webpack性能优化-产出代码

可以从体积更小;合理分包,不重复加载;速度更快、内存使用更少这几方面去进行优化

2.1 小图片base64编码,使用url-loader,可减少网络请求

2.2 bundle加hash,如果文件没有变,hash值不变,浏览器可以命中缓存

2.3 提取公共代码,可以是整个项目的体积更小

2.4 IngorePlugin 忽略库中不需要的包

2.5使用cdn加速

output: { publicPath: 'http://cdn.xxx.com'//引用文件路径是,路径名前加cdn域名的前缀 }

打包后,将代码放入cdn域名对应的服务器中。

2.6 使用production

mode为production时,打包后的代码会自动压缩,Vue/React会自动删掉调式代码(如开发环境的warning),也会自动启用Tree-Shaking,将未使用到的代码删掉

mode: "production"

2.7 Scope Hosting

将多个函数合并到一个函数中,可以使代码体积更小,创建的函数作用域更少,代码可读性更好

module.exports = { resolve: { mainFields: ['jsnext: main','browser','main'] }, plugins: [ //开启Scope Hosting new ModuleConcatenationPlugin() ] } 总结

到此这篇关于webpack构建打包的性能优化的文章就介绍到这了,更多相关webpack构建打包性能优化内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!

推荐阅读

    3500元超额值学生娱乐结构的优化配置

    3500元超额值学生娱乐结构的优化配置,,作为一个DIY的主流用户领域的学生,每个用户51学生攒机的高峰。因为学生用户没有稳定的收入来源,攒机

    优化PostgreSQL中的批量更新性能

    优化PostgreSQL中的批量更新性能,数据,表格,在Ubuntu 12.04上使用PG 9.1. 我们目前需要24小时才能运行大量UPDATE数据库上的语句,其形式

    512内存的电脑优化|笔记本内存512

    512内存的电脑优化|笔记本内存512,,1. 笔记本内存512够用,因为运行非常流畅,苹果笔记本 16g512的运行内存是16g内存,机身内存是512g内存,运行

    Windows7下固态硬盘的优化技术

    Windows7下固态硬盘的优化技术,,当微软开发Windows Vista时,固态硬盘没有那么热,所以没有进行优化。Windows 7是不同的。微软从一开始就把SS

    记一次服务端系统性能优化

    记一次服务端系统性能优化,在线,设备, 首先简单介绍一下业务场景,物联网设备,关注公众号,免费领取环保袋。12月8号,也就是昨天上午,突然接

    幻灯片放映慢优化可以加快速度

    幻灯片放映慢优化可以加快速度,,用于制作幻灯片的一些技术更复杂,这些幻灯片在一些旧机器上运行缓慢或缓慢。在这种情况下,我们应该如何优化

    电脑cpu调整软件|电脑优化cpu的软件

    电脑cpu调整软件|电脑优化cpu的软件,,1. 电脑优化cpu的软件出现这个问题归根到底是因为你是用的模拟器,而模拟器是比较卡顿的,尤其在配置比

    01-Vue项目实战-网易云音乐-准备工作

    01-Vue项目实战-网易云音乐-准备工作,网易,项目,前言在接下来的一段时间,我会仿照网易云音乐,利用Vue开发一个移动端的网易云音乐项目。在做

    bios优化设置|bios的优化设置

    bios优化设置|bios的优化设置,,1. bios的优化设置开机按del键,在bios设置菜单中选择loadfall-safe defaults,在弹出的确认提示中按y键即可

    hp超级本envy优化|hp envy bios

    hp超级本envy优化|hp envy bios,,hp超级本envy优化笔记本开机时显示报错码3f0表现为系统卡顿,原因和解决方法如下3、电脑同时开启了多个应