file-loader
file-loader 主要用来加载图片文件
使用方式
import p from './public.jpg' let img = new Image() img.src = p document.body.appendChild(img)
|
配置 file-loader
module.exports = { resolveLoader: { modules: ['node_modules', path.resolve('loaders')] }, rules:[ { test: /\.jpg$/, use:'file-loader' } ] }
|
实现 file-loader
file-loader 的原理:
将读出来的文件写到dist目录中,同时文件名是根据读到的二进制文件以MD5的形式生成
let loaderUtils = require('loader-utils')
function loader(source){ let filename = loaderUtils.interpolateName(this, '[hash:8].[ext]', {content:source}) this.emitFile(filename, source) return `module.exports="${filename}"` } loader.raw = true module.exports = loader
|
url-loader
url-loader 会将引入的文件以 base64 格式编码,生成 DataURL,再把这个字符串打包到 JavaScript
url-loader 限制文件大小,超过大小时会使用 file-loader 处理
配置 url-loader
module.exports = { resolveLoader: { modules: ['node_modules', path.resolve('loaders')] }, rules:[ { test: /\.jpg$/, use:{ loader: 'url-loader', options:{ limit: 200*1024 } } } ] }
|
实现 url-loader
获取限制文件大小 limit,超过文件大小返回 base64 格式,否则返回 file-loader 的处理结果
base64 格式:data:image/jpg;base64,...
let loaderUtils = require('loader-utils') let mime = require('mime') function loader(source){ let {limit} = loaderUtils.getOptions(this) if(limit && limit>source.length){ return `module.exports = "data:${ mime.getType(this.resourcePath) // 根据文件绝对路径获取类型 };base64,${source.toString("base64")}"` }else{ return require('./file-loader.js').call(this, source) } } loader.raw = true
module.exports = loader
|
参考
webpack loaders 从上手到理解系列:file-loader
webpack loader 从上手到理解系列:url-loader