手写webpack的css-loader

.box{
width:100px;
height:100px;
background-image:url('./public/img.jpg')}

webpack无法直接找到public文件夹,需要将url里面的路径转为require引入的形式

function loader(source){
    let reg=/url\((.+?)\)/g
    let pos=0;
    let current;
    let arr=['let list=[]'];
    while(current=reg.exec(source)){
        let [matchUrl,g]=current;
        let last=reg.lastIndex-matchUrl.length;
        arr.push(`last.push(${JSON.stringify(source.slice(pos,last))})`);
    
        pos=reg.lastIndex;
        arr.push(`list.push('url('+require(${g})+')')`)
    }
arr.push(`list.push(${JSON.stringify(source.slice(pos))})`)
arr.push(`module.exports=list.join('')`);
return source;
}

还需要改造style-loader

let loaderUtils=require('loader-utils');
function loader(source){
        let str=`let style=document.createElement('style');
            style.innerHTML=${JSON.stringify(source)};
            document.head.appendChild(style);`
    return str;
    }
loader.pitch=function(remainingRequest){
    let str=`let style=document.createElement('style');
    style.innerHTML=require(${loaderUtils.stringifyRequest(this,'!!'+remainingRequest)});
    document.head.appendChild(style)`
    return str;
    }
module.exports=loader

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值