【问题标题】:Cannot find module 'puppeteer'找不到模块'puppeteer'
【发布时间】:2019-05-14 20:23:28
【问题描述】:

在 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"]}

我已经检查过:

  • AWS Lambda 层安装在 /opt。
  • /opt/nodejs/node_modules/puppeteer 路径确实存在。
  • NODE_PATH 正确包含 /opt/nodejs/node_modules

【问题讨论】:

  • 包含puppeteer-core 并使用puppeteer 作为开发依赖项实际上更合适,然后将基于您的环境的可执行路径传递给browser.launch()。 Puppeteer-core 没有捆绑铬,因此您可以安全地导入和使用它。基本 puppeteer 包将包含用于本地开发的 chromium,但由于是开发依赖项,因此不会捆绑。

标签: node.js webpack aws-lambda serverless-framework serverless-webpack-plugin


【解决方案1】:

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

npm i puppeteer --save

【讨论】:

  • 在这种特殊情况下,事实证明--save-dev 更合适——但让我朝着正确的方向思考,谢谢!
  • 欢迎您!是的,您应该调整我的答案(我不知道您是否仅将 puppeteer 用于开发);我只是给你一个提示,祝你编码愉快
【解决方案2】:

npm i --save puppeteer 导致包太大。 (Lambda 最大 50MB。)

因此,puppeteer 是使用npm i --save-dev puppeteer --ignore-scripts 安装的。 (忽略脚本以防止安装 Chromium。)serverless-webpack 插件必须被告知忽略其包装中的 puppeteer。 (否则 puppeteer 会使包裹膨胀。)

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

【讨论】:

    【解决方案3】:

    如果您使用的是 stencil.js,它会给出非常相似的错误。尝试将 stencil 核心版本更新到至少 "@stencil/core": "^1.15.0"

    在你的 shell 提示符下尝试

    npm install -g npm-check-updates
    ncu -u
    

    【讨论】:

      【解决方案4】:

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

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

      出于某种特定原因,我必须在不影响当前安装的情况下从源代码构建节点版本,这种解决方法对我有用。

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

      【讨论】:

        猜你喜欢
        • 2020-05-19
        • 2020-04-29
        • 1970-01-01
        • 2022-12-15
        • 2018-02-21
        • 2021-07-23
        相关资源
        最近更新 更多