加载器 Loader
- loader可以用于对模块的源代码进行转换
- 我们可以将css文件也看成是一个模块,我们是通过import来加载这个模块的
- 在加载这个模块时,webpack其实并不知道如何对其进行加载,我们必须制定对应的loader来完成这个功能
webpack 目前来说只是帮我们打包js文件,其他文件如.css是不认识的。
而通过安装一些加载器Loader,可以帮助webpack认识这些文件,并且一起打包。
webpack 4
css-loader
作用
识别css文件并打包
但是要配合style-loader使用,否则只是识别css文件,但还是无法生效
1、安装
npm install css-loader -D
2、配置
style-loader
作用
- 我们已经可以通过css-loader来加载css文件了
- 但是你会发现这个css在我们的代码中并没有生效(页面没有效果)
这是为什么呢?
那么我们应该如何使用style-loader
- 在配置文件中,添加style-loader
- 注意:因为loader的执行顺序是从右向左(或者说从下到上,或者说从后到前的),所以我们需要将style-loader写到css-loader的前面

重新执行编译
npm run build,可以发现打包后的css已经生效了PostCSS是一个通过JavaScript来转换样式的工具
- 这个工具可以帮助我们进行一些CSS的转换和适配,比如自动添加浏览器前缀、css样式的重置
- 但是实现这些功能,我们需要借助于PostCSS对应的插件
如何使用PostCSS呢?主要就是两个步骤
- 查找PostCSS在构建工具中的扩展,比如webpack中的postcss-loader
- 第二步:选择可以添加你需要的PostCSS相关的插件
1、安装
npm install postcss-loader -D
2、安装插件 autoprefixer (可被替代)
这个插件是自动给css加上浏览器前缀,前缀是为了更好适配各种浏览器,如谷歌、火狐、苹果浏览器等
3、配置


也可以单独把配置抽取到外面,这样这里的代码就不用那么复杂
2、安装插件 postcss-preset-env
- 我们可以使用另外一个插件: postcss-preset-env
- postcss-preset-env也是一个postcss的插件
- 它可以帮助我们将一些现代的CSS特性,转成大多数浏览器认识的CSS,并且会根据目标浏览器或者运行时环境添加所需的polyfill
- 也包括会自动帮助我们添加autoprefixer(所以相当于已经内置了autoprefixer )
npm install postcss-preset-env -D
3、配置

file-loader 图片
作用
打包文件,如图片
要处理jpg.png等格式的图片,我们也需要有对应的loader : file-loader
file-loader的作用就是帮助我们处理import/require()方式引入的一个文件资源,并且会将它放到我们输出的文件夹中
当然如何修改它的名字和所在文件夹
常用图片有2种方式
(1)img标签,设置src属性

注意,不能直接imgEl.src = “路径”,这样保存的只是字符串,并不会识别成文件
(2)其他元素如div,设置background-image的css属性;
1、安装
npm install file-loader -D
2、配置

3、打包
会发现随机给我们生成文件的名字,然后放在输出的文件夹内
4、命名规则
- 有时候我们处理后的文件名称按照一定的规则进行显示
- 比如保留原来的文件名、扩展名,同时为了防止重复,包含一个hash值等﹔
- 这个时候我们可以使用PlaceHolders来完成,webpack给我们提供了大量的PlaceHolders来显示不同的内容
- https://webpack.js.org/loaders/file-loader/#placeholders
- 可以在文档中查阅自己需要的placeholder
- 几个最常用的placeholder
- [ext]:处理文件的扩展名
- [name]:处理文件的名称
- [hash]:文件的内容,使用MD4的散列函数处理,生成的一个128位的hash值 ( 32个十六进制)
- [contentHash] :在file-loader中和[hash]结果是一致的(在webpack的一些其他地方不一样,后面会讲到)[hash:
]:截图hash的长度,默认32个字符太长了 - [path]:文件相对于webpack配置文件的路径

file-loader 字体/字体图标
如果我们需要使用特殊的字体或者字体图际,那么我们会引入很多字体相关的文件,这些文件的处理也是一样的
首先,从阿里图标库中下载了几个字体图标
在component中引入,并且添加一个i标签用于显示字体图标
设置class

url-loader
作用
url-loader和file-loader的工作方式是相似的,但是可以将较小的文件,转成base64的URI。
base64就是一段文本的代码,一起打包到bundle.js里面,浏览器通过解释这段代码生成图片,这样的好处是减少图片的请求次数,缺点就是增加了单个文件的大小,牺牲了浏览器性能。

(浏览器引用)
比较适合文件小的而且数量很多的图片文件,因为每一个小图片就是一次网络请求,数量多的话对服务器压力大;
图片大的也可以,但没必要,这样会影响bundle.js 这个文件的大小,下载js代码慢,用户要很久才能看到代码执行。
1、安装
npm install url-loader -D
2、配置
3、limit属性
- 但是开发中我们往往是小的图片需要转换,但是大的图片直接使用图片即可
- 这是因为小的图片转换base64之后可以和页面一起被请求,减少不必要的请求过程
- 而大的图片也进行转换,反而会影响页面的请求速度
- 那么,我们如何可以限制哪些大小的图片转换和不转换呢?
- url-loader有一个options属性limit,可以用于设置转换的限制
- 下面的代码38kb的图片会进行base64编码,而295kb的不会
babel-loader
作用
帮我们把代码做一定的转换,比如ES6+转成ES5,这样兼容更多的浏览器。
也可以查看:https://www.yuque.com/yejielin/mypn47/zu6tft#TAZRU
1、安装
npm install babel-loader @babel/core
如果之前已经安装了@babel/core,那么这里不需要再次安装;
2、配置
3、安装和使用插件
4、预设
如果我们一个个去安装使用插件,那么需要手动来管理大量的babel插件,我们可以直接给webpack提供一个preset,webpack会根据我们的预设来加载对应的插件列表,并且将其传递给babel。
- 常见的预设
- env
- react
- TypeScript
安装preset-env
npm install @babel/preset-env
webpack 5
- 我们当前使用的webpack版本是webpack5
- 在webpack5之前,加载这些资源我们需要使用一些loader,比如raw-loader 、url-loader、file-loader
- 在webpack5开始,我们可以直接使用资源模块类型( asset module type ),来替代上面的这些loader ;
- 资源模块类型(asset module type),通过添加4种新的模块类型,来替换所有这些loader
- asset/resource 发送一个单独的文件并导出 URL。之前通过使用file-loader实现
- asset/inline 导出一个资源的data URI。之前通过使用url-loader实现;
- asset/source 导出资源的源代码。之前通过使用raw-loader实现;
- asset在导出一个data URI和发送一个单独的文件之间自动选择。之前通过使用url-loader,并且配置资源体积限制实现;
也就是webpack5内置了很多常用的loader,让用户不用再下载和配置那么多,体验更好
如url-loader里面关于文件大小的打包和限制



