• 八:Webpack的加载器


    一、什么是加载器(loaders)

    loaders 用于转换应用程序的资源文件,他们是运行在nodejs下的函数 使用参数来获取一个资源的来源并且返回一个新的来源(资源的位置),例如:你可以使用loader来告诉webpack去加载less文件、sass文件、es的js文件等

    二、loaders 特性

    • loaders可以串联,他们应用于管道资源,最后的loader将返回javascript,其它的可返回任意格式(传递给下一个loader)

    • loaders 可以同步也可以异步

    • loaders在nodejs下运行并且可以做一切可能的事

    • loader接受参数,可用于配置里

    • loaders可以绑定到extension/RegExps 配置

    • loaders 可以通过npm发布和安装

    • 正常的模块儿可以到处一个loader除了

    • loaders 可以访问配置

    • 插件可以给loaders更多的特性

    • loaders可以释放任意额外的文件



    三、loaders的执行顺序

    loaders的执行顺序分为三部分:preLoaders - loaders - postLoaders,针对每一个阶段可以这对不同的操作,preLoaders可以进行代码的时候检查,只有检测通过才可以进行loaders。loaders阶段主要进行css、js、 images等文件的处理。postLoaders阶段没有用到过


    四、css-loader和style-loader添加CSS样式


    现在来添加一些样式,webpack使用loader的方式来处理各种各样的资源,比如说样式文件,我们需要两种loader,css-loader 和 style-loader,css-loader会遍历css文件,找到所有的url(...)并且处理。style-loader会把所有的样式插入到你页面的一个style tag中。

    安装我们的loader

    npm install css-loader style-loader --save-dev


    配置loader,在webpack.config.js中

    var webpack = require('webpack');
    
    var WebpackDevServer = require("webpack-dev-server");
    var path = require('path');
    var CURRENT_PATH = path.resolve(__dirname);
    // 获取到当前目录
    var ROOT_PATH = path.join(__dirname, '../');
    // 项目根目录
    var MODULES_PATH = path.join(ROOT_PATH, './node_modules');
    // node包目录
    var BUILD_PATH = path.join(ROOT_PATH, './dist');
    // 最后输出放置公共资源的目录
    var HtmlWebpackPlugin = require('html-webpack-plugin');
    var ExtractTextPlugin = require("extract-text-webpack-plugin");
    var CopyWebpackPlugin = require('copy-webpack-plugin');
    module.exports = {
        //项目的文件夹 可以直接用文件夹名称 默认会找index.js ,也可以确定是哪个文件名字  
        entry: {
            app: ['./src/js/index.js'],
            vendors: ['jquery', 'moment'] //需要打包的第三方插件  
        },
        //输出的文件名,合并以后的js会命名为bundle.js   
        output: {
            path: path.join(__dirname, "dist/"),
            publicPath: "http://localhost:8088/dist/",
            filename: "bundle_[name].js"
        },
        module: {
            loaders: [
                // 把之前的style loader改为     
                {
                    test: /.css$/,
                    loader: ExtractTextPlugin.extract('style-loader', 'css-loader'),
                    exclude: /node_modules/
    
                }
            ]
        }
    }
    ;


    看loaders的书写方式,test里面包含一个正则,包含需要匹配的文件,loaders是一个数组,包含要处理这些程序的loaders,这里我们用了css和style,注意loaders的处理顺序是从右到左的,这里就是先运行css-loader然后是style-loader.

    我们在webpackDemo项目里面创建一个css文件夹,然后 创建 index.css文件,内容如下:


    body{
        font-size: 16px;
    }


    然后在index.js引用 css文件


    var login=require('./login');
    var data = require('data');
    require('./../css/index.css');
    
    $("#welcome").html(data);


    这样就能实现样式引用了。还可以结合ExtractTextPlugin进行样式提取。

    var webpack = require('webpack');
    var WebpackDevServer = require("webpack-dev-server");
    var path = require('path');
    var CURRENT_PATH = path.resolve(__dirname);
    // 获取到当前目录
    var ROOT_PATH = path.join(__dirname, '../');
    // 项目根目录
    var MODULES_PATH = path.join(ROOT_PATH, './node_modules');
    // node包目录
    var BUILD_PATH = path.join(ROOT_PATH, './dist');
    // 最后输出放置公共资源的目录
    var HtmlWebpackPlugin = require('html-webpack-plugin');
    var ExtractTextPlugin = require("extract-text-webpack-plugin");
    var CopyWebpackPlugin = require('copy-webpack-plugin');
    module.exports = {
        //项目的文件夹 可以直接用文件夹名称 默认会找index.js ,也可以确定是哪个文件名字  
        entry: {
            app: ['./src/js/index.js'],
            vendors: ['jquery', 'moment']
                //需要打包的第三方插件  
        },
        //输出的文件名,合并以后的js会命名为bundle.js    
        output: {
        path: path.join(__dirname, "dist/"),
            publicPath: "http://localhost:8088/dist/",
            filename: "bundle_[name].js"
        },
        module: {
            loaders: [
                // 把之前的style&css&less loader改为    
                {
                    test: /.css$/,
                    loader: ExtractTextPlugin.extract('style-loader', 'css-loader'),
                    exclude: /node_modules/
     
                }, {
                    test: /.less$/,
                    loader: ExtractTextPlugin.extract('style', 'css!less'),
                    exclude: /node_modules/
     
                },
            ]
        },
        plugins: [
            // 分离css      
            new ExtractTextPlugin('[name].bundle.css', {
                allChunks: true
            })
        ],
            externals: {
            // require('data') is external and available
            //  on the global var data     
            'data': 'data',
             devtool: 'source-map'
        }
    };

     


    五、autoprefixer-loader和less-loader处理less文件


    项目中如果用到less,就需要对less进行转换,通过less-loader就能进行转换。autoprefixer-loader是针对css3的前缀进行自动 填充,例如:border-radius,autoprefixer-loader通过他就能把各个浏览器的前缀添加上去。

    安装 

    npm install less autoprefixer-loader less-loader postcss-loader --save-dev


    添加loader

    var webpack = require('webpack');
    var WebpackDevServer = require("webpack-dev-server");
    var path = require('path');
    var CURRENT_PATH = path.resolve(__dirname);
    // 获取到当前目录
    var ROOT_PATH = path.join(__dirname, '../');
    // 项目根目录
    var MODULES_PATH = path.join(ROOT_PATH, './node_modules');
    // node包目录
    var BUILD_PATH = path.join(ROOT_PATH, './dist');
    // 最后输出放置公共资源的目录
    var HtmlWebpackPlugin = require('html-webpack-plugin');
    var ExtractTextPlugin = require("extract-text-webpack-plugin");
    var CopyWebpackPlugin = require('copy-webpack-plugin');
    module.exports = {
        //项目的文件夹 可以直接用文件夹名称 默认会找index.js ,也可以确定是哪个文件名字 
        entry: {
            app: ['./src/js/index.js'],
            vendors: ['jquery', 'moment']
                //需要打包的第三方插件 
        },
        //输出的文件名,合并以后的js会命名为bundle.js    
        output: {
            path: path.join(__dirname, "dist/"),
            publicPath: "http://localhost:8088/dist/",
            filename: "bundle_[name].js"
        },
        module: {
            loaders: [
                // 把之前的style&css&less loader改为      
                {
                    test: /.css$/,
                    loader: ExtractTextPlugin.extract('style-loader', 'css-loader', 'postcss-loader'),
                    exclude: /node_modules/
    
                }
    
                , {
                    test: /.less$/,
                    exclude: /node_modules/,
                    loader: ExtractTextPlugin.extract('style', 'css!autoprefixer?{browsers: ["last 2 version", "IE 8", "Android 4.0", "iOS 6"]}!less?strictMath&noIeCompat!postcss')
                }
            ]
        },
        postcss: function() {
            return [require('postcss-fixes')({ preset: 'recommended' })]
        },
        plugins: [
            // 分离css      
            new ExtractTextPlugin('[name].bundle.css', {
                allChunks: false
            })
        ],
    };

     在webpackDemo 添加login.less文件


    .maker-config {
        width: 100px;
        background-color: red;
        border-radius: 50px;
        margin-left: -48px;
        float: right;    a{
            font-size: 16px;
            display: flex    }
    }


     
     执行webpack命令生成的css文件为:


    body{font-size:16px}
    .maker-config{
    width:100px;
    background-color:red;
    border-radius:50px;
    margin-left:-48px;
    float:right}
    .maker-config a{
    font-size:16px;
    display:-webkit-box;
    display:-ms-flexbox;
    display:flex}/*# sourceMappingURL=app.bundle.css.map*/

     
    六、url-loader图片处理

    这个和其他一样,也许你也已经会玩了。安装loader,处理文件。诸如图片,字体等等,不过有个神奇的地方它可以根据你的需求将一些图片自动转成base64编码的,为你减轻很多的网络请求。

    安装url-loader
     

    npm install url-loader --save-dev

    配置config文件 

    {
            test: /.(png|jpg)$/,
            loader: 'url?limit=40000'
          }


    注意后面那个limit的参数,当你图片大小小于这个限制的时候,会自动启用base64编码图片。

    我们修改一下login.less文件


    .maker-config {
        background-color: red;
        border-radius: 50px;
        height:200px;
        background: url('../images/white.png'); 
      a{ font-size
    : 16px; display: flex } }


    执行webpack执行命令,查看编译之后的css文件,可以看到 图片被转换为base64编码


    body{font-size:16px}.maker-config{100px;background-color:red;border-radius:50px;height:200px;margin-left:-48px;float:right;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANcAAADXBAMAAAB7U9mGAAAAGFBMVEXw8PDy8vL09PT29vbt7e3r6+v4+Pj7+/v9bAgbAAAOsUlEQVR42rxaS5cyNRC9VQm4rUqacVuVbsZtukHX6QZ1C+PoGsbHWv3/C8/xddTxNSLfD4ADSe6j7i0AGNe+0AU2gA5Aqh1maZ657w9cNJJPBUHCZxTYEwslk7XjwVTWulgWrnaESqXMaUZ39pF0Z8RzKGXNzBOmXDFsB)}.maker-config a{font-size:16px;display:-webkit-box;display:-ms-flexbox;display:flex}/*# sourceMappingURL=app.bundle.css.map*/
  • 相关阅读:
    python unittest--TestSuit类--通过unittest.TestSuite()类直接构建,或者通过TestSuite实例的addTests、addTest方法构建
    Cannot read property 'toLowerCase' of undefined
    Vue 中登录功能的简单实现
    git 常用命令
    js 锚点定位的简单方法
    Vue element-ui 使用Loading服务按需引入的坑
    防抖 节流
    element-ui 日期选择器-开始结束日期选择限制
    vue elment-ui 对navTab导航组件封装
    vue 监听窗口变化对页面部分元素重新渲染
  • 原文地址:https://www.cnblogs.com/minghui007/p/7269036.html
Copyright © 2020-2023  润新知