• 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()
    ]
  • 相关阅读:
    循环语句的基本使用
    创建一个可拖动的dom元素。
    JavaScript中的callee,caller,call,apply的使用
    两个数组去重的方法。
    利用setTimeout建立能捕捉鼠标多次点击和鼠标长按的事件处理程序。
    document.getElementByClassName()的使用和兼容老浏览器。
    jQuery .data()方法的运用。
    javascript对象的深拷贝。
    未来、
    linux上机作业
  • 原文地址:https://www.cnblogs.com/jingouli/p/12255493.html
Copyright © 2020-2023  润新知