在我们的库中,如何告诉webpack跳过依赖项?

问题描述 投票:2回答:2

我们有一个传统上只有客户端的库。它使用HTTP Request(或其他几个依赖库)来进行REST调用。使用该库时,用户将使用特定的请求提供程序进行初始化,然后关闭它们。

我们在示例中使用webpack来使用我们的库。

它现在扩展为使用node-fetch,所以如果有人想从也支持的nodejs中使用它。

对于使用webpack的人来说,webpack现在正在尝试打包节点,并且浏览器中的require调用失败。我们可以通过设置外部来解决这个问题

"externals" : {
    "node-fetch": "{}"
}

有没有办法定义我们的库,以便如果消费者使用webpack target:web,它会跳过node-fetch的require检查?同样,如果消费者使用webpack target:nodejs - 它需要包含node-fetch组件。

有问题的项目是https://github.com/OfficeDev/PnP-JS-Core

node.js webpack officedev
2个回答
2
投票

感谢您报告此事。因此,根据This commit and conversation linked to it,自动模块解析字段(也称为webpack解析器实例的described-resolve)会根据您的目标而改变。

默认情况下,当webpack构建中的target为node时,package.json字段中的分辨率将默认为main字段else,browser字段默认优先。

更多参考https://github.com/webpack/webpack/issues/151


1
投票

接受的答案和评论中提供的链接显示了如何执行此操作,因此+1给那些,但只是直接在这里表面

有没有办法定义我们的库,以便如果消费者使用webpack target:web,它会跳过node-fetch的require检查

是。在库的package.json中,添加一个browser字段,如下所示

"browser": {
  "node-fetch": false
}

这为webpack和其他捆绑包提供了一个提示,即node-fetch模块应该被忽略 - 即,当目标是web时,甚至不会尝试将其包含在捆绑中。当目标是node时,它将被包括在内。


请注意,上面依赖于客户端包中的代码从不使用node-fetch。从这个意义上讲,它可以被认为是不安全的,因为没有这个的编译时保证,如果它发生,它只会出错并可能导致客户端崩溃。但是,如果您完全确定它永远不会在客户端使用,那么这是完成此操作的最简单方法。

为了更安全 - 即如果您希望客户端代码仅在您尝试使用node-fetch时发出警告 - 您还可以选择为客户端捆绑包可以包含的模块提供填充程序,例如,只需在如果它被使用,则使用shim实现。您可以通过提供垫片模块的路径而不是false以相同的方式执行此操作

"browser": {
  "node-fetch": "./shims/node-fetch.js"
}
© www.soinside.com 2019 - 2024. All rights reserved.