Webpack 是一个 模块打包器,可以分析各个模块的依赖关系,最终打包成静态文件(js、css、jpg)。

三大阶段:

  1. 初始化:启动构建,读取与合并配置参数,加载plugin,实例化Compiler
  2. 编译:从Entry出发,针对每个Module串行调用对应的Loader去翻译文件中的内容,再找到该Module依赖的Module,递归的进行编译处理
  3. 输出:将编译后的Module组合成Chunk,将Chunk转换成文件,输出到文件系统中

细节:

  • Webpack CLI 通过 yargs模块解析 CLI 参数,并转化为配置对象option(单入口:Object,多入口:Array),调用 webpack(option) 创建 compiler 对象。

  • 如果有 option.plugin,则遍历调用plugin.apply()来注册 plugin,

  • 判断是否开启了 watch,如果开启则调用 compiler.watch,否则调用 compiler.run,开始构建。

  • 创建 Compilation 对象来收集全部资源和信息,然后触发 make 钩子。

  • make阶段从入口开始递归所有依赖,

  • 每次遍历时调用对应Loader翻译文件中内容,然后生成AST,遍历AST找到下个依赖继续递归,

  • 根据入口和模块之间关系组装chunk,输出到dist中的一个文件内。

在以上过程中,webpack会在特定的时间点(使用tapable模块)广播特定的事件,插件监听事件并执行相应的逻辑,并且插件可以调用webpack提供的api改变webpack的运行结果

其他

webpack中的loader是一个函数,主要为了实现源码的转换,所以loader函数会以源码作为参数,比如,将ES6转换为ES5,将less转换为css,然后再将css转换为js,以便能嵌入到html文件中

plugin是一个类,类中有一个apply()方法,主要用于Plugin的安装,可以在其中监听一些来自编译器发出的事件,在合适的时机做一些事情。

解决循环依赖问题

Webpack 中将 require 替换为 webpack_require,会根据 moduleId 到 installedModules 找是否加载过,加载过则直接返回之前的 export,不会重复加载。

如何提高Webpack构建速度

1.优化loader配置

module.exports = {module: {rules: [{// 精确正则(如果项目源码中只有 js 文件就不要写成 /\.jsx?$/),提升正则表达式性能test: /\.js$/,// 开启缓存(babel-loader 支持缓存转换出的结果,通过 cacheDirectory 选项开启)use: ['babel-loader?cacheDirectory'],// 缩小搜索目录(只对项目根目录下的 src 目录中的文件采用 babel-loader)include: path.resolve(__dirname, 'src'),},]},
};

2.terser 启动多线程

module.exports = {optimization: {minimizer: [new TerserPlugin({parallel: true, // 启用多线程cache: true // 开启缓存(提升二次构建速度)}),],},
};

3.resolve.modules 配置绝对路径

module.exports = {resolve: {// 若不配置,则会依次查找./node_module、../node_modules,一层一层向上找,这显然效率不高。modules: [path.resolve(__dirname, "node_modules")]}
}

4.resolve.extensions自定义解析确定的扩展

extensions: [".js", ".json"]// 例如: import Index from 'index' 没有写后缀,webpack 会先去找 index.js 文件,在去找 index.json
// 减少无意义的查找

5.resolve.alias 配置别名路径

6.使用fast-sass-loader代替sass-loader

7.CDN加速


码字不易,觉得有帮助的小伙伴点个赞支持下~


扫描上方二维码关注我的订阅号~

Webpack 原理总结归纳面试相关推荐

  1. Webpack原理与实践

    简单了解了几个常用的插件,一般适合用于任何类型的项目,不管是否使用了框架.webpack为每个工作环节都预留了合适的钩子,扩展时只需要找到合适的时机去做合适的事情. 写在前面 webpack插件机制的 ...

  2. 【Java基础】HashMap原理及常见面试题目

    HashMap是Java中最常用的类之一,使用它的时候,有很多小的细节需要大家注意.下面通过他的原理和一些面试题目进行讲解. Java7底层实现 java7中用 HashMap底层算法使用了数组加链表 ...

  3. java流程控制原理与方法_1.从本质上看,计算机控制系统的工作原理可归纳为三个步骤,以下不属这三个步骤的是 ( )。_学小易找答案...

    [单选题]下列语句序列执行后, i 的值是( ); int i =1 ; switch ( i ) { case 1: i++; case 2: i+=2; } [单选题]对于 while语句而言, ...

  4. babel原理_手写webpack核心原理,再也不怕面试官问我webpack原理

    手写webpack核心原理 一.核心打包原理 1.1 打包的主要流程如下 1.2 具体细节 二.基本准备工作 三.获取模块内容 四.分析模块 五.收集依赖 六.ES6转成ES5(AST) 七.递归获取 ...

  5. 深入剖析原理!Android面试你必须要知道的那些知识,吐血整理

    前言 我们程序员之所以担心35岁被裁员,是因为自己的经验和实力能力不符合,国内IT现状,大多数程序员都在外包公司工作,框架老化,代码就是为了完成任务而写,刚定好需求你做一半产品突然让你改需求--一切的 ...

  6. spring 事务原理_Spring声明式事务处理的实现原理,来自面试官的穷追拷问

    公众号[JavaQ]原创,专注分享Java基础原理分析.实战技术.微服务架构.分布式系统构建,诚邀点赞关注! 面试官:有如下代码场景,A类的a1方法没有标注@Transactional注解,a2方法标 ...

  7. 大白话说Java反射:入门、使用、原理,BAT 面试官 如何面试

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 文章 ...

  8. webpack原理和优化

    Webpack打包原理 Webpack 的运行流程是一个串行的过程,从启动到结束会依次执行以下流程: 初始化参数:从配置文件和 Shell 语句中读取与合并参数,得出最终的参数: 开始编译:用上一步得 ...

  9. @transactional注解原理_《Spring源码解析(十二)》深入理解Spring事务原理,告别面试一问三不知的尴尬...

    本文将带领大家领略Spring事务的风采,Spring事务是我们在日常开发中经常会遇到的,也是各种大小面试中的高频题,希望通过本文,能让大家对Spring事务有个深入的了解,无论开发还是面试,都不会让 ...

最新文章

  1. NLP界的「MVP」再次夺冠,刷新GLUE榜单
  2. 心情随笔20180620
  3. 11条建议让你成为优秀的JavaScript程序员
  4. mac p配置android开发,Mac 下配置Android 环境变量
  5. mysql on后加and_mysql加入ON和AND to laravel eloquent
  6. 小米MIXAlpha将首发1亿像素传感器:1/1.33英寸大底业内无敌
  7. Spring Boot 中使⽤ Cache 缓存的使⽤
  8. (c语言)输入两个整数a和n,计算下面表达式的值。Sn=a+aa+aaa+aaaa+.....+aa..aa(n个a)
  9. mysql中CONCAT值为空的问题解决办法
  10. Android SDK上手指南:用户交互
  11. 计算机二级excel经典操作题,计算机二级office经典题库
  12. E盾V60原版网络验证包含个人动手改IP地址源码软件加密一机一码
  13. 红米2电信 android go,超能玩手机:如何让红米2电信版正确支持“全网通”?
  14. JSP-学生管理系统
  15. matlab中如何处理复数,matlab中复数的处理函数
  16. 安卓Android系统超级终端(终端模拟…
  17. [云炬学英语]每日一句2020.8.30
  18. mysql 申请读锁 再申请写锁_MySQL源代码:如何对读写锁进行处理
  19. 中国移动4月底推飞信开放平台
  20. 实时即未来,大数据项目车联网之实时ETL开发的核心逻辑【六】

热门文章

  1. 大一学生关心的问题(二)
  2. Making The Grade G
  3. google翻译 中文文本大量翻译成英文
  4. 手把手教你springboot企业微信开发(三)之 weui、zepto、thymeleaf
  5. 汉字笔画教学控件开发-需求
  6. vue 微信公众号支付接口_vue做微信公众号分享,支付
  7. org.apache.commons.lang3.StringUtils 的相关用法
  8. Diversity Regularized Spatiotemporal Attention for Video-based Person Re-identification 翻译
  9. Deeplab实战:使用deeplabv3实现对人物的抠图
  10. PythonGDAL给图像设置投影坐标系