彻底解决Webpack打包慢的问题

【高频考点精讲】Webpack打包优化全攻略,让你的项目构建速度提升300% Webpack优化是个系统工程,就像给老房子做改造——不能只刷墙,要从地基到屋顶全面检查。 阅读详情
  

这几天写腾讯实习生 Mini 项目的时候用上了 React 全家桶,当然同时引入了 Webpack 作为打包工具。但是开发过程中遇到一个很棘手的问题就是,React 加上 React-Router、superagent、eventproxy 这些第三方轮子一共有好几百个 module,Webpack 的打包速度极慢。这对于开发是非常不好的体验,同时效率也极低。

问题分析

我们先来看一下完全没有任何优化的时候,Webpack 的打包速度(使用了jsx和babel的loader)。下面是我们的测试文件:

//test.js
var react = require('react');
var ReactAddonsCssTransitionGroup = require('react-addons-css-transition-group');
var reactDOM = require('react-dom');
var reactRouter = require('react-router');
var superagent = require("superagent");
var eventproxy = require("eventproxy");

运行

webpack test.js

在我的2015款RMBP13,i5处理器,全SSD下,性能是这样的:

没错你没有看错,这几个第三方轮子加起来有整整668个模块,全部打包需要20多秒。

这意味着什么呢?你每次对业务代码的修改,gulp 或者 Webpack 监测到后都会重新打包,你要足足等20秒才能看到自己的修改结果。

但是需要重新打包的只有你的业务代码,这些第三方库是完全不用重新打包的,它们的存在只会拖累打包性能。所以我们要找一些方法来优化这个过程。

配置externals

Webpack 可以配置 externals 来将依赖的库指向全局变量,从而不再打包这个库,比如对于这样一个文件:

import React from 'react';
console.log(React);

如果你在 Webpack.config.js 中配置了externals:

module.exports = {
    externals: {
        'react': 'window.React'
    }
    //其它配置忽略...... 
};

等于让 Webpack 知道,对于 react 这个模块就不要打包啦,直接指向 window.React 就好。不过别忘了加载 react.min.js,让全局中有 React 这个变量。

我们来看看性能,因为不用打包 React 了所以速度自然超级快,包也很小:

配置externals的缺陷

问题如果就这么简单地解决了的话,那我就没必要写这篇文章了,下面我们加一个 react 的动画库 react-addons-css-transition-group 来试一试:

import React from 'react';
import ReactAddonsCssTransitionGroup from 'react-addons-css-transition-group';
console.log(React);

对,你没有看错,我也没有截错图,新加了一个很小很小的动画库之后,性能又爆炸了。从模块数来看,一定是 Webpack 又把 react 重新打包了一遍。

我们来看一下为什么一个很小很小的动画库会导致 Webpack 又傻傻地把 react 重新打包了一遍。找到 react-addons-css-transition-group 这个模块,然后看看它是怎么写的:

// react-addons-css-transition-group模块
// 入口文件 index.js
module.exports = require('react/lib/ReactCSSTransitionGroup');

这个动画模块就只有一行代码,唯一的作用就是指向 react 下面的一个子模块,我们再来看看这个子模块是怎么写的:

// react模块
// react/lib/ReactCSSTransitionGroup.js
var React = require('./React');
var ReactTransitionGroup = require('./ReactTransitionGroup');
var ReactCSSTransitionGroupChild = require('./ReactCSSTransitionGroupChild');
//....剩余代码忽略

这个子模块又反回去依赖了 react 整个库的入口,这就是拖累 Webpack 的罪魁祸首。

总而言之,问题是这样产生的:

  1. Webpack 发现我们依赖了 react-addons-css-transition-group

  2. Webpack 去打包 react-addons-css-transition-group 的时候发现它依赖了 react 模块下的一个叫 ReactTransitionGroup.js 的文件,于是 Webpack 去打包这个文件。

  3. ReactTransitionGroup.js 依赖了整个 react 的入口文件 React.js,虽然我们设置了 externals ,但是 Webpack 不知道这个入口文件等效于 react 模块本身,于是我们可爱又敬业的 Webpack 就把整个 react 又重新打包了一遍。

读到这里你可能会有疑问,为什么不能把这个动画库也设置到 externals 里,这样不是就不用打包了吗?

问题就在于,这个动画库并没有提供生产环境的文件,或者说这个库根本没有提供 react-addons-css-transition-group.min.js 这个文件。

这个问题不只存在于 react-addons-css-transition-group 中,对于 react 的大多数现有库来说都有这个依赖关系复杂的问题。

初级解决方法

所以对于这个问题的解决方法就是,手工打包这些 module,然后设置 externals ,让 Webpack 不再打包它们。

我们需要这样一个 lib-bundle.js 文件:

window.__LIB["react"] = require("react");
window.__LIB["react-addons-css-transition-group"] = require("react-addons-css-transition-group");
// ...其它依赖包

我们在这里把一些第三方库注册到了 window.__LIB 下,这些库可以作为底层的基础库,免于重复打包。

然后执行 webpack lib-bundle.js lib.js,得到打包好的 lib.js。然后去设置我们的 externals :

var webpack = require('webpack');
module.exports = {
    externals: {
        'react': 'window.__LIB["react"]',
        'react-addons-css-transition-group': 'window.__LIB["react-addons-css-transition-group"]',
        // 其它库
    }
    //其它配置忽略...... 
};

这时由于 externals 的存在,Webpack 打包的时候就会避开这些模块超多,依赖关系复杂的库,把这些第三方 module 的入口指向预先打包好的 lib.js 的入口 window.__LIB,从而只打包我们的业务代码。

终极解决方法

上面我们提到的方法本质上就是一种动态链接库(dll)”的思想,这在 windows 系统下面是一种很常见的思想。一个dll包,就是一个很纯净的依赖库,它本身不能运行,是用来给你的 app 或者业务代码引用的。

同样的 Webpack 最近也新加入了这个功能:webpack.DllPlugin。使用这个功能需要把打包过程分成两步:

  1. 打包ddl包

  2. 引用ddl包,打包业务代码

首先我们来打包ddl包,首先配置一个这样的 ddl.config.js:

const webpack = require('webpack');

const vendors = [
    'react',
    'react-dom',
    'react-router',
    // ...其它库
];

module.exports = {
    output: {
        path: 'build',
        filename: '[name].js',
        library: '[name]',
    },
    entry: {
        "lib": vendors,
    },
    plugins: [
        new webpack.DllPlugin({
            path: 'manifest.json',
            name: '[name]',
            context: __dirname,
        }),
    ],
};

webpack.DllPlugin 的选项中:

  • path 是 manifest.json 文件的输出路径,这个文件会用于后续的业务代码打包;

  • name 是dll暴露的对象名,要跟 output.library 保持一致;

  • context 是解析包路径的上下文,这个要跟接下来配置的 webpack.config.js 一致。

运行Webpack,会输出两个文件一个是打包好的 lib.js,一个就是 manifest.json,它里面的内容大概是这样的:

{
    "name": "vendor_ac51ba426d4f259b8b18",
    "content": {
        "./node_modules/react/react.js": 1,
        "./node_modules/react/lib/React.js": 2,
        "./node_modules/react/node_modules/object-assign/index.js": 3,
        "./node_modules/react/lib/ReactChildren.js": 4,
        "./node_modules/react/lib/PooledClass.js": 5,
        "./node_modules/react/lib/reactProdInvariant.js": 6,
        // ............
    }
}

接下来我们就可以快乐地打包业务代码啦,首先写好打包配置文件 webpack.config.js:

const webpack = require('webpack');
module.exports = {
    output: {
        path: 'build',
        filename: '[name].js',
    },
    entry: {
        app: './src/index.js',
    },
    plugins: [
        new webpack.DllReferencePlugin({
            context: __dirname,
            manifest: require('./manifest.json'),
        }),
    ],
};

webpack.DllReferencePlugin 的选项中:

  • context 需要跟之前保持一致,这个用来指导 Webpack 匹配 manifest 中库的路径;

  • manifest 用来引入刚才输出的 manifest.json 文件。

DllPlugin 本质上的做法和我们手动分离这些第三方库是一样的,但是对于包极多的应用来说,自动化明显加快了生产效率。


PS:

其实还有一个速度的优化点,就是配置babel,让它排除一些文件,当loader这些文件时不进行转换,自动跳过;可在.babelrc文件中配置,示例:

{
    "presets": [
        "es2015"
    ],
    "ignore":[
        "jquery.js",
        "jquery.min.js",
        "angular.js",
        "angular.min.js",
        "bootstrap.js",
        "bootstrap.min.js"
    ]
}
SQL优化实战:十个典型慢SQL场景与排查方案 数据库性能直接决定了业务系统的响应速度,而SQL执行效率低下往往源于索引失效、执行计划选择错误或写法不当。面对慢查询,如何快速定位根因并有效优化,是后端开发与DBA的必备技能。通过熟练掌握EXPLAIN执行计划中type、key、rows、Extra等关键字段,能够准确识别全表扫描、文件排序、临时表等性能瓶颈。索引设计遵循等值条件前置、范围排序后置的原则,合理利用复合索引、覆盖索引以及改写SQL逻辑,可显著提升查询效率。深分页、多表JOIN、OR条件、GROUP BY等场景均有成熟的优化路径。本文通过对十个 阅读详情

相关推荐

Power BI矩阵视觉对象:Excel数据透视表的现代进化版

数据透视表是商业智能中最基础的多维分析技术,其核心原理在于对原始一维数据进行行、列、值三要素的交叉聚合,实现动态切片与下钻。随着分析需求从静态报表转向实时交互、多层级探索和跨视觉联动,传统Excel透视表在可维护性、性能和用户体验上逐渐受限。Power BI通过矩阵(Matrix)视觉对象重构了这一能力——它基于OLAP立方体思维,原生支持结构化层级嵌套、上下文感知小计、空值智能分组及跨图表联动筛选。本文聚焦Power BI中Matrix的实际落地,详解如何用它替代Excel透视表完成销售下钻、财务同比、运

weixin_30896825的博客 408

Webpack打包构建太慢了?试试几个方法

Webpack打包构建太慢了?试试几个方法 Webpack是个很流行的打包工具,但其打包速度却一直被吐槽着 如果不用上一些打包的优化建议,单单打包两三个文件就能花上好几秒,放上几十个入口文件依赖几百上千个包的话,几分钟十几分钟妥妥的 本文整理了常见的一些方法,部分使用之后就看到了很大改善,部分没什么明显的变化,也可能是项目规模还不够大,先记录一下方法也好 还是太慢了,快快使用Webpack4 一、使用监听模式或热更新热替换 webpack支持监听模式,此时需要重新编译时就可以进行增量构建,增

cxu123321的博客 3362

Codex 插件精选与提示词配置:让 AI 编程助手真正落地的 10 个实战方案

在 AI 辅助编程日益普及的今天,如何让智能体工具真正融入日常开发流程,是许多开发者关心的核心问题。智能体(Agent)的推理能力高度依赖上下文质量,而插件与提示词正是优化上下文的两大关键手段。通过编辑器层、智能体层与提示词层的合理分层,开发者可以显著提升代码生成、重构与验证的效率。本文从工程实践出发,围绕插件选型、提示词模板设计、模型配置与上下文瘦身等通用技术概念,展开一套可复用的方法论,帮助你在 Codex 生态中避免工具冲突与上下文膨胀,最终沉淀出稳定、高效、不折腾的 AI 协作工作流。

weixin_27743991的博客 341

[打包优化]Webpack DLL

写作不易,未经作者允许禁止以任何形式转载!如果觉得文章不错,欢迎关注、点赞和分享! 掘金原文链接 认识DLL库 什么是DLL DLL全称是动态链接库(Dynamic Link Library),是为软件在Windows中实现共享函数库的一种实现方式; 那么webpack中也有内置DLL的功能,它指的是可以将可以共享,并且不经常改变的代码,抽取成一个共享的库; 这个库在之后编译的过程中,会被引入到其他项目的代码中,减少的打包的时间; DDL库的使用分为两步: 第一步:打包一个DLL库; 第二.

weixin_46653793的博客 1893

如何提⾼webpack的打包速度?

使用Webpack的动态导入功能(如使用import())可以将代码拆分成更小的块,只在需要时加载。DllPlugin可以将第三方库或公共模块提前打包成单独的文件,并生成一个预编译的清单文件。使用Webpack的多线程或多进程构建可以利用多核处理器的优势,加快构建速度。确保使用的Loader是高效的。如果项目文件存储在慢速的文件系统上(如虚拟机或网络共享),可以尝试将项目文件移到本地的快速文件系统上,例如SSD。确保使用的是最新版本的Webpack,因为每个版本都会带来性能改进和优化。

祈澈菇凉 1397

AI 生成 CAN 通信测试用例实战

本文分享了AI辅助汽车电子测试用例编写的实战经验。通过某车企CAN网络测试项目案例,对比传统方式(需27天)与AI辅助方式(仅5天)的效率差异,展示81%的效率提升。文章详细介绍了从DBC文件提取信号信息的方法,包括DBC文件结构解析、信号定义说明,并提供了完整的Python解析脚本代码,可将信号信息导出为JSON或Excel格式,为后续AI批量生成测试用例奠定基础。

小明的博客 693

数据分析SQL学习路线:从基础查询到窗口函数与性能优化

在数据分析与数据库开发中,SQL作为最基础的数据查询与处理语言,其重要性常被低估。通过掌握分组聚合、多表关联、条件判断等核心语法,能够高效完成数据清洗、统计分析与业务洞察。窗口函数更是从“能查询”进阶到“能分析”的分水岭,配合CASE WHEN、NULL处理和日期函数,可解决留存、排名、同环比等高频分析问题。而在实际工程中,慢SQL排查与索引优化同样关键,合理使用EXPLAIN和规范化写法,能显著提升查询效率。本文围绕7天学习路线,系统梳理了数据分析SQL的高频写法、常见陷阱与优化技巧,帮助初学者和开发者快

weixin_34221112的博客 317

SystemC实战:用C++搞芯片建模的5个典型场景(含代码示例)

本文通过五个典型实战场景,详细介绍了如何使用SystemC这一基于C++的硬件建模库进行芯片设计与系统级建模。内容涵盖从基础并发模块构建、事务级总线建模、跨时钟域验证,到与ModelSim协同仿真及多核系统性能探索,并提供了完整的代码示例,帮助软件工程师利用熟悉的C++工具链高效参与硬件架构设计与验证。

weixin_29191761的博客 316

如何优化webpack打包速度

如何优化webpack打包速度

路人贾! 2250

深入剖析STM32F103 I2C总线死锁问题及高效应对策略

本文深入剖析了STM32F103硬件I2C总线在轮询模式下发生死锁的根本原因,即硬件状态机的预取机制与软件响应速度不匹配。文章提供了高效的解决方案,包括在轮询模式下提前发送NACK/STOP信号、降低总线速度,以及治本的中断与DMA应用策略,帮助开发者根据项目需求选择最合适的方案,彻底解决这一经典硬件缺陷问题。

weixin_29184371的博客 206

用RK3588 NPU加速人脸识别:从本地测试到服务器部署的完整流程(含ONNX模型)

本文详细介绍了如何利用RK3588 NPU加速人脸识别系统,从模型优化到高并发服务部署的全流程。通过RetinaFace和FaceNet模型的协同推理,结合ONNX模型转换和NPU特有优化技巧,显著提升识别效率。文章还涵盖了gRPC通信架构设计、性能压测及实际部署经验,为开发者提供了一套完整的解决方案。

weixin_29058331的博客 464

前端项目打包优化(解决首屏加载慢的问题),看一篇就够了!

解决vue项目打包之后首屏加载慢的问题

Antoinette_Xiao的博客 6518

微信小程序内容安全审核:从API调用到工程化落地的全流程实践

内容安全是互联网应用开发中的基础性技术环节,尤其在用户生成内容(UGC)场景下,它直接关系到平台的合规性与用户体验。其核心原理通常结合了关键词过滤、自然语言处理(NLP)和计算机视觉(CV)等技术,通过AI模型对文本、图像、音频进行多维度风险识别。这项技术的价值在于,它不仅是满足监管要求的必要手段,更是构建健康社区生态、保护品牌声誉、实现产品长期稳定运营的基石,广泛应用于社交、电商、社区论坛等各类UGC平台。本文聚焦于微信小程序生态,深入剖析其官方提供的内容安全解决方案,详细解读如何将文本同步检测与多媒体异

weixin_28622215的博客 452

Webpack打包构建太慢了?试试这几个提升打包速度方案

【代码】Webpack打包构建太慢了?试试这几个提升打包速度方案。

qq_67572731的博客 2635

第十二章 供水管网水力模型软件介绍

本文介绍了国内外主要供水管网建模软件及其特点,重点分析了某高建模软件V14的创新功能。国际主流软件包括开源的EPANET、商业软件InfoWorksWS、WaterGEMS和MIKEURBAN,各具特色但存在应用局限。某高V14软件实现了管网GIS与模型一体化管理,采用一G多网、一网多模、一模多案、网模合一技术路线,支持全信息模型建立和动态数据更新。其创新点包括水量分配理念革新(精确/模糊匹配、三种用水模式)和首创Web服务功能。通过并发计算、GPU加速等技术优化性能,具有较高性价比。

weixin_45258875的博客 208

【网络基础2】路由器的 “两扇门”:二层接口和三层接口到底有啥不一样?

家里的路由器背后总有几个网线接口,有的标着 “LAN”,有的标着 “WAN”;公司机房的路由器上,接口更是五花八门,有的插着网线,有的连着光纤,旁边还贴着 “GE0/0/1”“Eth-Trunk1” 这样的标签。你可能会想:不就是插网线的地方吗?有啥区别?其实,这些接口分 “二层接口” 和 “三层接口”,它们的作用差得远了 —— 就像你家的门,有的是 “小区内的单元门”(只通小区内部),有的是 “小区的大门”(能通往外面的世界)。接下来,咱们用大白话 + 生活例子,一点点把这两种接口讲透。

jundao1997的专栏 565

提高 webpack 打包速度的9个实用技巧

在前端开发中,webpack 是一款不可或缺的打包工具,它能够将 JavaScript、CSS 以及其他资源打包成一个优化后的文件,提高加载效率。然而,随着项目规模的扩大,webpack 的打包速度可能会成为瓶颈。如何有效提升打包速度,优化开发体验,成为许多开发者关注的焦点。本文将从多个角度介绍提升 webpack 打包速度的实用技巧,帮助你在开发过程中保持高效。通过一系列的优化措施,我们可以显著提升 webpack 的打包速度,从而提高开发效率和项目构建的整体性能。

乐闻世界 1818

11-16 Fluent结果查看及后处理功能(做动画、监控点)

监控点、面及动画操作

zheaa的博客 1万+

webpack优化启动速度以及打包速度

多进程打包,可以大大提高构建的速度,使用方法是将 thread-loader放在比较费时间的loader之前,比如babel-loade由于启动项目和打包项目都需要加速,所以配置在 webpack.base.js。缓存资源,提高二次构建的速度,使用方法是将cache-loader 放在比较费时间的loader之前,比如 babel-loader,由于启动项目和打包项目都需要加速,所以配置在 webpack.base.is。代码的重新构建时间只用于开发中,所以配置在webpack.devjs。

李青林的博客 3201

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

webpack优化打包速度

loader 使用 thread-loader 将他放置你要使用的loader前面就行,不过这个lorder例如style-loader不支持的,而且面对比较快的loader也不建议使用,会降低速度。注意:第一次启动会很慢,不改配置都会使用缓存启动,第二次很快,不过第一次加载时间会比不用此插件慢1倍,还有就是build的时候貌似没什么效果,所以慎用!进行文件的热加载的,一个项目启动或者打包的时间,超过40s的时候,可以进行项目的优化和热加载。一套下来,最主要有效果的感觉还是。具体实现参考我另一篇。

qq_38935512的博客 1427

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

vue中webpack如何提升打包速度

vue中webpack如何提升打包速度

dcl199728的博客 1578

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

前端性能优化——包体积压缩82%、打包速度提升65%

经过上面的一系列优化,可以看到:包体积由原来的2.25M减少到407KB,压缩了82%打包速度由原来的25386ms减少到8949ms,提升了65%这些方式虽然很常规,但确实可以有效地提升项目的性能本文主要介绍的是项目打包构建方面的优化方式,上一篇是业务代码层面的性能优化,其中有很多有趣的方案如果喜欢或有所启发,欢迎 star如果你现在正在找工作,可以私信“web”进群领取前端面试小册以及更多阿里、字节大厂面试真题合集,和p8大佬一起交流。

Web面试那些事儿的博客 2022

【前端webpack5高级优化】提升打包构建速度几种优化方案

所以我们需要做到修改某个模块代码,就只有这个模块代码需要重新打包编译,其他模块不变,这样打包速度就能很快。当项目越来越庞大时,打包速度越来越慢,甚至于需要一个下午才能打包出来代码。(HMR/热模块替换):在程序运行中,替换、添加或删除模块,而无需重新加载整个页面。开发时我们需要使用第三方的库或插件,所有文件都下载到。文件,这样速度就比之前的单进程打包更快了。编译结果,这样第二次打包时速度就会更快了。三个工具,所以我们要提升它们的运行速度。开发时我们修改了其中一个模块代码,的打包速度,因为其他文件都比较少。

温的打怪之旅 2722

webpack + dll 动态链接库 解决打包慢问题

参考: Webpack DLL 配置教程 webpack使用-详解DllPlugin 可视化分析包大小 webpack-bundle-analyzer **主要目标: 使用webpack + dll 动态链接库方式,避免每次打包都重新构建所有第三方库,节约时间; **问题: 当插件新增或首次打包时,时间依旧会变长,第二次就快很多,所以当插件固定时,做一次预打包处理,到真正需要打包时,速度会快很多 1.环境: "webpack":"^4.42.0", "webpack-cli":"^4..

weixin_40532650的博客 692
上一篇: 《JavaScript高级程序设计 第三版》学习笔记 (十三)高级函数
下一篇: 【AngularJs】ui-grid 使用详解
SunsCheung
博客等级 码龄11年 30粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值