css-loader
主要用来处理css
中的图片链接,需要把url
转换成require
webpack.config.js
{
test: /\.png$/,
// 目的是根据图片生成md5 发射到dist目录下,file-loader 返回当前图片路径
// use: 'file-loader'
// 处理路径
use: {
loader: 'url-loader1',
options: {
limit: 200 * 1024
}
}
},
{
test: /\.less$/,
use: ['style-loader2', 'css-loader2', 'less-loader2']
}
创建index.less
@base: #f938ab;
body {
background: @base;
background: url("./photo.png");
}
less-loader2.js
// 将less转为css
let less = require('less')
function loader(source) {
let css = ''
// console.log(source, 2222);
less.render(source, function (err, output) {
// console.log(output);
css = output.css
})
// css = css.replace(/\n/g, '\\n');
return css
}
module.exports = loader
css-loader2.js
// css-loader 用来解析@import这种语法,包括css中引入的图片
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 // matchUrl -> 'url("./photo.png")', g -> '"./photo.png"'
// console.log(matchUrl, g, 88);
let lastIndex = reg.lastIndex - matchUrl.length // 拿到css从开通到地址链接之前的index
arr.push(`list.push(${JSON.stringify(source.slice(pos, lastIndex))})`) // 拼入开始和地址之前的代码
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('')`)
console.log(arr.join('\r\n'));
// let list = []
// list.push("body {\\n background: #f938ab;\\n background: ")
// list.push('url('+ require("./photo.png") +')')
// list.push(";\\n}\\n")
// module.exports = list.join('')
return arr.join('\r\n')
}
module.exports = loader
style-loader2.js
let loaderUtils = require('loader-utils')
// 将css插入到html头部
function loader(source) {
let str = `
let style = document.createElement('style')
style.innerHTML = ${JSON.stringify(source)}
document.head.appendChild(style)
`
return str
}
// style-loader写了pitch,有返回后面的跳过,自己的写不会走
loader.pitch = function (remainingRequest) { // 剩余的请求
console.log(loaderUtils.stringifyRequest(this, '!!' + remainingRequest, 99999999))
// 让style-loader 处理 less-loader 和css-loader拼接的结果
// 得到 /Users/liuhuimin/work/webpack/loader/css-loader2.js!/Users/liuhuimin/work/webpack/loader/less-loader2.js!/Users/liuhuimin/work/webpack/src/index.less
// 剩余的请求 less-loader!css-loader!./index.less
// console.log(remainingRequest, 1223);
// require返回的就是css-loader处理好的结果require('!!css-loader!less-loader!./index.less')
let str = `
let style = document.createElement('style')
style.innerHTML = require(${loaderUtils.stringifyRequest(this, '!!' + remainingRequest)})
document.head.appendChild(style)
`
// stringifyRequest 绝对路径转相对路径
return str
}
module.exports = loader
user: ['style-loader2', 'css-loader2', 'less-loader2']
pitch loader - 有返回值
pitch style-loader2 → css-loader2 less-loader2
↙
有返回值 资源
↙
normal style-loader2 css-loader2 less-loader2
在style-loader2
中 引用了less-loader
css-loader
和less
文件