webpack自定义loader

2019-10-24  本文已影响0人  半瓶不满

webpack默认只能识别js文件,当遇到其他格式的文件后,webpack并不知道如何去处理,这时候该怎么办,loader就是一种打包的方案。我们可以定义一种规则,告诉webpack当他遇到某种格式的文件后,去求助于相应的loader。
有些时候我们需要一些新的编写方式,就需要自定义一些loader。如何自定义简易loader?

首先搭建一个简单webpack环境。

1、建一个文件夹
npm  init
2、安装webpack
npm install -D webpack
3、如图配置目录
0.jpg
module.exports = {
    mode:"development",//webpack4 两个参数 development/production 不写默认production
    entry:{
        app:"./app.js"// 入口
    },
    output:{
        filename:"[name].bundle.js"// 出口
    },
    module:{
        rules:[
            {
                test:/\.wy$/,
                use:{
                    loader:"./wy-loader",//因为npm包没有我们的loader,所以要对应项目路径去引入
                    options:{//通常所传递的配置信息
                        a:1
                    }
                }
            }
        ]
    }
}
4、wy-loader下的index.js
const loaderUtils = require("loader-utils");//是我要那配置信息的依赖
const transform = require("./libs/transform.js");//解析wy后缀文件的依赖
module.exports = function(source){//参数是我们的需解析文件的内容
    let loaderOptions = loaderUtils.getOptions(this) || {};//拿到配置信息的方法
        console.log(loaderOptions)//{a:1},即webpack.config.js对应loader,option配置信息
    let _res = transform(source);//调用依赖包方法
    return _res;//必须要有返回
}
5、wy-loader下的transform.js
//逐字扫描
module.exports = function(word){
    var cur = 0;
    var length = word.length;
    var commonlist = ["c","a"];
    var commonArr = [];
    var resultArr = [];

    function _get(st){
        if(commonlist.indexOf(st) !== -1){
            commonArr.push({
                type:"command",
                value:st
            })
        } else if (st == ":"){
            
        }
        else if (st == ";"){
            resultArr.push(commonArr);
            commonArr = [];
        } else if (typeof st == "number" || typeof st == "string"){
            commonArr.push({
                type:"value",
                value:st
            })
        }
    }
    
    while(cur<length){
        _get(word[cur]);
        cur++;
    }
    
    
    function getCode(ast){
        var str = "";
        for(var i=0; i<ast.length; i++){
            switch (ast[i][0].value){
                case "c": {
                    str += "console.log(value)";
                    break;
                };
                case "a": {
                    str += "alert(value)";
                    break;
                }
            }
            str = str.replace("value",ast[i][1].value);
            str += ";";
        }
        return str;
    }
    //最终str变成js语言    `console.log(1);alert(2);`
    return getCode(resultArr);
};

下图为webpack打包后的文件代码


3.jpg

以上方法,会有bug,不足。具体实际再做相应优化。
我们代码要保证的特性:
健壮性(在任何情况下都跑的通)
可读性(通俗易懂,便于别人阅读理解)
扩展性(本文wy只有两个参数,如果更多该如何处理,有没有一个通配法等)
了解需求,将代码做到更好!!!!

上一篇 下一篇

猜你喜欢

热点阅读