webpack(四)

202 阅读1分钟

loader

webpack只能处理js模块,如果要处理其它类型的文件,需要使用loader进行转换,loader就是将一段代码转换成另外一段代码的webpack加载器。

//loader就是一个函数
function loader(source){
	return source; 
}
module.export = loader;

loader别名

resolveLoaer:{
    modules: ['node_modules', path.resolve(__dirname, 'loaders', 'loader1.js')],
     // 如果node_modules找不到就去该路径下去找
	alias: {
    	loader1: path.resolve(__dirname, 'loaders', 'loader1.js')
    }
}

loader的分类 pre、post、normal
loader的顺序 pre + normal + inline + post
-!禁用前置和正常loader !禁用普通loader !!禁用前置和后置和正常loader

let str = require('!!inline-loader!./a.js');

//loader默认是由两部分组成
pitchloader normalloader

babel-loader

rules:[
	{
    	test: /\.js$/,
        use:{
        	loader: 'babel-loader',
            options: {
            	preset: [
                	'@babel/preset-env'
                ]
            }
        }
    }
]
let babel = require('@babel/core');
let loaderUtils = require('loader-untils');
//loader就是一个函数
function loader(source){
    let options = loaderUtils.getOptions();
    let cb = this.async(); //异步
    babel.transform(source,{
    	...options,
        sourceMap: truefilename: this.resourcePath.split('/').pop() // 文件名
    },function(err, result){
      cb(err, result.code, result.map); //异步
    }
    );
}

banner-loader

{
    	test: /\.js$/,
        use:{
        	loader: 'banner-loader',
            options: {
            	
            }
        }
    }
let babel = require('@babel/core');
let loaderUtils = require('loader-untils');
let validateOptions = require('schema-utils');
let cb = this.async(); //异步
//loader就是一个函数
function loader(source){
	this.cacheable(false); //表示不要缓存
    let options = loaderUtils.getOptions();
    let schema = {
       type: 'object',
       properties:{
       	text:{
        	type: 'string',
        },
        filename: {
        	type: 'string',
        }
       }
    }
    validateOptions(schema, options, 'banner-loader');
    if(options.filename){
    	this.addDependency(option.filename); //自动添加到文件依赖
    	fs.readFile(options.filename, 'utf8', function(err,data){
        	cb(err, `/**${data}**/${source}`)
        })
    }else{
        cb(null, errmsg)
    }
}

file-loader

let babel = require('@babel/core');
let loaderUtils = require('loader-untils');
function loader(source){
    filename = loaderUtils.interpolateName(this, '[hash].[ext]',{content: source});
    this.emitFile(filename, source);
    return source;
}
loader.raw = true;
module.exports = loader;

url-loader

let babel = require('@babel/core');
let loaderUtils = require('loader-untils');
let mime = require('mime');
function loader(source){
	let {limit} = loaderUtils.getOptions();
    if(limit && limit > source.length){
    	return `module.exports=data:image/jpeg;base64,${source.toString('base64')}`
    }else{
    	return require('./file-loader').call(this, source);
    }

}
loader.raw = true;
module.exports = loader;

style-loader css-loader less-loader

//css-loader
let less = require('less');
let loaderUtils = require('loader-untils');
function loader(source){
    let css;
    less.render(source, function(err,r){
    	css = r.css;
    });
    return css;

}
module.exports = loader;

//style-loader
function loader(source){
	let str = `
    	let style = document.createElement('style');
        style.innerHTML = ${JSON.stringify(source)};
        document.head.appendChild(style);
    `;
    return str;
}
module.exports = loader;

// css-loader
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;
        pos = reg.lastIndex;
        arr.push(`list.push(${JSON.stringify(source.slice(pos, last))})`);
        arr.push(`module.exports = list.join('')`);
    }
}