【问题标题】:In our library, how to tell webpack to skip dependencies?在我们的库中,如何告诉 webpack 跳过依赖项?
【发布时间】:2016-08-12 01:11:43
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: node.js webpack officedev


    【解决方案1】:

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

    默认情况下,当你的 webpack 构建中 target 为 node 时,package.json 字段中的解析将默认为 main 字段,否则,browser 字段默认优先。

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

    【讨论】:

    【解决方案2】:

    已接受的答案和评论中提供的链接显示了如何执行此操作,因此对这些链接 +1,但只是在此处直接显示它

    有没有办法定义我们的库,这样如果消费者使用 webpack target: web,它会跳过对 node-fetch 的要求检查

    是的。在库的package.json 中,添加一个browser 字段,其中包含以下内容

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

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


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

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

    "browser": {
      "node-fetch": "./shims/node-fetch.js"
    }
    

    【讨论】:

      猜你喜欢
      • 2018-03-06
      • 1970-01-01
      • 1970-01-01
      • 2018-03-03
      • 1970-01-01
      • 2010-10-28
      • 2019-08-13
      • 2017-07-03
      • 1970-01-01
      相关资源
      最近更新 更多