我正在尝试将我的node.js应用程序与webpack或browserify捆绑在一起,但我需要一些后端模块,如knex、书架和其他模块。
但是,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文件夹,并相信我,如果缺少一个需求?
编辑:我正在使用serverless来测试和部署我的lambda,唯一允许我在babel中使用ES2015的插件迫使我使用了webpack / browserify
谢谢您:)
发布于 2016-05-26 04:39:56
您可以将node_modules合并到您的Lambda包(包含您上传到Amazon Lambda中的代码的压缩文件)中,并且不需要对其进行打包(我的意思是使用Webpack或Browserify创建一个文件)。
有些节点模块不能在浏览器中使用,也不支持打包,因为它们使用了动态请求。他们可以有很好的理由这样做,特别是像书架或续集这样的or。
Webpack can manage simple dynamic requires,但它只适用于易于解析的规则。无论出于什么原因,如果你真的想使用webpack,你可以去看看ContextReplacementPlugin,但我不认为这是值得的。
发布于 2016-10-12 23:29:23
我确实遇到了这个问题,最终通过将以下内容添加到我的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安装普通的webpack模块,并在你的webpack配置文件中要求它。
这个配置是专门针对我的设置的,在这里我使用不带pg-native的postgres。忽略你不使用的模块。
这两个顶级插件不是webpack构建所必需的,但它们消除了大量恼人的警告。它们可能有点危险,因为它们可能会匹配knex以外的其他模块中的需求。如果不写自己的插件,我就找不到更好的方法了。
发布于 2019-04-18 22:46:15
我正在努力让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,而不包括其他方言,从而有效地忽略了其他包中的依赖性。
要查找有关ContextReplacementPlugin的更多信息,请查看Webpack’s ContextReplacementPlugin examples
https://stackoverflow.com/questions/37443286
复制相似问题