You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

38 lines
1020 B
JavaScript

const path = require('path')
class CustomResolver {
constructor(source, target){
this.source = source || 'resolve';
this.target = target || 'resolve';
}
apply(resolver) {
const target = resolver.ensureHook(this.target);
resolver
.getHook(this.source)
.tapAsync("CustomResolver", (request, resolveContext, callback) => {
// request.request is the string path we're resolving
// match ~/[dir]/[component]
const match = request.request.match(/^\~\/([^/]*)\/([^/]*)$/)
if(!match)
return callback();
// Create a new request, and turn it into
// ./[dir]/[component]/[component].js
const newRequest = {
...request,
request: path.join(__dirname, match[1], match[2], match[2] + '.js')
}
resolver.doResolve(target, newRequest, null, resolveContext, callback);
});
}
}
module.exports = {
webpack: (config) => {
config.resolve.plugins.push(new CustomResolver())
return config
}
}