是否可以在webpack中创建自定义解析器?

Vit*_*kov 19 webpack

需要模块时,我有自己的约定.例如require("./components/SettingsPanel");应该解决require("./components/SettingsPanel/SettingsPanel.js");

有没有办法创建这样的解析器?

Ric*_*ven 35

是的,这是可能的.为了避免歧义和更容易实现,我们将使用前缀哈希符号作为约定的标记:

require("#./components/SettingsPanel");
Run Code Online (Sandbox Code Playgroud)

然后将其添加到您的配置文件中(当然,您可以稍后重构):

var webpack = require('webpack');
var path = require('path');

var MyConventionResolver = {
  apply: function(resolver) {
    resolver.plugin('module', function(request, callback) {
      if (request.request[0] === '#') {
        var req = request.request.substr(1);
        var obj = {
          path: request.path,
          request: req + '/' + path.basename(req) + '.js',
          query: request.query,
          directory: request.directory
        };
        this.doResolve(['file'], obj, callback);
      }
      else {
        callback();
      }
    });
  }
};


module.exports = {
    resolve: {
      plugins: [
        MyConventionResolver
      ]
    }
    // ...
};
Run Code Online (Sandbox Code Playgroud)

  • @Marko我也在寻找这个。但在那之前,您可以打印参数变量 (3认同)
  • 另见:https://github.com/webpack/docs/wiki/list-of-plugins#resolverplugin和https://github.com/webpack/webpack/blob/master/lib/ResolverPlugin.js#L13 (2认同)
  • 请您提供有关 resolver.plugin 和 doResolve 作为参数接受的文档的链接。我试过了,但找不到。这还不够:https://webpack.js.org/api/resolvers/,我什至不确定它是同一回事。除了挖掘源代码之外,似乎没有关于如何制作这些东西的明确说明,这不是最快的做事方式。 (2认同)

jso*_*nUK 13

创建了一个更新的示例以使用Webpack v4。为了向后兼容,故意不使用 ES6 语法。如果你愿意,你可以把它变成一个类。

您可以在https://github.com/webpack/enhanced-resolve阅读有关解析器示例的更多信息。

感谢里卡多提供原始答案。

var webpack = require('webpack');
var path = require('path');

function MyConventionResolver (source, target) {
    this.source = source || 'resolve';
    this.target = target || 'resolve';
}

MyConventionResolver.prototype.apply = function(resolver) {
    var target = resolver.ensureHook(this.target);
    resolver.getHook(this.source).tapAsync('MyConventionResolver', function(request, resolveContext, callback) {
        if (request.request[0] === '#') {
            var req = request.request.substr(1);
            var obj = Object.assign({}, request, {
                request: req + '/' + path.basename(req) + '.js',
            });
            return resolver.doResolve(target, obj, null, resolveContext, callback);
        }
        callback();
    });
}


// In your Webpack Config
module.exports = {
    ...
    resolve: {
        plugins: [new MyConventionResolver()]
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,webpack v4 [仅支持](https://github.com/webpack/webpack/blob/webpack-4/package.json#L85) [支持类语法](https://developer. mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes#Browser_compatibility) (2认同)