webpack plugin源码解析(五) ignorePlugin

作用

  • 忽略某些模块打包,被忽略的模块不能被其他模块引用,否则仍然会被打包进最终的结果中。
new webpack.IgnorePlugin({
  resourceRegExp: /o1/,  // 要忽略模块的 request 请求正则
  contextRegExp: /src/, // 要忽略模块所在的上下文目录的正则
}),

涉及 webpack API

  • normalModuleFactory 普通模块工厂解析

    • 通过 import、require 引入的模块
compiler.hooks.normalModuleFactory.tap("IgnorePlugin", nmf => {
	nmf.hooks.beforeResolve.tap("IgnorePlugin", (resolveData)=>{
		this.checkIgnore(resolveData,'normal')
	});
});
  • require.context 上下文目录匹配

    • 自动搜索指定目录下的所有符合条件的模块,并将它们打包到最终的打包结果中
    • require.context 接受三个参数:一个要搜索的目录,一个表示是否搜索子目录的布尔值,以及一个用于匹配模块文件名的正则表达式
const context = require.context('./src', true, /\.js$/);

context.keys().forEach((key) => {
  const module = context(key);
})

  • contextModuleFactory 上下文引入模块解析

    • 通过 require.context 引入的模块
compiler.hooks.contextModuleFactory.tap("IgnorePlugin", cmf => {
	cmf.hooks.beforeResolve.tap("IgnorePlugin", (resolveData)=>{
		this.checkIgnore(resolveData,'context')
	});
});

实现

constructor

class IgnorePlugin {
	constructor(options) {
		validate(options);
		this.options = options;
		this.checkIgnore = this.checkIgnore.bind(this);
	}
}

apply

apply(compiler) {
	// 普通模块工厂
	compiler.hooks.normalModuleFactory.tap("IgnorePlugin", nmf => {
		// 在模块解析前触发,return false 忽略模块,return undefined 处理模块
		nmf.hooks.beforeResolve.tap("IgnorePlugin", (resolveData)=>{
			this.checkIgnore(resolveData,'normal')
		});
	});
	
	// 上下文模块工厂
	compiler.hooks.contextModuleFactory.tap("IgnorePlugin", cmf => {
		// 在模块解析前触发,return false 忽略模块,return undefined 处理模块
		cmf.hooks.beforeResolve.tap("IgnorePlugin", (resolveData)=>{
			this.checkIgnore(resolveData,'context')
		});
	});
}

checkIgnore

  • 根据正则匹配要忽略的模块
checkIgnore(resolveData,type) {
	console.log(type)
	if (
		"checkResource" in this.options &&
		this.options.checkResource &&
		// resolveData.request:"./src/index.js"
		// resolveData.context:"/xxx/Desktop/webpack/wb"
		this.options.checkResource(resolveData.request, resolveData.context)
	) {
		return false;
	}

	if (
		"resourceRegExp" in this.options &&
		this.options.resourceRegExp &&
		this.options.resourceRegExp.test(resolveData.request) 
	) {
		if ("contextRegExp" in this.options && this.options.contextRegExp) {
			// if "contextRegExp" is given,
			// both the "resourceRegExp" and "contextRegExp" have to match.
			if (this.options.contextRegExp.test(resolveData.context)) {
				return false;
			}
		} else {
			return false;
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值