首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在webpack5中创建外部插件?

如何在webpack5中创建外部插件?
EN

Stack Overflow用户
提问于 2021-06-01 00:24:36
回答 1查看 67关注 0票数 0

我试着创建了一个外挂,可以请教webpack不要捆绑的东西。因为线程插件不接受webpack的外部设置,所以它只能使用插件来做外部的事情。

我尽了最大努力做到这一点:

代码语言:javascript
复制
const ModuleFilenameHelpers = require('webpack/lib/ModuleFilenameHelpers');
const ExternalModule = require('webpack/lib/ExternalModule');

class ExternalsPlugin {
  constructor(options) {
    this.options = options;
  }

  apply(compiler) {
    const options = this.options;
    compiler.hooks.normalModuleFactory.tap('ExternalsPlugin', function (nmf) {
      nmf.hooks.resolve.tapAsync(
        {
          name: 'NormalModuleFactory',
          stage: 100,
        },
        function (module, callback) {
          if (ModuleFilenameHelpers.matchObject(options, module.createData.resource)) {
            const { context, dependencies } = module;
            const newModule = new ExternalModule(module.request, options.type || compiler.options.output.libraryTarget);
            callback(null, newModule);
          }
          callback(null);
        },
      );
    });
  }
}

但是它上升了

代码语言:javascript
复制
callback is not a function
TypeError: callback is not a function
    at /Users/linonetwo/Desktop/repo/TiddlyGit-Desktop/node_modules/webpack/lib/util/AsyncQueue.js:352:5
    at Hook.eval [as callAsync] (eval at create (/Users/linonetwo/Desktop/repo/TiddlyGit-Desktop/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:6:1)
    at AsyncQueue._handleResult (/Users/linonetwo/Desktop/repo/TiddlyGit-Desktop/node_modules/webpack/lib/util/AsyncQueue.js:322:21)
    at /Users/linonetwo/Desktop/repo/TiddlyGit-Desktop/node_modules/webpack/lib/util/AsyncQueue.js:305:11
    at /Users/linonetwo/Desktop/repo/TiddlyGit-Desktop/node_modules/webpack/lib/Compilation.js:1780:5
    at /Users/linonetwo/Desktop/repo/TiddlyGit-Desktop/node_modules/webpack/lib/NormalModuleFactory.js:761:5
    at eval (eval at create (/Users/linonetwo/Desktop/repo/TiddlyGit-Desktop/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:13:1)
    at /Users/linonetwo/Desktop/repo/TiddlyGit-Desktop/node_modules/webpack/lib/NormalModuleFactory.js:322:16
    at Hook.eval [as callAsync] (eval at create (/Users/linonetwo/Desktop/repo/TiddlyGit-Desktop/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:6:1)
    at /Users/linonetwo/Desktop/repo/TiddlyGit-Desktop/node_modules/webpack/lib/NormalModuleFactory.js:304:31
    at Hook.eval [as callAsync] (eval at create (/Users/linonetwo/Desktop/repo/TiddlyGit-Desktop/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:6:1)
    at /Users/linonetwo/Desktop/repo/TiddlyGit-Desktop/node_modules/webpack/lib/NormalModuleFactory.js:288:30
    at eval (eval at create (/Users/linonetwo/Desktop/repo/TiddlyGit-Desktop/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:16:1)
    at /Users/linonetwo/Desktop/repo/TiddlyGit-Desktop/webpack.plugins.js:39:11
    at _next0 (eval at create (/Users/linonetwo/Desktop/repo/TiddlyGit-Desktop/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:8:1)
    at eval (eval at create (/Users/linonetwo/Desktop/repo/TiddlyGit-Desktop/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:30:1)

那么,是否有人知道如何使用插件正确地将某些模块声明为外部模块?

EN

回答 1

Stack Overflow用户

发布于 2021-06-01 00:58:35

这就是答案:

代码语言:javascript
复制
const ModuleFilenameHelpers = require('webpack/lib/ModuleFilenameHelpers');
const ExternalModule = require('webpack/lib/ExternalModule');

class ExternalsPlugin {
  constructor(options) {
    this.options = options;
  }

  apply(compiler) {
    const options = this.options;
    compiler.hooks.normalModuleFactory.tap('ExternalsPlugin', function (nmf) {
      nmf.hooks.resolve.tapAsync(
        {
          name: 'NormalModuleFactory',
          stage: 100,
        },
        function (module, callback) {
          if (ModuleFilenameHelpers.matchObject(options, module.createData.resource)) {
            const { context, dependencies } = module;
            const newModule = new ExternalModule(module.request, options.type || compiler.options.output.libraryTarget, module.createData.userRequest);
            callback(null, newModule);
          } else {
            callback(null);
          }
        },
      );
    });
  }
}

我忘了在second callback(null)周围添加其他内容

代码语言:javascript
复制
 else {
            callback(null);
          }

所以回调两次,第二次抛出错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67777325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档