上一篇讲了webpack配置Html模板和css文件的方法,配置Html模板需要用到html-webpack-plugin
插件,可以选择一个静态html文件作为模板;而配置css文件分为使用<style></style>
标签插入样式和使用link
方式引入css文件,这里面依次要使用到css-loader
、style-loader
和less-loader
(根据css预处理语言的不同)。webpack.config.js
文件的配置项比较多,比较复杂,需要我们根据不同的场景去查阅相应的文档去实现功能。今天这篇我们继续来讲webpack4.0
的配置。
清理dist文件夹
开始之前我们先来配置clean-webpack-plugin
插件,这个插件的作用是在每次生成dist
文件的时候先将该文件夹清空,然后再生成新的静态文件:
1 | npm i clean-webpack-plugin -D |
安装完后进行简单的配置:
1 | ... |
这样每次运行npm run build
就不会重复在dist文件夹内生成文件了。
webpack-dev-server
为了方便我们本地调试代码,我们抽两分钟时间来具体配置一下webpack-dev-sever
,上一篇的时候我们已经安装好了webpack-dev-server
,我们现在做以下配置:
1 | module.exports = { |
具体其他配置可以去查看文档,以上的配置已经足够我们来使用。
还有一点要注意的是,webpack4.0
新增了mode
配置,可选development
/production
两种模式,还记得vue
脚手架里面的webpack.dev.conf.js
和webpack.prod.conf.js
吗?就是为了区分不同的模式进行了配置的拆分,现在4.0
加入mode
选项,也是对社区最优选择的一种肯定,接下来会再写博客单独对这里进行探究。
图片资源的配置
处理图片的时候,我们需要另外的loader
,先使用npm安装:
1 | npm i url-loader file-loader -D |
先来说下这两个loader
的区别,file-loader
可以解析项目中的url引入(不仅限于css),根据我们的配置,将图片拷贝到相应的路径,修改打包后文件引用路径,使之指向正确的文件。url-loader
相当于file-loader
的又一层封装,且url-loader
可以单独使用,不必依赖于file-loader
,url-loader
的作用是在图片大小小于limit
值的时候将图片转为base64
图片,大于limit
的时候使用file-loader
来处理图片,这样可以减少图片的http
请求数量。来看看例子:
1 | module: { |
写到这里的时候其实卡了很久,卡在了publicPath
和样式内引入图片的问题(background-image),这个后面可能会单独拿出来讲一下path
和publicPath
的区别和作用,涉及到了后台部署前端代码的一些问题,需要好好研究一番。
不光图片资源,我们的视频文件和字体文件也使用到了file-loader
/url-loader
,可以参照vue
脚手架的设置:
1 | ... |
除了css内引入图片,我们也会在html文件内使用<img src="img/a.png" />
或者内联样式的background
来引入图片,这时候我们可以使用html-withimg-loader
来处理这种情况:
1 | npm i html-withimg-loader -D |
在webpack.config.js
内配置:
1 | { |
值得注意的是,该loader
在NPM
上已经有2年多没有更新了,而且在vue
的脚手架内也没有找到这个loader
的影子,那vue
内是如何处理html内的图片的呢?留待研究。
ES6转义
说完了图片资源的处理,我们来说一下对ES6
代码的处理,也就是最重要的babel-core
、babel-loader
和babel-preset-env
。这3个包是用来将ES6
代码转为ES5
的,方便兼容低版本浏览器的同时,也不影响我们使用最新的ES6
去撸代码。首先安装:
1 | npm i babel-core babel-loader babel-preset-env -D |
其中,babel-preset-env
功能比较强大,可以指定我们的代码转义后需要兼容什么版本的浏览器,什么类型的浏览器等,配置项比较多,一般会将该配置单独另起一个.babelrc
文件来存放。我们在根目录下新建一个.babelrc
文件:
1 | { |
可以看到,转义后的es6代码支持浏览器份额大于1%,最近两个版本,且不是ie8以下。
在webpack.config.js
内:
1 | module: { |
注意,exclude
优先级高于include
。
写到这里,我们对webpack4.0
的基本概念已经有了一个基本的认识,可以说我们已经入门了!不再一提webpack
打包就一头雾水,手忙脚乱了。剩下的一些知识如resolve
、热更新
等概念,遇到了,不清楚,立马查文档,基础架子有了,剩下的就是加深理解了。
最后算下欠的账:一篇关于开发和生产模式的研究,一篇关于path
和publicPath
区别的博客,还有关于webpack更深入的一些知识总结,嗯,未完待续…