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