什么是 Webpack? Webpack详解

1、什么是 Webpack

        
   基本定义
        Webpack 是一个打包模块化 javascript 的工具,在 Webpack 里一切文件皆模块,通过
loader 转换文件,通过 plugin 注入钩子,最后输出由多个模块组合成的文件,Webpack 专注构建
模块化项目,Webpack 可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript 模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript 等),并将其打包为合适的格式以供浏览器使用

2、Webpack 的优点是什么?

        
        1、专注于处理模块化的项目,能做到开箱即用,一步到位
        2、通过 plugin 扩展,完整好用又不失灵活
        3、使用场景不局限于 web 开发
        4、社区庞大活跃,经常引入紧跟时代发展的新特性,能为大多数场景找到已有的开源扩展
        5、提供了更好的开发体验

3、Webpack 的构建流程是什么?从读取配置到输出文件这个过程

     Webpack 的运行流程是一个串行的过程,从启动到结束会依次执行以下流程:
          
        1、初始化参数:从配置文件和 Shell 语句中读取与合并参数,得出最终的参数
        2、开始编译:用上一步得到的参数初始化 Compiler 对象,加载所有配置的插件,执行对
        象的 run 方法开始执行编译
        3、确定入口:根据配置中的 entry 找出所有的入口文件
        4、编译模块:从入口文件出发,调用所有配置的 Loader 对模块进行翻译,再找出该模块
        依赖的模块,再递归本步骤直到所有入口依赖的文件都经过了本步骤的处理
        5、完成模块编译:在经过第 4 步使用 Loader 翻译完所有模块后,得到了每个模块被翻译
        后的最终内容以及它们之间的依赖关系
        6、输出资源:根据入口和模块之间的依赖关系,组装成一个个包含多个模块的 Chunk,再
        把每个 Chunk 转换成一个单独的文件加入到输出列表,这步是可以修改输出内容的最后机会
        7、输出完成:在确定好输出内容后,根据配置确定输出的路径和文件名,把文件内容写入
        到文件系统,在以上过程中,Webpack 会在特定的时间点广播出特定的事件,插件在监听到感兴趣的事件后会执行特定的逻辑,并且插件可以调用 Webpack 提供的 API 改变 Webpack的运行结果

4、Webpack 的热更新原理

        
        1、基本定义
                Webpack 的热更新又称热替换(Hot Module Replacement),缩写为 HMR。这个机制可以做到不用刷新浏览器而将新变更的模块替换掉旧的模块。
        2、核心定义
                2,1)HMR 的核心就是客户端从服务端拉去更新后的文件,准确的说是 chunk diff (chunk需要更新的部分),实际上 WDS 与浏览器之间维护了一个 websocket,当本地资源发生变化时,WDS 会向浏览器推送更新,并带上构建时的 hash,让客户端与上一次资源进行对比
                2,2)客户端对比出差异后会向 WDS 发起 Ajax 请求来获取更改内容(文件列表、hash)这样客户端就可以再借助这些信息继续向 WDS 发起 jsonp 请求获取该 chunk 的增量更新
                2,3)后续的部分(拿到增量更新之后如何处理?哪些状态该保留?哪些又需要更新?) 由 HotModulePlugin 来完成,提供了相关 API 以供开发者针对自身场景进行处理,像 react-hot-loader 和 vue-loader 都是借助这些 API 实现 HMR

5、Webpack 与 grunt、gulp 的不同?

        
        1、三者之间的区别
                三者都是前端构建工具,grunt 和 gulp 在早期比较流行,现在 Webpack 相对来说比较主流,不过一些轻量化的任务还是会用 gulp 来处理,比如单独打包 CSS 文件等
                1,1)grunt 和 gulp 是基于任务和流(Task、Stream)的。类似 jQuery,找到一个(或一 类)文件,对其做一系列链式操作,更新流上的数据, 整条链式操作构成了一个任务,多个任
务就构成了整个 web 的构建流程。
                1,2)Webpack 是基于入口的。Webpack 会自动地递归解析入口所需要加载的所有资源文件,然后用不同的 Loader 来处理不同的文件,用 Plugin 来扩展 Webpack 功能。
        2、构建思路的区别
                2,1)gulp 和 grunt 需要开发者将整个前端构建过程拆分成多个`Task`,并合理控制所有
`Task`的调用关系
                2,2)Webpack 需要开发者找到入口,并需要清楚对于不同的资源应该使用什么 Loader
做何种解析和加工
        3、 从知识背景区别
                3,1)gulp 更像后端开发者的思路,需要对于整个流程了如指掌
                3,2)Webpack 更倾向于前端开发者的思路

6、如何利用 Webpack 来优化前端性能

        1、压缩代码。uglifyJsPlugin 压缩 js 代码, mini-css-extract-plugin 压缩 css 代码
        2、利用 CDN 加速,将引用的静态资源修改为 CDN 上对应的路径,可以利用 Webpack 对
        于 output 参数和 loader 的 publicpath 参数来修改资源路径
        3、删除死代码(tree shaking),css 需要使用 Purify-CSS
        4   提 取 公 共 代 码 。 Webpack4 移 除 了 CommonsChunkPlugin ( 提 取 公 共 代 码 )用optimization.splitChunks 和 optimization.runtimeChunk 来代替

7、使用 Webpack 开发时,有哪些可以提高效率的插件?

        1、Webpack-dashboard:可以更友好的展示相关打包信息。
        2、Webpack-merge:提取公共配置,减少重复配置代码
        3、speed-measure-Webpack-plugin:简称 SMP,分析出 Webpack 打包过程中 Loader 和
        Plugin 的耗时,有助于找到构建过程中的性能瓶颈
        4、size-plugin:监控资源体积变化,尽早发现问题
        5、HotModuleReplacementPlugin:模块热替换

8、什么是长缓存?在 Webpack 中如何做到长缓存优化?

        1、什么是长缓存

         浏览器在用户访问页面的时候,为了加快加载速度,会对用户访问的静态资源进行存储,但是每一次代码升级或者更新,都需要浏览器去下载新的代码,最方便和最简单的更新方式就是引入新的文件名称

        2、具体实现     

        在 Webpack 中,可以在 output 给出输出的文件制定 chunkhash,并且分离经常更新的代码和框架代码,通过 NameModulesPlugin 或者 HashedModulesPlugin 使再次打包文件名不变

9、如何提高 Webpack 的构建速度?

        在多入口情况下,使用 CommonsChunkPlugin 来提取公共代码
        1、通过 externals 配置来提取常用库
        2、利用 DllPlugin 和 DllReferencePlugin 预编译资源模块 通过 DllPlugin 来对那些我们引用但是绝对不会修改的 npm 包来进行预编译,再通过 DllReferencePlugin 将预编译的模块加载来。
        3、使用 Happypack 实现多线程加速编译
        4 、 使 用 Webpack-uglify-parallel 来 提 升 uglifyPlugin 的 压 缩 速 度 。原 理 上 Webpack-uglify-parallel 采用了多核并行压缩来提升压缩速度
        5、使用 Tree-shaking 和 Scope Hoisting 来剔除多余代码

10、怎么实现 Webpack 的按需加载?什么是神奇注释?

        1、按需加载
                在 Webpack 中,import 不仅仅是 ES6 module 的模块导入方式,还是一个类似 requir的函数,我们可以通过 import('module')的方式引入一个模块,import()返回的是一个 Promise 对象; 使用 import()方式就可以实现 Webpack 的按需加载
        2、神奇注释
                在 import()里可以添加一些注释,如定义该 chunk 的名称,要过滤的文件,指定引入 的文件等等,这类带有特殊功能的注释被称为神器注释
  • 43
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值