Puppeteer 的流类型定义会阻止使用默认导出吗?

jtb*_*des 6 flowtype flow-typed puppeteer

考虑操纵木偶的launch()方法。Puppeteer 自述文件中的使用指南推荐使用const puppeteer = require(\'puppeteer\')然后puppeteer.launch()

\n\n
\n
const puppeteer = require(\'puppeteer\');\n\n(async () => {\n  const browser = await puppeteer.launch();\n  const page = await browser.newPage();\n  await page.goto(\'https://example.com\');\n  await page.screenshot({path: \'example.png\'});\n\n  await browser.close();\n})();\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

并且 Puppeteer 本身导出一个实例,这似乎进一步确认了默认导出的含义:

\n\n
\n
module.exports = new Puppeteer(__dirname, preferredRevision, isPuppeteerCore);\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

但是,puppeteer \xe2\x89\xa51.12使用的 Flow 类型定义declare export function launch()并不包含默认导出,因此Flow 要求我编写import { launch } from "puppeteer"而不是import puppeteer from "puppeteer".

\n\n

但使用命名导入会产生TypeError: Cannot read property \'_launcher\' of undefined同样,我们可以通过简单的测试来确认这不起作用(Node v10.15.0,puppeteer 1.19.0):

\n\n
const puppeteer = require("puppeteer");\npuppeteer.launch();  // works\n
Run Code Online (Sandbox Code Playgroud)\n\n
const { launch } = require("puppeteer");\nlaunch();  // TypeError: Cannot read property \'_launcher\' of undefined\n
Run Code Online (Sandbox Code Playgroud)\n\n

(大概这是因为在调用时const { launch } =给了我一个未绑定的方法 \xe2\x80\x94 this === undefined。)

\n\n
\n\n

尝试 2:在 Flow 中,您还可以使用命名空间 import import * as puppeteer from "puppeteer",但似乎这明确放弃了对默认导出的访问,而是生成了TypeError: puppeteer.launch is not a function

\n\n

(我对 TypeScript 不太熟悉,但是Puppeteer 的 DefinelyTyped defs也使用export function launch()而不是默认导出。也就是说,它们似乎打算与 一起使用import * as puppeteer from "puppeteer",尽管我不确定为什么这会在它不起作用时起作用\ Flow 中没有;也许 TypeScript 处理 ES6 模块的方式有所不同?)

\n\n
\n\n

那么,我的想法是错误的,还是 Flow 类型定义错误?(既然如此,怎么没有人遇到过这个问题呢?)

\n