【你应该掌握的】webpack4介绍&配置项详解
作为一名前端开发,按时按质实现业务需求只是基础条件,了解一些webpack相关的配置,除了能够帮助我们提升一下自己的技术能力,也能够帮助我们更好的维护项目、搭建适合自己团队的web站点。
希望通过本文能让大家对webpack4的相关配置项有一个直观的了解,以例子的形式帮助大家更好&更快的掌握相关知识点。
webpack4介绍
- webpack是一个JS应用打包器,它将应用中的各个模块打成一个或者多个bundle文件。借助loaders和plugins,它可以改变、压缩和优化各种各样的文件。它的输入是不同的资源,比如:js、css、图片、字体和html文件等等,然后将它们输出成浏览器可以正常解析的文件。
- 2018.8.25,正式发布webpack4,相比于webpack3,带来很多的新特性更新和改善,让webpack配置更加简单
- webppack4是目前比较主流打包工具之一,跟其他的打包工具相比,比如gulp,rollup等,webpack4优势:社区活跃度高,使用的人多,官方更新迭代快速。
webpack4配置项
准备工作
- 安装node,webpack,然后新建文件夹–npm初始化
1 | //webpack安装一般是不-g全局安装的,因为同时会进行好几个项目,有时候这几个项目的webpack版本都是不一样的,因此都是根据项目来局部安装,只在独立的项目中有效。 |
mode属性
- mode属性可以设置为:development(代码不压缩)/production(代码压缩),在开发模式的时候可以提供更加详细的错误日志和提示,在生产环境打包的时候可以webpack专注项目的打包,去除掉开发阶段的运行的代码,是打包的生产环境的包文件更小。
entry/output
- 入口和打包成功的出口–基本配置
1 | //webpack打包的时候会默认找webpack.config.js文件 |
- 代码演示—1
1 | npx webpack -v |
- 代码运行成功后–package.json中的默认配置,npm webpack index.js成功后生成后,Hash–唯一的hash值,version–webpack版本,Time–打包耗费的时间,built中,asset–打包后的文件,size–打包文件的大小,chunks–每个打包文件对应的id值,chunk Names–打包文件名,main–对应着打包入口文件
loader
- 什么是loader,webpack对不是js后缀的文件是不能进行处理的,这时候需要借助loader,loader其实就是一个打包方案,webpack对不是js后缀的文件不知道怎么去打包,但是loader是知道的,所以这时候webpack就要依赖loader来执行打包文件。
- file-loader 图片/字体文件打包loader,这时候需要在webpack.config.js中增加图片/字体打包规则
1 | //webpack.config.js |
- url-loader 其包含了file-loader的图片打包的功能,区别:就是不加任何配置项的时候,默认把图片打包成base64字符放在打包的js文件中,优势,加载js文件完成之后图片也加载好了,减少一次http请求,不好的地方就是当图片文件过大的时候,那么被放入图片的打包js文件也会很大,那么在加载技js文件的时候,加载耗时较长,也面回停留空白页的时间过长,因此增加配置项limit,
1 | rules: [ |
- 代码演示–2 –使用url前后加了limit配置之后的对比
1 | //使用file-loader ,url-loader 需要安装 |
style-loader css-loader sass-loader postcss-loader
- 同样的对css,scss打包的时候,webpack都是不知道怎么去打包,所以需要借助相关的loader来执行打包,要同时安装css-loader,style-loader,css-loader只负责处理css文件,在得到css-loader处理并且合并之后的css内容文件时,需要使用style-loader挂在到页面header部分,这样样式的打包才会在页面生效,同样的如果sass文件时,还需要安装sass-loader,node-sass ,因为sass-loader是依赖于node-sass来执行解析sass文件的,所以执行顺序是,先是sass-loader将scss文件解析成css文件,其次css-loader处理这些被解析成的css文件,然后再有style-loader将这些内容挂在到页面的header部分,postcss-loader就是增加厂商前缀的,是最先执行的。
1 | //安装loader |
- 代码演示–3
plugins
- html-webpack-plugin: 作用就是帮我们自动生成一个html,并且把打包好生成的js文件引入到html中,同时可以在src目录下创建一个html模板,然后可以设置配置项,根据这个html模板自动生成html放在dist目录下,,在打包完成之后开始执行
- clean-webpack-plugin:作用就是把之前打包的dist目录删除掉,这个是在打包之前开始执行的
1 | //首先安装html-webpack-plugin hlean-webpack-plugin |
- 代码演示 – 4 TypeError: CleanWebpackPlugin is not a constructor
1 | //所以引用这个插件必须要使用对象结构 |
sourceMap的配置
- 这个是什么呢?,这个配置就是帮我们做一个打包之后和源代码之间的一个映射关系,当打包的时候出现问题的时候,我们并不是要知道打包文件哪一行出现错误,而是要知道源代码的哪一行出现错误。
1 | //webpack.config.js |
webpackDevServer
- 可以帮我们监听文件的改动,还可以模拟服务器的一些特性,一旦src目录下的内容发生改变就会自动帮我们打包文件并且自动刷新页面,
1 | //先安装webpack-dev-server |
Hot Module Replace–HMR:热更新模块
- 使用webpack-dev-server启动项目,帮我们启动一个本地服务器,并且还会自动帮我们打包,打包文件是放在内存当中,这样打包的速度更快,性能更好。
- webpack自带的一个热更新模块插件 –HotModuleReplacementPlugin,但是作用于css和js的过程中,相交于css热更新,js需要多一下代码,原因是css-loader已经帮我们写好了,像vue框架热更新也是一样,已经内置已经写好的代码,react框架也是借助babel的preset的配置来处理的
1 | // weebpack.config.js |
- 代码演示–5
- sourceMap
babel处理es6语法
- 对于普通浏览器目前是不支持es6语法的,但是支持es5语法代码,因此需要借助babel插件来做转换,这里可以查Babel的官方文档—这里省略一万步—这里面有使用场景的选择–选择webpack使用场景
1 | //安装插件 --@babel/core是babel核心库 |
webpack实现对react框架代码的打包
- 需要借助@babel/preset-react插件,在转换react框架代码之后还是要插件@babel/preset-env转换es6语法。
1 | //使用安装插件 |
Tree shaking
- 作用:这是webpack自带的一个功能,当引入一个模块的时候,不需要引入全部的代码,只需要引入被需要的代码,–就是摇树的意思,把不必要的叶子全部摇掉。
- 但是webpack中的tree shaking仅支持esmodule这种引入方式。
1 | //webpack.config.js |
development和production模式的区分打包,webpack.dev.js,webpack.pord.js,webpack.common.js –可以把文件放到build文件中
1 | //需要下载 webpack-merge |
- 代码演示 -6
webpack和code Splitting:
- 代码分割是webpack相当重要的一个特性,可以让代码分割到不同的文件中,一边按需加载或者并行加载这些文件,这样可以优化加载性能,以及用户体验会更好。
- 代码分割其实只是在webpack中去实现代码分割,两种方式,同步代码分割只需optimization中配置即可,异步代码分割,webpack代码分割默认配置就是对异步代码进行代码分割,但是需要babel插件来做翻译,浏览器对异步的这种语法规则不支持。
1 | //异步代码分割,安装babel插件,babel-plugin-dynamic-import-webpack |
- splitChunksPlugin的底层配置中,异步代码会自动打包成一个文件0.js,这里需要指定引入异步代码文件的名字可以使用魔法注释,这里就需要这个插件@babel/plugin-syntax-dynamic-import来做异步代码的转化,不能使用上面那个插件babel-plugin-dynamic-import-webpack,/webpackChuunkName:‘lodash’/,
- chunks:aysnc这种异步代码可以解决打包文件过大,加载时间过长,分出第三方库和插件,需要的时候在进行按需加载和并行加载,提供加载性能。
1 | npm install @babel/plugin-syntax-dynamic-import --save-dev |
- lazy loading—就是支持esmodule这种语法,按需加载。
- css代码分割: filename与chunkFilename区别:官网的代码分割插件:做的事情就是把css文件单独打包,不直接打包到js文件里面,这个插件不支持HMR,所以css代码分割插件一般应用到生产环境.
1 | //安装插件 |