mpx-webpack-plugin
Version:
原生小程序开发套装(Mini Program X) -------------------------------
61 lines (53 loc) • 2.53 kB
JavaScript
const { Tapable, SyncBailHook, SyncWaterfallHook } = require("tapable");
const RawModule = require("webpack/lib/RawModule");
const MPXMultiModule = require("./MPXMultiModule");
const MPXSingleEntryDependency = require("./dependencies/MPXSingleEntryDependency");
const path = require("path");
const LoaderUtils = require("loader-utils");
module.exports = class MPXMultiModuleFactory extends Tapable {
constructor( resolverFactory ) {
super();
this.resolverFactory = resolverFactory;
this.hooks = {
resolvedData: new SyncWaterfallHook(["data"]),
createModule: new SyncBailHook(["data"]),
};
}
create( data, callback ) {
const dependency = data.dependencies[0];
const context = data.context;
const contextInfo = data.contextInfo;
const resolveOptions = data.resolveOptions || {};
const request = dependency.request;
this.resolverFactory.get("miniprogram", resolveOptions).resolve(
contextInfo,
context,
request,
{},
( err, resource, resourceResolveData ) => {
if ( err ) return callback(err);
resourceResolveData = this.hooks.resolvedData.call(resourceResolveData);
if ( !resourceResolveData || !resourceResolveData.miniprogramData ) {
return callback(
new Error(resource + " doesn't exist or is not a miniprogram entry")
);
}
const createdModule = this.hooks.createModule.call({ dependency, context, contextInfo, resourceResolveData });
if ( !createdModule ) {
const { files, name, context } = resourceResolveData.miniprogramData;
return callback(
null,
new MPXMultiModule({
"name": name,
"context": context,
"request": path.join(context, name),
"metadata": dependency.metadata,
"dependencies": files.map(item => new MPXSingleEntryDependency(LoaderUtils.urlToRequest(item), name, item, dependency.metadata))
})
);
}
return callback(null, createdModule);
}
);
}
}