kuyin-webpack-plugins
Version:
custom webpack, enhanced-resolve plugins
56 lines (55 loc) • 2.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const utils_1 = require("../utils");
function ensureExtension(path, extension) {
if (utils_1.getExtension(path) !== '') {
return path;
}
return `${path}.${extension}`;
}
function normalizeOptions({ sourceModule, destModule }) {
const result = {
normalSourceModule: sourceModule,
normalDestModule: destModule,
};
if (typeof sourceModule === 'string') {
result.normalSourceModule = new RegExp(sourceModule);
}
if (typeof destModule === 'string') {
result.normalDestModule = request => {
const innerRequest = request.request || request.path;
const extension = utils_1.getExtension(innerRequest);
const newRequest = {};
Object.keys(request).forEach(key => {
const val = request[key];
if (typeof val === 'string') {
newRequest[key] = val.replace(ensureExtension(sourceModule, extension), ensureExtension(destModule, extension));
}
else {
newRequest[key] = val;
}
});
return newRequest;
};
}
return result;
}
// 构建时替换module
class ReplaceModuleResolvePlugin {
constructor(options) {
this.options = options;
}
apply(resolver) {
const { normalSourceModule, normalDestModule } = normalizeOptions(this.options);
resolver.getHook('existing-file').tapAsync('ReplaceModuleResolvePlugin', (request, resolveContext, callback) => {
const innerRequest = request.request || request.path;
// 不需要替换的场景提前返回
if (!normalSourceModule.test(innerRequest)) {
return callback();
}
const newRequest = normalDestModule(request);
return resolver.doResolve('resolved', newRequest, 'ReplaceModuleResolvePlugin', resolveContext, callback);
});
}
}
exports.ReplaceModuleResolvePlugin = ReplaceModuleResolvePlugin;