写在开始的话
嗨!你们好吗?
今天要来写一些关于webpack问答,之前在学习Vue.js的时候,对于webpack的了解不是很深入,这篇也作为Vue.js的项目实战的补充内容,同时作为前端面试中,一些问答汇总来看,也是极好的。
##问题汇总
- 对于webpack的了解
- webpack的工作原理
- 除了webpack还有哪些打包工具
- webpack常用的插件?
- webpack怎么提取公共模块
- webpack,里面的webpack.config.js怎么配置
- webpack热更原理
- gulp和webpack的区别?(模块与流,CommonChunks抽出公共模块)
- webpack路由懒加载
webpack的了解
本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,包括Web开发中所用到的HTML、Javascript、CSS以及各种静态文件(图片、字体等),有写人的脚本开发语言可能是 CoffeeScript 或者是 TypeScript,样式开发工具可能是 Less 或者 Sass,这都需要工具把它们“编译”成浏览器能识别 Javascript 和 CSS。 让开发过程更加高效。它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。
从 webpack v4.0.0 开始,可以不用引入一个配置文件。然而,webpack 仍然还是高度可配置的。在开始前你需要先理解四个核心概念:
- 入口(entry)
- 输出(output)
- loader
- 插件(plugins)
详情参见webpack官方网站,概念就不再这多解释了。
webpack的工作原理
webpack 是一款目前非常流行的前端模块打包工具,可以将项目中所加载的模块进行打包,以及将 一些浏览器不支持的语言进行转换。
webpack 的打包原理是 先找到入口文件,递归探索出所有依赖的模块,最后 利用 Loader 进行不同文件类型的处理,打包成一个 Javascript 文件。
其中,webpack 的两个最核心原理分别是:
- 一切皆模块
- 按需加载
当然 webpack 的作用不止加载模块这么简单,前端的常用需求通常都可以实现:利用 Loader 转换 es6 、 Less 、 Typescript ,还可利用插件 开发多页面应用,等等诸多强大功能。
除了webpack还有哪些打包工具
#####Grunt
简而言之,就是运行在Node.js上面的任务管理器(task runner),其可以在任何语言和项目中自动化指定的任务。我们可通过npm来安装Grunt和Grunt插件 。
#####Gulp
gulp是一个前端自动化构建工具,通过代码优于配置的策略,Gulp 让简单的任务简单,复杂的任务可管理。
#####Fuse Box
Fuse Box是一款快速的捆绑器/模块加载器,实用了一下打包速度超快,但是配置还是很麻烦,懒加载等一些好像有所缺失。
#####Parcel
Parcel 使用 worker 进程开启多核编译,同时支持文件系统缓存,即使在重启后也能快速再次编译。 Parcel 将会分拆输出文件,因此你只需要在初次加载时加载必要的代码。
#####Rollup
Rollup 是一个 JavaScript 模块打包器,可以将小块代码编译成大块复杂的代码,例如 library 或应用程序。Rollup 对代码模块使用新的标准化格式,这些标准都包含在 JavaScript 的 ES6 版本中,而不是以前的特殊解决方案,如 CommonJS 和 AMD。
webpack常用的插件?
常用内置插件
UglifyJsPlugin
解析/压缩/美化所有的js chunk,传入 options 可以满足更多的定制化需求。
DedupePlugin
有些JS库有自己的依赖树,并且这些库可能有交叉的依赖,DedupePlugin可以找出他们并删除重复的依赖。
ExtractTextPlugin
该插件会提取entry chunk中所有的require('*.css')
,分离出独立的css文件。
其他可参见官方插件和Awesome Webpack
webpack怎么提取公共模块
webpack提取公共模块CommonsChunkPlugin插件,是一个可选的用于建立一个独立文件(又称作 chunk)的功能,这个文件包括多个入口 chunk 的公共模块。通过将公共模块拆出来,最终合成的文件能够在最开始的时候加载一次,便存到缓存中供后续使用。这个带来速度上的提升,因为浏览器会迅速将公共的代码从缓存中取出来,而不是每次访问一个新页面时,再去加载一个更大的文件。
webpack,里面的webpack.config.js怎么配置
webpack.config.js
1 | module.exports = { |
webpack热更原理
webpack的刷新是用模块热替换(hot module replacement)来实现的。
模块热替换(HMR - Hot Module Replacement)功能会在应用程序运行过程中替换、添加或删除模块,而无需重新加载整个页面。主要是通过以下几种方式,来显著加快开发速度:
- 保留在完全重新加载页面时丢失的应用程序状态。
- 只更新变更内容,以节省宝贵的开发时间。
- 调整样式更加快速 - 几乎相当于在浏览器调试器中更改样式。
如图
Webpack编译期,为需要热更新的 entry 注入热更新代码(EventSource通信)
页面首次打开后,服务端与客户端通过 EventSource 建立通信渠道,把下一次的 hash 返回前端
客户端获取到hash,这个hash将作为下一次请求服务端 hot-update.js 和 hot-update.json的hash
修改页面代码后,Webpack 监听到文件修改后,开始编译,编译完成后,发送 build 消息给客户端
客户端获取到hash,成功后客户端构造hot-update.js script链接,然后插入主文档
hot-update.js 插入成功后,执行hotAPI 的 createRecord 和 reload方法,获取到 Vue 组件的 render方法,重新 render 组件, 继而实现 UI 无刷新更新。
gulp和webpack的区别?
(此问题需要更新深入)
gulp
是工具链、构建工具,可以配合各种插件做js压缩,css压缩,less编译 替代手工实现自动化工作
1.构建工具
2.自动化
3.提高效率用
webpack
是文件打包工具,可以把项目的各种js文、css文件等打包合并成一个或多个文件,主要用于模块化方案,预编译模块的方案
1.打包工具
2.模块化识别
3.编译模块代码方案用
webpack路由懒加载
对于大型的web 应用而言,把所有的代码放到一个文件的做法效率很差,特别是在加载了一些只有在特定环境下才会使用到的阻塞的代码的时候。Webpack有个功能会把你的代码分离成Chunk,后者可以按需加载。这个功能就是Code Spliiting
Code Spliting的具体做法就是一个分离点,在分离点中依赖的模块会被打包到一起,可以异步加载。一个分离点会产生一个打包文件。
为了不让用户一次加载整个大文件,稍微好点的做法是让用户分开一次一次加载文件。 正好Code Splitting可以把在分离点中依赖的模块会被打包到一起,然后异步加载。
Vue和React都提供了各自的懒加载解决方案。可参见各自的文档。