我正在写一个自定义的Webpack loader,想在处理文件时拿到这个文件在磁盘上的绝对路径,但不知道怎么取。试过用this.resourcePath,但不确定是不是正确的做法,文档看得有点懵。
比如我的loader是这样写的:
module.exports = function (source) {
// 想在这里拿到当前处理文件的完整路径
console.log('file path?', ???);
return source;
};
有没有人知道具体该用哪个属性?或者有没有官方推荐的方式?
在 loader 里确实可以用
this.resourcePath拿到当前文件的绝对路径,这是官方推荐的方式,没毛病。不过得注意一点:
this.resourcePath是同步可用的,但有些场景下你可能还想拿到资源的查询参数、loader上下文什么的,建议直接用this上的几个常用属性组合着用:-
this.resourcePath:当前文件的绝对路径(含文件名)-
this.resourceQuery:路径后面的查询字符串(比如?raw)-
this.context:当前 loader 所在目录的绝对路径(通常是 module 的目录)-
this.loaders:当前匹配到的所有 loader 列表你这例子直接这么写就行:
补充个坑:如果你用的是 async loader(返回 promise 或用
this.async()),那这些属性依然可用,但得在回调里用this,别丢了上下文。要是你发现路径不对,大概率是 loader 的配置顺序或者
include/exclude写错了,这种情况我调试过不少次,建议用console.log(this.loaders)打出来看一眼 loader 是不是被正确匹配到了。this.resourcePath,这个是对的,Webpack 的 loader 上下文里确实提供了这个属性,它返回的就是当前处理文件的绝对路径。你写的这个 loader 可以直接改成:
补充几个相关的上下文属性,方便你后续扩展用:
this.resourceQuery是文件的 query 参数,比如file.js?inline里的?inlinethis.loaders是当前 loader 链中所有 loader 的信息this.async()可以返回异步 loaderthis.cacheable()控制是否缓存结果不过要注意,
this.resourcePath是 Webpack 4 开始推荐的写法,如果你用的是更老版本,可能得用this.resource,不过现在基本没人用 Webpack 2 了,放心用resourcePath就行。另外别把
resourcePath和context搞混了,context是 loader 的执行上下文目录,不是文件路径。有疑问再测一下就行,这玩意儿文档确实写得有点绕。