webpack4入门4——loader

作者: 前往悬崖下寻宝的神三算 | 来源:发表于2018-05-17 19:28 被阅读19次

本文长期更新,如有错误,还请指正!
关注一下不迷路 =.=

什么是loader


类似gulp中的taskes,即任务

webpack除了主营JS,还可以对指定的文件进行统一处理,比如把typescript转换为js,js内导入css等

这些任务都需要安装对应的依赖,且在module.rules配置项中配置(其他方式忽略)

{
    module: {
        rules: [
            //任务配置
            {
                test:regex,//正则,匹配文件规则
                exclude:regex,//正则,不包含的文件夹
                use:[//使用到的loaders及其配置
                    {//某个loader
                        loader:'xx',
                        options:{}
                    }
                ]
            }
        ]
    }
}

以下列举一些常常做的任务

css打包


html中不需要引入css文件,通过js间接的获取样式,这样整个html只需要引入一个js文件即可。

  • 使用 css-loader 可以在js中直接导入css文件,并在打包时把样式也打包在output文件中

    //比如,其中indexcss名称任意
    import indexcss from './index.css';
    

    在js中使用方式:className直接写名称即可(在引入的文件类)

    如何解决引入多个css重名问题?

  • 使用 style-loader 把js中的样式输入到html中的 <style> 标签内

1 . 安装依赖包

cnpm install style-loader css-loader --save-dev

2 . 配置

module: {
    rules: [{
        test: /\.css$/,
        use: [{ 
            loader: "style-loader" 
        },{ 
            loader: "css-loader" 
        }]
        //简写
        //use:["style-loader","css-loader"]
    }]
}

注:options不存在时可简写成数组,注意loader引入的 顺序

贴测试配置图:

image

postcss


postcss 是对css的扩展,允许使用下一代 CSS 语法,编译后转换成正常的css且会自动加上前缀

配和 autoprefixer 使用(why?)

1 . 安装

cnpm i  postcss-cssnext autoprefixer --save-dev

2 . 配置

rules: [
    {
        // 使用 PostCSS 处理 CSS 文件
        test: /\.css/,
        use: ['style-loader', 'css-loader', 'postcss-loader'],
    },
]   

注意:postcss-loader 应该先执行,再执行 css-loader (倒序)

3 . 创建配置文件 postcss.config.js

module.exports = {
    plugins: {
        'autoprefixer': {
            browsers: 'last 5 version' // 代表意思为每个主流浏览器的最后5个版本
        }
    }
}

less


处理less文件,一般和上面的css-loader style-loader一起使用

1 . 安装依赖包

cnpm install less-loader less --save-dev

2 . 配置

在上面的use加入

{loader: "less-loader"}

注:注意顺序,链式调用,放在最后

图片移动和打包

css既然都放在js中了,为什么图片不可以呢?

  • file-loader

    css打包会导致个问题:写background图片路径可能是按照css文件相对路径计算的,那么打包进js后值未改变,会导致路径错误。(还有什么地方用到?)

    file-loader 解决了这个问题:它把都图片移动到指定的位置,并修改url

    另外,也允许使用import导入图片,被计算出正确的路径,后续使用这个路径作为图片的正确路径

    import banner1 from "../../images/banner1.jpg";
    <img src={banner1} />
    
  • url-loader

    它把一部分图片转换为base64编码打包进js中,实际上是对file-loader的上层封装(但不依赖,内置file-loader)

    注:虽然不依赖,但是图片import还需要它,url-loader只转编码

1 . 安装依赖包

cnpm install url-loader file-loader --save-dev

2 . 配置

{
    test: /\.(png|jpg|gif)$/,
    use: [{ 
        loader: "url-loader",
        options:{
            limit: 8192, //单位byte,小于8KB的图片都会被编码(base64)放打包在js中
            name: 'images/[name].[ext]' //图片复制到指定位置
        }
    }]
}

贴测试配置图:

image

img1.jpg(小于8kb)和img2.jpg(大)

打包后img1被打包进了js里,img2由于超过指定大小被复制到了指定位置 且 background中的url路径被更改

image

ES6转ES5 ES3


babel-loader 它把ES6转换成低版本的js代码以在低版本浏览器中运行(大部分浏览器不能完全支持es6)

1 . 安装依赖包

cnpm install babel-loader babel-core babel-preset-env --save-dev

2 . 配置

{
    test: /\.js$/,
    exclude: /(node_modules|bower_components)/,//只是节约打包时间,这些文件夹内的js不会babal处理
    use: {
        loader: 'babel-loader',
        options: {
            presets: ['env','react'],//react 支持react
            plugins:['syntax-dynamic-import','babel-plugin-transform-object-rest-spread'] 
            //syntax-dynamic-import动态语法支持
            //babel-plugin-transform-object-rest-spread对象的...语法支持
        }
    }
}

支持React


1 . 额外依赖包

cnpm install babel-preset-react --save-dev

附react安装

cnpm install react react-dom --save
  1. 额外配置

preset中加入react

presets: ['env','react']

相关文章

网友评论

    本文标题:webpack4入门4——loader

    本文链接:https://www.haomeiwen.com/subject/pwsidftx.html