zoukankan      html  css  js  c++  java
  • webpack再探-loader、plugin

    webpack一些基本知识:

    提升webpack打包速度有两个关键点:1、node版本尽量新,2、webpack版本尽量新。
    高版本webpack会利用nodejs新版本中的一些特性来提高打包速度。
    不推荐全局安装webpack,因为全局安装webpack只有一个版本,若安装了4.x版本,而有个项目的webpack是3.x版本,则会导致该版本无法运行
    webpack默认配置文件:webpack.config.js,在命令行webpack的时候会自动找到该文件,根据里面的规则进行打包
    当自定义webpack配置文件,如:webpack.js时,需要执行 webpack --config webpack.js 即可打包成功
    webpack-cli的作用:使得我们可以在命令行中使用webpack这个命令

    loader介绍:

    loader是一个打包方案,当webpack不知道如何打包时,就可以求助于loader。

    file-loader:

    例如当你要打包一张图片(var img=require('./img.png')),webpack不知道如何打包,会报错,这个时候要借助file-loader来实现:

    module:{
        rules:[{
            test:/.jpg/,
            use:{
                loader:'file-loader'
            }
        }]
    }

    同理,在vue中我们有这样的写法:import header from 'header.vue',webpack是无法打包vue文件的,所以需要借助于vue-loader。

    默认情况下,webpack把图片打包之后会以hash来命名,如果我们要用原来的名字来命名的话,需要做一些配置:

    module:{
        rules:[{
            test:/.(jpg|png|gif)$/,
            use:{
                loader:'file-loader',
                options:{
                    name:'[name].[ext]'     // name:原来的名字,ext:后缀
                }
            }
        }]
    }

    当我们需要把图片打包到指定位置时,可以在配置项中加一个输出位置:

    module:{
        rules:[{
            test:/.(jpg|png|gif)$/,
            use:{
                loader:'file-loader',
                options:{
                    name:'[name].[ext]',     // name:原来的名字,ext:后缀
                    outputPath:'images/'     // 图片会打包在dist下的images下
                }
            }
        }]
    }

    url-loader:

    url-loader可以做file-loader能做的事,不过当你用url-laoder打包图片时会发现dist目录中并没有图片生成,而页面中图片还是能正确呈现,原因是url-loader将图片转换成base64格式。这个时候会减少一次加载图片的http请求。但是如果文件特别大,则会增大js文件。所以如果图片非常小,才推荐使用url-loader,若图片较大,则推荐使用file-loader

    rules:[{
        test:/.(jpg|png|gif)$/,
        use:{
            loader:'url-loader',
            options:{
                name:'[name].[ext]',     // name:原来的名字,ext:后缀
                outputPath:'images/',
                limit:2048
            }
        }
    }]

    以上配置会是大于2048B的图片以文件形式打包,不大于2048B的文件以base64形式打包。

    样式loader:

    当我们需要引入css时,需要在进行配置:

    {
        test:/.scss$/,
        use:['style-loader','css-loader','sass-loader']
    }

    这样就可以使用ES Module的形式引入:import './index.css';

    css-loader会帮我们分析出几个css文件之间的关系,最终把这些css文件合并成一段css,style-loader在得到css-loader生成的css内容的时候,它会把内容挂载到页面的header部分。

    当我们需要使用sass、less、stylus等的时候:

    {
        test:/.scss$/,
        use:['style-loader','css-loader','sass-loader']
    }

    注意,除了要安装sass-loader,还需要安装node-sass,可以看官方文档

    loader执行顺序是从右到左,在上例中会依次执行sass-loader,css-loader,style-loader。

    postcss-loader:

    在css3中有一些属性如transform,为了兼容性,需要加上前缀:-webkit-,-moz-等这个时候需要用到postcss-loader:

    {
        test:/.scss$/,
        use:['style-loader','css-loader','sass-loader','postcss-loader']
    }

    要使用postcss-loader,还要配置一个文件postcss.config.js:

    module.exports={
        plugins:[
            require('autoprefixer')
        ]
    }

    当然,autoprefixer这个插件还是要安装的,它会帮我们自动添加前缀。

    当我们在使用 @import './test.scss' 这样的语法时,需要在'test.css'文件在执行css-loader之前先执行postcss-loader和sass-loader,那么我们就需要配置:

    {
        test:/.scss$/,
        use:[
            'style-loader',
            {
                loader:'css-loader',
                options:{
                    importLoaders:2
                }
            },
            'sass-loader',
            'postcss-loader'
        ]
    }

    以上 importLoders:2 表明在打包引入的test.css时,需要先去执行postcss-loader和sass-laoder。

    modules概念:

    当这样引入 @import './test.scss'; 的时候相当于全局引入了这个文件,会作用于所有模块,那么当我们需要修改其中某个页面样式的时候就非常不方便,会导致全局样式修改,因此我们需要解耦,这个时候需要在css-loader配置项中进行修改:

    use:[
        'style-loader',
        {
            loader:'css-loader',
            options:{
                importLoaders:2,
                modules:true
            }
        },
        'sass-loader',
        'postcss-loader'
    ]

    我们引入的方式也要进行修改:@import style from './test.scss';

    在使用的时候也要做修改:

    var img=new Image();
    img.src=avatar;
    img.classList.add(style.avatar);

    打包字体文件:

    从iconfont中下载字体文件,放入font文件夹中,将iconfont.css文件中的内容引入,记得修改正确路径,需要配置解析:

    {
        test:/.(eot|svg|woff|ttf)$/,
        use:{
            loader:'file-loader'
        }
    }

    plugin知识:

    plugin可以在为webpack打包到某个时刻的时候帮你做一些事情;

    htmlWebpackPlugin(打包之后运行):自动生成一个html文件,并把打包生成的js自动引入到html文件中。

    plugins:[
        new HtmlWebpackPlugin({template:'src/index.html'})
    ],

    cleanWebpackPlugin(打包之前运行):会先清除dist目录下的文件:

    plugins:[
        new HtmlWebpackPlugin({template:'src/index.html'}),
        new CleanWebpackPlugin()
    ]
  • 相关阅读:
    Java实现 蓝桥杯 历届试题 连号区间数
    Java实现 蓝桥杯 历届试题 连号区间数
    Java实现 蓝桥杯 历届试题 连号区间数
    Java实现 蓝桥杯 历届试题 连号区间数
    Java实现 蓝桥杯 历届试题 连号区间数
    Java实现 蓝桥杯 历届试题 大臣的旅费
    Java实现 蓝桥杯 历届试题 大臣的旅费
    Java实现 蓝桥杯 历届试题 大臣的旅费
    Java实现 蓝桥杯 历届试题 大臣的旅费
    Navicat查询哪些表有指定字段名
  • 原文地址:https://www.cnblogs.com/jingouli/p/12255493.html
Copyright © 2011-2022 走看看