【问题标题】:node_modules packaging fail (Webpack or Browserify)node_modules 打包失败(Webpack 或 Browserify)
【发布时间】:2016-09-23 10:06:06
【问题描述】:

我正在尝试将我的 node.js 应用程序与 webpack 或 browserify 捆绑在一起,但我需要一些后端模块,例如 knex、bookshelf 等。

但是 webpack 和 browserify 无法打包这些模块,因为它们使用 require() 做了一些奇怪的事情......

我遇到了这些错误:Cannot find module 'sqlite3'Error: Cannot find module './dialects/postgres/index.js'

我不能忽略我的 node_modules 目录,因为我需要包中的模块,因为我无法访问将使用我的包的环境。 (AWS Lambda)

我不需要 webpack 或 browserify 来优化我的 node_modules 但我需要它们,有没有办法告诉 webpack 或 browserify 只捆绑 node_module 文件夹并在缺少 require 时相信我?

编辑:我正在使用无服务器来测试和部署我的 lambda,唯一允许我将 ES2015 与 babel 一起使用的插件迫使我使用 webpack / browserify

谢谢你:)

【问题讨论】:

  • 你可以只导入这些模块,通常你不需要捆绑整个模块目录
  • 我遇到了完全相同的问题。你最终找到解决方案了吗?

标签: node.js webpack browserify aws-lambda knex.js


【解决方案1】:

您可以将node_modules 合并到您的 Lambda 包(包含您在 Amazon Lambda 中上传的代码的 zip 文件)中,而无需打包它(我的意思是使用 Webpack 或 Browserify 创建一个文件)。

某些节点模块不打算在浏览器中使用,也不支持打包,因为它们使用动态需求。他们可以有充分的理由这样做,尤其是像 Bookshelf 或 Sequelize 这样的 ORM。

Webpack can manage simple dynamic requires,但它只适用于易于解析的规则。如果您出于某种原因真的想使用 webpack,您可以查看ContextReplacementPlugin,但我认为这不值得。

【讨论】:

  • 我为我的问题添加了更多上下文,以及我使用 webpack / browserify 的原因
【解决方案2】:

我遇到了这个确切的问题,最后通过将它添加到我的 webpack 配置中,让它与 webpack 一起工作(不知道 browserify):

{
  plugins: [
    new webpack.NormalModuleReplacementPlugin(/\.\.\/migrate/, '../util/noop.js'),
    new webpack.NormalModuleReplacementPlugin(/\.\.\/seed/, '../util/noop.js'),
    new webpack.IgnorePlugin(/mariasql/, /\/knex\//),
    new webpack.IgnorePlugin(/mssql/, /\/knex\//),
    new webpack.IgnorePlugin(/mysql/, /\/knex\//),
    new webpack.IgnorePlugin(/mysql2/, /\/knex\//),
    new webpack.IgnorePlugin(/oracle/, /\/knex\//),
    new webpack.IgnorePlugin(/oracledb/, /\/knex\//),
    new webpack.IgnorePlugin(/pg-query-stream/, /\/knex\//),
    new webpack.IgnorePlugin(/sqlite3/, /\/knex\//),
    new webpack.IgnorePlugin(/strong-oracle/, /\/knex\//),
    new webpack.IgnorePlugin(/pg-native/, /\/pg\//)
  ]
}

如果你像我一样使用 serverless-webpack,你必须在你的项目中显式地 npm install 普通的 webpack 模块,并在你的 webpack 配置文件中要求它。

此配置专门针对我使用 postgres 而没有 pg-native 的设置。只需忽略您不使用的模块。

构建 webpack 不需要这两个顶级插件,但它们消除了大量烦人的警告。它们可能有点危险,因为它们可以匹配 knex 以外的其他模块中的需求。无需编写自己的插件,我找不到更好的方法。

【讨论】:

    【解决方案3】:

    我正在努力让 webpack 正确捆绑 knex,并希望分享我的配置。

    我们可以改用ContextReplacementPlugin 来避免列出项目不需要的所有驱动程序,就像使用webpack.IgnorePlugin 时一样。一个附带的好处是它可以避免忽略其他模块中的这些包(正如@Erik Frisk 所提到的)。

    例如,我使用带有 mysql2 驱动程序的 mysql 数据库,我的 webpack 配置如下所示:

      plugins: [
        new webpack.ContextReplacementPlugin(/knex\/lib\/dialects/, /mysql2\/index.js/),
      ]
    

    这只会捆绑node_modules/knex/lig/dialects/mysql2/index.js,不包括其他方言,因此有效地忽略了其他包(如 oracledb、mssql 等)中的依赖关系。

    要了解有关ContextReplacementPlugin 的更多信息,请查看Webpack’s ContextReplacementPlugin examples

    【讨论】:

      猜你喜欢
      • 2017-12-01
      • 2021-12-27
      • 2021-11-26
      • 2019-08-06
      • 2017-05-09
      • 2019-10-30
      • 1970-01-01
      • 2015-08-06
      • 2016-06-28
      相关资源
      最近更新 更多