webpack-自定义Loader

110 阅读1分钟

自定义 Loader

loader 是一个函数

Loader 的基本使用

/**
 * 自定义 loader, 并且必须返回内容
 * @param {*} context 文件内容
 * @param {*} map sourceMap相关数据
 * @param {*} mate 元数据
 * @returns
 */
module.exports = function (context, map, mate) {
	return context;
};

同步 Loader 和异步 Loader

  • 同步 Loader
/**
 * 同步loader, 可以通过 this.callbacl 返回数据、直接 return 返回数据
 */
module.exports = function (context, map, mate) {
	// 方式一
	return context;
	// 方式二
	// 第一个参数: 错误信息
	// 第二个参数:返回的内容
	this.callback(null, context);
};
  • 异步 Loader
/**
 * 异步loader的使用,需要调用 this.async 告知 loader-runner 我们需要执行异步操作
 */
module.exports = function (context, map, mate) {
	const callback = this.aync();
	setTimeout(() => {
		callback(null, context);
	}, 2000);
};

传递参数给 Loader

Webpack.config.js

module.exports = {
	module: {
		rules: [
			{
				loader: 'loader名称',
				// 选项值(参数)
				options: {
					name: 'hcj',
					age: 23
				}
			}
		]
	}
}
/**
 * 给 loader 传递参数
 * 1. 通过 loader-utils 这个库来获取参数
 * 2. 通过getOptions获取到传入的options参数
 */
module.exports = function (context, map, mate) {
	const options = this.getOptions();
	console.log('options', options);
	return context;
};

如果需要校验参数,可以使用 schema-utils 这个库进行对 options 参数的校验

自定义 loader 解析 md 文件

// 用于解析 md 文件内容
const { Marked } = require('marked');
const { markedHighlight } = require('marked-highlight');
const hljs = require('highlight.js');

const marked = new Marked(
	// 解析代码时高亮
	markedHighlight({
		langPrefix: 'hljs language-',
		highlight(code, lang) {
			const language = hljs.getLanguage(lang) ? lang : 'plaintext';
			return hljs.highlight(code, { language }).value;
		}
	})
);

module.exports = function (context) {
	const htmlContent = marked.parse(context);
	const innerContent = '`' + htmlContent + '`';
	// 模块化导出 这样可以通过 import 方式导入使用
	return `var code = ${innerContent}; export default code`;
};

main.js

import redme from '../REDME';
// 将解析的 md 内容添加到页面中
document.body.innerHTML = redme;