动手写webpack配置--8.loaders加载器的使用

基于Webpack4.x + npm6.5 + node v10.10.0 +react+ vscode环境.

项目名webpackDemo;

上一节描述了hash值的使用:https://blog.csdn.net/fengsh998/article/details/88087545

本节学习下loaders:官网:https://www.webpackjs.com/loaders/

loader能干嘛,引用官网的描述

loaders
webpack 可以使用 loader 来预处理文件。这允许你打包除 JavaScript 之外的任何静态资源。你可以使用 Node.js 来很简单地编写自己的 loader。

loader 通过在 require() 语句中使用 loadername! 前缀来激活,或者通过 webpack 配置中的正则表达式来自动应用 - 查看配置。

总之,感觉上就是无所不能。

学习几个常见的资源loaders

css-loader: https://www.webpackjs.com/loaders/css-loader/

styte-loader: https://www.webpackjs.com/loaders/style-loader/

url-loader: https://www.webpackjs.com/loaders/url-loader/

file-loader:https://www.webpackjs.com/loaders/file-loader/

css-loader用来加载.css

css-loader 解释(interpret) @import 和 url() ,会 import/require() 后再解析(resolve)它们。
引用资源通常使用合适 loader 是 file-loader和 url-loader。

styte-loader用来将css-loader的样式插入到html中。注意一点,webpack是自下而上解析的。所以style-loader一定要放在css-loader之前。

如果css-loader写在了style-loader之前,可能会出现下面的ERROR


ERROR in ./src/App.css
Module build failed (from ./node_modules/css-loader/dist/cjs.js):
CssSyntaxError

(2:1) Unknown word

  1 | 
> 2 | var content = require("!!./App.css");
    | ^
  3 | 
  4 | if(typeof content === 'string') content = [[module.id, content, '']];

 

 

修改webpack.config.js

...

module.exports = {
    ...
    module: {
        rules: [
        ...
        {
            test: /\.(css)$/,
            use: [
                {
                    loader: 'style-loader'
                },
                {
                    loader: 'css-loader',
                    options: {
                        sourceMap: true
                    }
                }
            ]
        }
        ]
    }
    ...
}

在App.js相同的目录新建一个App.css用来为js组件处理相应的样式。

App.css

.container{
    /* background: #00f; */
    font-size: 2rem;
    color:#00ff00;
}

效果:

增加一个assets文件夹,

增加两个图片。

修改App.css增中一个图片url

.container{
    /* background: #00f; */
    font-size: 2rem;
    color:#00ff00;
    background: url('../assets/bg_1px.jpg')
}

发现提示这个jpg识别不了。因为我们css里使用了url(),可以使用options中的url:false来禁用css-loader对url的解析。

...
                {
                    loader: 'css-loader',
                    options: {
                        url: false,
                        sourceMap: true,
                    }
                }
...

禁用后再次运行。可以看到能跑起来,但设置的背景没有效果。查看console发现加载 404了。

那怎么办呢?我们知道url()可以直接外部资源加载,也可在CSS中作为base64图片流。我前面故意找了两张图,一张大于10k一张小于10k.目的就是想看下加载资源时以何种形式。

同样把webpack.config.js修改为

...

module.exports = {
    ...
    module: {
        rules: [
        ...
        {
            test: /\.(css)$/,
            use: [
                {
                    loader: 'style-loader'
                },
                {
                    loader: 'css-loader',
                    options: {
                        url: true,       /*记得把这个url设置为true*/
                        sourceMap: true,
                    }
                }
            ]
        },
        {
            test: /\.(png|jpg|gif|svg|eot|ttf|woff|woff2)$/,
            loader: 'url-loader',
            options: {
                limit: 10000
            }
        }
        ]
    },
    ...
}

使用url-loader进行加载url()引用的外部资源。其中options 中指定了大小为10k.

可以看到上图中右边的background 的url中已经被转化为base64流的方式引用。这样如果图片较小的情况下,使用这个方式可以减少http下载对服务器造成的压力。

现在换成大图试试

.container{
    /* background: #00f; */
    font-size: 2rem;
    color:#00ff00;
    background: url('../assets/bg_img.jpg')
}

bg_1px.jpg为1像素。

而bg_img.jpg 为39K的一个背图。

重新打包发现报错了。

这是因为大文件外部资源,需要file-loader.这就是为啥前面有提到,但一直没有用。现在才现身。

可以看到成功加载背景图了。

具体的细节 options,请各自参看api。慢慢学啦。我也是边学边做吧。如果发面有错的地方也请指正啦。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

边缘998

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值