面试取经:工程化篇-webpack性能优化之优化loader性能

优化loader性能

进一步限制loader的应用范围

思路是:对于某些库,不使用loader

例如:babel-loader可以转换ES6或更高版本的语法,可是有些库本身就是用ES5语法书写的,不需要转换,使用babel-loader反而会浪费构建时间

lodash就是这样的一个库

lodash是在ES5之前出现的库,使用的是ES3语法

通过module.rule.excludemodule.rule.include,排除或仅包含需要应用loader的场景

javascript 复制代码
module.exports = {
    module: {
        rules: [
            {
                test: /.js$/,
                exclude: /lodash/,
                use: "babel-loader"
            }
        ]
    }
}

如果暴力一点,甚至可以排除掉node_modules目录中的模块,或仅转换src目录的模块

javascript 复制代码
module.exports = {
    module: {
        rules: [
            {
                test: /.js$/,
                exclude: /node_modules/,
                //或
                // include: /src/,
                use: "babel-loader"
            }
        ]
    }
}

这种做法是对loader的范围进行进一步的限制,和noParse不冲突

缓存loader的结果

我们可以基于一种假设:如果某个文件内容不变,经过相同的loader解析后,解析后的结果也不变

于是,可以将loader的解析结果保存下来,让后续的解析直接使用保存的结果

cache-loader可以实现这样的功能

css 复制代码
module.exports = {
  module: {
    rules: [
      {
        test: /.js$/,
        use: ['cache-loader', ...loaders]
      },
    ],
  },
};

有趣的是,cache-loader放到最前面,却能够决定后续的loader是否运行

实际上,loader的运行过程中,还包含一个过程,即pitch

cache-loader还可以实现各自自定义的配置,具体方式见文档

为loader的运行开启多线程

thread-loader会开启一个线程池,线程池中包含适量的线程

它会把后续的loader放到线程池的线程中运行,以提高构建效率

由于后续的loader会放到新的线程中,所以,后续的loader不能:

  • 使用 webpack api 生成文件
  • 无法使用自定义的 plugin api
  • 无法访问 webpack options

在实际的开发中,可以进行测试,来决定thread-loader放到什么位置

特别注意 ,开启和管理线程需要消耗时间,在小型项目中使用thread-loader反而会增加构建时间

tips:以上信息来自渡一相关学习资料,供自己学习和面试使用。

相关推荐
benbenAItalk10 小时前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
2601_9628857211 小时前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
西瓜太郎123411 小时前
Claude Code、Codex CLI、Gemini CLI 能否共用一枚 Key?先看协议选择矩阵
前端·api 网关·claude code·gemini cli·codex cli
怕浪猫11 小时前
长会话不崩盘:DeepSeek Harness 的上下文压缩与目标管理策略
面试·github·agent
ocean210312 小时前
2025-2026年Python面试高频知识点洞察
开发语言·python·面试·python八股文
陈随易13 小时前
在Finch用了62亿词元,我认为这是新一代Agent工具之神
前端·人工智能·后端
letisgo513 小时前
JAVA 高级进阶07篇《@Transactional失效的8个场景:代理机制到传播行为》
java·面试·transactional·spring事务·aop动态代理
水域安全老周13 小时前
水趣钓鱼救生衣专利拆解:两级锁紧如何解决落水人衣分离
java·前端·网络
计算机魔术师14 小时前
Anthropic CEO突然喊踩刹车,OpenAI罕见力挺:AI这辆车不能只踩油门了
前端
wing9814 小时前
从codex转战workbuddy使用一周的感受
前端·人工智能·后端