目录
- 介绍一下
raw-loader
- 编写一个
raw-loader
的demo,watermark-loader
- 个人对编写
loader
的看法
raw-loader
默认情况下,资源文件会被转化为 UTF-8 字符串
,然后传给 loader
。但是有些情况下,我们需要操作二进制
数据。这种时候,只需要设置一个raw
属性,传给loader
的就是二进制
数据。
举例说明
module.exports = function(content) {
// doanything
};
// 这个设置是关键
module.exports.raw = true;
其实raw-loader
只是通过功能来区分的。同样在内部可以实现同步loader
和异步loader
。
watermark-loader
这是一个demo,功能上就是给所有的图片文件打上一个图片水印。
下面便开始编写这个loader
首先,我们把这个loader
的基础代码写好,则有:
module.exports = function(content) {
};
module.exports.raw = true;
因为我们只是给图片打水印,也就不存在异步操作了。所以这是一个同步loader
。另外需要使用一个打水印的库,node-images。具体使用方法,参加官方文档。另外因为我们需要处理路径,需要获取loader
配置,也就需要用到两个库,一个是path
, 另一个是loader-utils
。
然后watermark-loader
已经基本成型,便有了如下代码以及伪代码。
const path = require("path");
const images = require("images");
const loaderUtils = require('loader-utils');
module.exports = function(content) {
// 获取本loader对应的配置参数
// 获取水印文件路径
// 获取需要处理的图片路径
// 给图片打上水印
// 发射文件
// 返回数据
};
module.exports.raw = true;
接下来编码即可。这里需要提到的一点事,node-images
这个库的文档上没有给出返回二进制的方法。通过分析源码后,我发现其实是有这样的方法的。使用encode
即可。
const path = require("path");
const images = require("images");
const loaderUtils = require('loader-utils');
module.exports = function(content) {
// 获取本loader对应的配置参数
// 获取水印文件路径
const { watermarkPath = '' } = this.query;
// 获取需要处理的图片路径
const url = loaderUtils.interpolateName(this, "[path][name].[ext]", {
content: source,
context: this.context
});
// 给图片打上水印
const file = images(path.resolve(this.context, url))
.draw(images(path.resolve(this.rootContext, watermarkPath)), 10, 10)
.encode(path.extname(url) || 'png');
// 发射文件
this.emitFile(url, file);
// 返回数据
const publicPath = `__webpack_public_path__ + ${JSON.stringify(url)}`;
return `module.exports = ${publicPath};`;
};
module.exports.raw = true;
这样就完成了一个watermark-loader
。能给图片打水印了。
具体代码将会分享到github
上面。
完整代码
个人对loader的看法
其实编写loader
是蛮简单的。例如几乎每个项目都会用到的file-loader
这个库的核心代码也不到 60行 。