浏览代码

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
Konstantin Pschera 4 年之前
父节点
当前提交
3e40369a31
共有 2 个文件被更改,包括 15 次插入12 次删除
  1. 5 3
      src/index.ts
  2. 10 9
      src/plugins/AddWorkerEntryPointPlugin.ts

+ 5 - 3
src/index.ts

@@ -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 }) =>

+ 10 - 9
src/plugins/AddWorkerEntryPointPlugin.ts

@@ -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);