簡體   English   中英

有沒有辦法在webpack中指定特定依賴的目標解析?

[英]Is there any way to specify the target resolution for a specific dependency in webpack?

假設我們的依賴項具有以下package.json描述為:

{
  "name": "some-dependency",
  "exports": {
    ".": {
      "browser": {
        "import": "...",
        "require": "..."
      },
      "node": {
        "import": "...",
        "require": "..."
      },
    }
  }
}

如何使 webpack 僅針對some-dependency單獨解析node導出?。 我試過這樣的事情:

module.exports = {

  // ...

  resolve: {

    extensions: [".jsx", ".js"],
    conditionNames: ["node", "some-dependency"],
  },
};

但它適用於全球並且似乎沒有正確完成工作。

conditionNames屬性與優先順序無關。 它是關於使用哪些字段。 優先順序由exports object key 順序決定。

此外,在您的情況下,無法通過任何 Webpack 配置來實現此目的。 您將必須構建自己的插件以使用enhanced-resolver添加自定義解析器邏輯。 例如:

const { readFileSync } = require('fs');
const path = require('path');

// The module for which you need custom resolution
const targetDependency = 'some-dependency';

class MyCustomResolver {
  constructor(source, target) {
    this.source = source;
    this.target = target;
  }

  apply(resolver) {
    const target = resolver.ensureHook(this.target);

    resolver
      .getHook(this.source)
      .tapAsync('MyCustomResolver', (request, resolveContext, callback) => {
        // Any logic you need to create a new `request` can go here
        let newRequest = { ...request };

        if (request.request === targetDependency) {
          // Modify your newRequest object here.
          // Step 1: Read package.json of `some-dependency`.
          const json = JSON.parse(readFileSync(`node_module/${targetDependency}/package.json`));

          // Step 2: Extract required object
          const node = json.exports['.'].node;

          // Step 3: Modify newRequest object (Example only)
          newRequest.request = path.join(__dirname, 'node_modules', node.require);

          // Step 4. Modify additional param of request object if any
        }

        // Call the resolution function.
        resolver.doResolve(target, newRequest, null, resolveContext, callback);
      });
  }
}

module.exports = {
  resolve: {
    plugins: [
      MyCustomResolver
    ]
  }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM