zoukankan      html  css  js  c++  java
  • webpack学习笔记(五)

    Loader是什么?

    Loader配置

    Loader是解析处理器,通过loader我们可以将ES6语法的JS转化为ES5的语法,可以将图片转化为base64的dataURL,在JavaScript文件中直接import css和HTML也是通过对应的loader来实现的。

    我们在使用loader之前,需要先安装它,例如,我们要在javaScript中引入less,则需要安装less-loader

    然后在module.rules中指定*.less文件都是用less-loader:

    module.exports = {

        module:{

            rules:[

                test: /.less$/,

               use:'less-loader'

            ]

        }

    }

    简单来理解上面的配置,test项使用 /.less$/正则匹配需要处理的模块文件(即 less 后缀的文件),然后交给less-loader来处理,这里的less-loader是个 string,最终会被作为require()的参数来直接使用。

    这样 less 文件都会被less-loader处理成对应的 css 文件。

    除了直接在webpack.config.js使用 loader 的方式之外,还可以在对应的 JavaScript 文件中使用 loader:

    const html = require('html-loader!./loader.html');

    console.log(html);

    上面的代码,实际是将loader.html的内容转化成 string 变量,直接给输出了,等同于:

    const html = require('./loader.html');

    console.log(html);

    加上下面配置的效果:

    module.exports = {

        module: {

            rules: [{test: /.html$/, use: ['html-loader']}]

        }

    };

    如果没有 html-loader,直接require一个 html 文件,会被当作 js 模块来执行,则会报错:

    Tips:require('html-loader!./loader.html')中!类似 Unix 系统中命令行的管道,这里!隔开的命令是从右到左解析的,即先加载loader.html然后在将加载的文件内容传给html-loader处理。

    综上,loader 有两种配置方式:

    1. 使用 webpack.config.js 的配置方式:

    module.exports = {

        module: {

            rules: [{test: /.html$/, use: ['html-loader']}]

        }

    };

    1. 在 JavaScript 文件内使用内联配置方式:

    const html = require('html-loader!./loader.html');

    // or

    import html from 'html-loader!./loader.html';

    Tips:use 中传递字符串(如:use: ['style-loader'])是 loader 属性的简写方式(如:use: [{loader: 'style-loader'}])

    Loader 的参数

    给 loader 传参的方式有两种:

    1. 通过options传入
    2. 通过query的方式传入:
    // inline内联写法,通过 query 传入
    const html = require("html-loader?attrs[]=img:src&attrs[]=img:data-src!./file.html");
    // config内写法,通过 options 传入
    module: {
        rules: [{
            test: /.html$/,
            use: [{
                loader: 'html-loader',
                options: {
                    minimize: true,
                    removeComments: false,
                    collapseWhitespace: false
                }
            }]
        }]
    }
    // config内写法,通过 query 传入
    module: {
        rules: [{
          test: /.html$/,
          use: [ {
            loader: 'html-loader?minimize=true&removeComments=false&collapseWhitespace=false',
          }]
        }]
    }

    Loader 的解析顺序

    对于一些类型的模块,简单配置一个 loader 是不能够满足需求的,例如 less 模块类型的文件,只配置了 less-loader 仅仅是将 Less 语法转换成了 CSS 语法,但是 JS 还是不能直接使用,所以还需要添加css-loader来处理,这时候就需要注意 Loader 的解析顺序了。前面已经提到了,Webpack 的 Loader 解析顺序是从右到左(从后到前)的,即:

    // query 写法从右到左,使用!隔开
    const styles = require('css-loader!less-loader!./src/index.less');
    // 数组写法,从后到前
    module.exports = {
        module: {
            rules: [
                {
                    test: /.less$/,
                    use: [
                        {
                            loader: 'style-loader'
                        },
                        {
                            loader: 'css-loader'
                        },
                        {
                            loader: 'less-loader'
                        }
                    ]
                }
            ]
        }
    };

    如果需要调整 Loader 的执行顺序,可以使用enforceenforce取值是pre|postpre表示把放到最前,post是放到最后:

    use: [
        {
            loader: 'babel-loader',
            options: {
                cacheDirectory: true
            },
            // enforce:'post' 的含义是把该 loader 的执行顺序放到最后
            // enforce 的值还可以是 pre,代表把 loader 的执行顺序放到最前
            enforce: 'post'
        }
    ];

    oneOf:只应用第一个匹配的规则

    oneOf表示对该资源只应用第一个匹配的规则,一般结合resourceQuery,具体代码来解释:

    module.exports = {
        //...
        module: {
            rules: [
                {
                    test: /.css$/,
                    oneOf: [
                        {
                            resourceQuery: /inline/, // foo.css?inline
                            use: 'url-loader'
                        },
                        {
                            resourceQuery: /external/, // foo.css?external
                            use: 'file-loader'
                        }
                    ]
                }
            ]
        }
    };
  • 相关阅读:
    js获取数组最大值或最小值
    echarts 在 vue-awesome-swiper中无法点击
    vue 父子父组件通过props传父页面请求后的数据
    vue 路由对象
    popupwindow
    数据库
    冒泡排序
    xtuils
    版本更新
    清除缓存
  • 原文地址:https://www.cnblogs.com/gaobingjie/p/14209296.html
Copyright © 2011-2022 走看看