找不到模块“puppeteer”。

13
在一个 AWS Lambda/NodeJS 运行时中,我试图从绝对路径(/opt/nodejs/node_modules/puppeteer)进行导入。 源代码在本地运行良好,但是一旦使用 Webpack/serverless-webpack 进行打包并在 AWS Lambda 中运行时,require('puppeteer') 的结果为:
{"errorMessage":"Cannot find module 'puppeteer'","errorType":"Error","stackTrace":["webpackMissingModule (/var/task/src/render/handler.js:643:89)","/var/task/src/render/handler.js:643:173","next (native)","step (/var/task/src/render/handler.js:608:191)","/var/task/src/render/handler.js:608:361"]}

我已经检查过:

  • /opt处已挂载AWS Lambda Layer。
  • /opt/nodejs/node_modules/puppeteer路径是存在的。
  • NODE_PATH 正确包含了/opt/nodejs/node_modules

1
更合适的做法是包含 puppeteer-core 并将 puppeteer 作为开发依赖项,然后根据您的环境传递可执行路径到 browser.launch()。Puppeteer-core 没有捆绑 Chromium,因此您可以安全地导入和使用它。基本的 Puppeteer 包将包括用于本地开发的 Chromium,但由于是开发依赖项,因此不会被捆绑。 - Dan
5个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
21

在上传您的压缩包到亚马逊之前,您必须使用save标志安装您的模块:

npm i puppeteer --save

在这种特定情况下,结果证明 --save-dev 更为合适,但是它让我朝着正确的方向思考,谢谢! - logicalicy
欢迎!是的,你应该调整我的答案(我不知道你是否只是用puppeteer进行开发);我只是给你一个提示,祝你编码愉快。 - Abderrahim Soubai-Elidrisi

14

npm i --save puppeteer 安装的包太大了,超过了Lambda所允许的50MB限制。

因此,使用 npm i --save-dev puppeteer --ignore-scripts 安装puppeteer。(忽略安装脚本以防止安装Chromium) 需要通知 serverless-webpack 插件在打包时忽略puppeteer。(否则puppeteer将使包变得臃肿)

puppeteer模块被放置在一个层中(在问题中提到的文件夹结构中),现在可以使用 require('puppeteer') 了。


如何使其在全局范围内工作,我尝试了 sudo npm install puppeteer -g 但仍然收到相同的错误消息。 - Salem
说得好,我们可以排除掉可能不需要的Chromium。 - pix data

1
如果您正在使用stencil.js,它会给出非常相似的错误。尝试将stencil核心版本更新至"@ stencil/core": "^1.15.0"。 在您的shell提示符中尝试。
npm install -g npm-check-updates
ncu -u

1

尝试通过强制设置环境变量 $NODE_PATH 来运行您的脚本。例如:

NODE_PATH=/opt/nodejs/node_modules /path/to/bin/node your-file.js

出于特定原因,我不得不从源代码构建一个版本的node,而不影响当前的安装,这个解决方法对我很有帮助。

我根据以下问题here得出了这个解决方案。


0
npm i puppeteer --save

在上传您的压缩包之前,您必须使用保存标志安装您的模块。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,