我们有一个传统上只有客户端的库。它使用HTTP Request(或其他几个依赖库)来进行REST调用。使用该库时,用户将使用特定的请求提供程序进行初始化,然后关闭它们。
我们在示例中使用webpack来使用我们的库。
它现在扩展为使用node-fetch,所以如果有人想从也支持的nodejs中使用它。
对于使用webpack的人来说,webpack现在正在尝试打包节点,并且浏览器中的require调用失败。我们可以通过设置外部来解决这个问题
"externals" : {
"node-fetch": "{}"
}
有没有办法定义我们的库,以便如果消费者使用webpack target:web,它会跳过node-fetch的require检查?同样,如果消费者使用webpack target:nodejs - 它需要包含node-fetch组件。
感谢您报告此事。因此,根据This commit and conversation linked to it,自动模块解析字段(也称为webpack解析器实例的described-resolve
)会根据您的目标而改变。
默认情况下,当webpack构建中的target为node
时,package.json字段中的分辨率将默认为main
字段else,browser
字段默认优先。
接受的答案和评论中提供的链接显示了如何执行此操作,因此+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"
}