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

时间:2016-08-12 01:11:43

标签: node.js webpack officedev

我们有一个传统上只有客户端的库。它使用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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 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"
}