Use compiler.webpack if available

This will use compiler.webpack if it is available.
Otherwise, it will fall back to require webpack lazily.
This will make the plugin compatible with NextJS 10.

Closes https://github.com/microsoft/monaco-editor-webpack-plugin/issues/141
pull/2748/head
Konstantin Pschera 4 years ago
parent c124699f22
commit 3e40369a31

@ -1,5 +1,5 @@
import type * as webpack from 'webpack';
import * as path from 'path';
import * as webpack from 'webpack';
import * as loaderUtils from 'loader-utils';
import * as fs from 'fs';
import { AddWorkerEntryPointPlugin } from './plugins/AddWorkerEntryPointPlugin';
@ -139,7 +139,7 @@ class MonacoEditorWebpackPlugin implements webpack.WebpackPluginInstance {
}
});
const rules = createLoaderRules(languages, features, workers, filename, publicPath, compilationPublicPath);
const plugins = createPlugins(workers, filename);
const plugins = createPlugins(compiler, workers, filename);
addCompilerRules(compiler, rules);
addCompilerPlugins(compiler, plugins);
}
@ -247,7 +247,9 @@ function createLoaderRules(languages: IFeatureDefinition[], features: IFeatureDe
];
}
function createPlugins(workers: ILabeledWorkerDefinition[], filename: string): AddWorkerEntryPointPlugin[] {
function createPlugins(compiler: webpack.Compiler, workers: ILabeledWorkerDefinition[], filename: string): AddWorkerEntryPointPlugin[] {
const webpack = compiler.webpack ?? require('webpack');
return (
(<AddWorkerEntryPointPlugin[]>[])
.concat(workers.map(({ id, entry }) =>

@ -1,8 +1,4 @@
import * as webpack from 'webpack';
const webpackVersion = require('webpack/package.json').version;
const SingleEntryPlugin = require('webpack/lib/SingleEntryPlugin');
const LoaderTargetPlugin = require('webpack/lib/LoaderTargetPlugin');
const WebWorkerTemplatePlugin = require('webpack/lib/webworker/WebWorkerTemplatePlugin');
import type * as webpack from 'webpack';
export interface IAddWorkerEntryPointPluginOptions {
id: string;
@ -13,6 +9,8 @@ export interface IAddWorkerEntryPointPluginOptions {
}
function getCompilerHook(compiler: webpack.Compiler, { id, entry, filename, chunkFilename, plugins }: IAddWorkerEntryPointPluginOptions) {
const webpack = compiler.webpack ?? require('webpack');
return function (compilation: webpack.Compilation, callback: (error?: Error | null | false) => void) {
const outputOptions = {
filename,
@ -22,13 +20,14 @@ function getCompilerHook(compiler: webpack.Compiler, { id, entry, filename, chun
globalObject: 'this',
};
const childCompiler = compilation.createChildCompiler(id, outputOptions, [
new WebWorkerTemplatePlugin(),
new LoaderTargetPlugin('webworker'),
new webpack.webworker.WebWorkerTemplatePlugin(),
new webpack.LoaderTargetPlugin('webworker'),
]);
const SingleEntryPlugin = webpack.EntryPlugin ?? webpack.SingleEntryPlugin;
new SingleEntryPlugin(compiler.context, entry, 'main').apply(childCompiler);
plugins.forEach((plugin) => plugin.apply(childCompiler));
childCompiler.runAsChild((err?: Error, entries?: webpack.Chunk[], compilation?: webpack.Compilation) => callback(err));
childCompiler.runAsChild((err?: Error) => callback(err));
}
}
@ -41,8 +40,10 @@ export class AddWorkerEntryPointPlugin implements webpack.WebpackPluginInstance
}
apply(compiler: webpack.Compiler) {
const webpack = compiler.webpack ?? require('webpack');
const compilerHook = getCompilerHook(compiler, this.options);
if (webpackVersion < '4') {
const majorVersion = webpack.version.split('.')[0]
if (parseInt(majorVersion) < 4) {
(<any>compiler).plugin('make', compilerHook);
} else {
compiler.hooks.make.tapAsync('AddWorkerEntryPointPlugin', compilerHook);

Loading…
Cancel
Save