【问题标题】:Puppeteer with TypeScript not working with esModuleInterop使用 TypeScript 的 Puppeteer 无法与 esModuleInterop 一起使用
【发布时间】:2021-03-12 13:08:04
【问题描述】:

如果我尝试在 tsconfig.json 中使用带有 TypeScript 和 esModuleInterop=true 的 puppeteer,我会收到一条错误提示

puppeteer.launch 不是函数

如果我尝试用

导入 puppeteer
import * as puppeteer from "puppeteer";

现在我的问题是:这是预期的行为还是错误?

对我来说,只是将 esModuleInterop 设置为 false 没什么大不了的,但似乎很奇怪


小插件:

如果我在 index.js 中手动将 puppeteer.launch() 更改为 puppeteer.default.launch() 它可以工作


链接:

tsconfig.json:https://pastebin.com/6xvkfJg2

package.json: https://pastebin.com/ViwfMwyQ

index.ts:https://pastebin.com/GtHuiHSJ

index.js:https://pastebin.com/TzeCDiGn

【问题讨论】:

    标签: javascript typescript puppeteer tsc


    【解决方案1】:

    使用import puppeteer from 'puppeteer' 语法或去掉esModuleInterop 标志。

    很久以前,当 typescript 语言被开发出来的时候,ECMAScript 模块规范还在草稿中。此外,打字稿作为一种语言的方向略有不同:打字稿团队毫不犹豫地添加了与 ES 不兼容的功能。这些功能之一是模块语法。

    import * as smth from 'smth' 是有效的打字稿代码,但不是 ECMAScript 代码。
    import smth from 'smth' 是有效的 ECMAScript 代码,但不是有效的打字稿构造。

    标记 esModuleInterop 的字面意思是“我们将在代码中使用 ECMAScript 导入”。
    现在,当人们采用并喜欢 ES 模块语法时,这个标志可以说是标准。

    A more detailed article

    【讨论】:

      【解决方案2】:

      试试这个:

      import { launch } from 'puppeteer';
      

      那么你所要做的就是:

      const browser = await launch();
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      • 2021-12-10
      • 2018-08-28
      • 2022-11-14
      相关资源
      最近更新 更多