node_modules打包失败(Webpack或Browserify)

时间:2016-05-25 16:51:11

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

我正在尝试使用webpack或browserify捆绑我的node.js应用程序,但我需要一些后端模块,如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

谢谢:)

3 个答案:

答案 0 :(得分:1)

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

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

Webpack can manage simple dynamic requires,但它仅适用于易于解析的规则。如果你真的想出于任何原因想要使用webpack,你可以查看ContextReplacementPlugin,但我认为这不值得付出努力。

答案 1 :(得分:1)

我有这个确切的问题,最后通过将其添加到我的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,那么您必须明确地在您的项目中安装普通的webpack模块,并在您的webpack配置文件中使用它。

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

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

答案 2 :(得分:0)

我一直在努力使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