webpack 有哪些优化手段(可用于生产环境)?/webpack 提高构建速度的方式
10-1
1. 前端为何要进行打包和构建?
2. module、chunk 和 bundle的区别?
3. loader 和 plugin 的区别?
一、webpack的打包原理
- 识别入口文件
- 通过逐层识别模块依赖(Commonjs、amd或者es6的import,webpack都会对其进行分析,来获取代码的依赖)
- webpack做的就是分析代码,转换代码,编译代码,输出代码
- 最终形成打包后的代码
二、什么是loader
loader是文件加载器,能够加载资源文件,并对这些文件进行一些处理,诸如编译、压缩等,最终一起打包到指定的文件中
- 处理一个文件可以使用多个loader,loader的执行顺序和配置中的顺序是相反的,即最后一个loader最先执行,第一个loader最后执行
- 第一个执行的loader接收源文件内容作为参数,其它loader接收前一个执行的loader的返回值作为参数,最后执行的loader会返回此模块的JavaScript源码
三、什么是plugin
在webpack运行的生命周期中会广播出许多事件,plugin可以监听这些事件,在合适的时机通过webpack提供的API改变输出结果。
四、loader和plugin的区别
对于loader,它是一个转换器,将A文件进行编译形成B文件,这里操作的是文件,比如将A.scss转换为A.css,单纯的文件转换过程
plugin是一个扩展器,它丰富了webpack本身,针对是loader结束后,webpack打包的整个过程,它并不直接操作文件,而是基于事件机制工作,会监听webpack打包过程中的某些节点,执行广泛的任务
4. 常见loader 和 plugin 有哪些?
loader
- babel-loader /.(jsx?|babel|es6)$/
- ts-loader /.tsx?$/
- [‘style-loader’, ‘css-loader’] /.css$/
- postcss-loader
- vue-loader /.vue$/
- url-loader /.(svg|otf|ttf|woff2?|eot|gif|png|jpe?g)(\?\S*)?$/
- image-loader
- json-loader
- svg-inline-loader
- raw-loader
- file-loader
- 校验 eslint-loader \ tslint-loader /.ts$/
- mocha-loader
- i18n-loader
- cache-loder
- sourec-map-loader
- expose-loader
plugin
如何写一个 webpack plugin
知道 webpack 中的 devTool 吗?
为什么有时候配置了 webpack caching,chunk 还是更新了?
10-2
1. babel 和 webpack 的区别?
1. 如何产出一个lib?
1. babel-polyfill 和 babel-runtime 区别?
1. webpack 如何实现懒加载?
1. 为何Proxy 不能被Polyfill ?
10-3
10-4
webpack的构建过程?/webpack生命周期
wbpack微内核源码
webpack 打包分包的依据怎么判定
webpack 原理
webpack 动态加载的原理
webpack 的缺点,让你设计一个新的构建打包工具,你会怎么设计?
HMR
webpack 热更新
关于HMR说法正确的是?(多选)
A.Hot Module Replacement简称HMR,当你对代码进行修改并保存后,webpack 将对代码重新打包,并将新的模块发送到浏览器端,浏览器通过新的模块替换老的模块,这样在不刷新浏览器的前提下就能够对应用进行更新。
B.webpack 可以将不同的模块打包成 bundle 文件或者几个 chunk 文件,但是当我通过 webpack HMR 进行开发的过程中,在dist目录中找不到打包好的文件
C.使用 HMR 的过程中,通过 Chrome 开发者工具我知道浏览器是通过 websocket 和 webpack-dev-server 进行通信的,在websocket 的 message 中可以发现新模块的代码
D.在 webpack HMR 功能之前,已经有很多 live reload 的工具或库,比如 live-server,这些库监控文件的变化,然后通知浏览器端刷新页面,但是live reload 工具并不能够保存应用的状态(states),当刷新页面后,应用之前状态丢失。
答案:A B D
解析:
C 在websocket 的 message 中不会发现新模块的代码,更新模块的代码不直接通过 websocket 发送到浏览器端,而是通过 jsonp 来获取的