javascript - Puppeteer med TypeScript fungerar inte med esModuleInterop


Om jag försöker använda puppeteer med TypeScript och esModuleInterop=true inställt i tsconfig.json får jag ett fel som säger

puppeteer.launch är inte en funktion

om jag försöker importera puppeteer med

import * as puppeteer from "puppeteer";

Nu till min fråga: Är detta avsedd funktionalitet eller ett fel?

För mig är det ingen stor sak att bara ställa in esModuleInterop på false, men det verkar konstigt


Litet tillägg:

om jag manuellt ändrar puppeteer.launch() till puppeteer.default.launch() i index.js fungerar det


Länkar :

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

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

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

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

Svar #1

Använd import puppeteer from 'puppeteer'-syntax eller ta bort esModuleInterop-flaggan.

För länge sedan, när Typescript-språket utvecklades, var ECMAScript-modulspecifikationen fortfarande på utkaststadiet. Dessutom var riktningen för Typescript som språk något annorlunda: Typescript-teamet tvekade inte att lägga till funktioner som inte var kompatibla med ES. En av dessa funktioner är modulsyntaxen.

import * as smth from 'smth' är en giltig TypeScript-kod, men inte ECMAScript-kod.
import smth from 'smth' är en giltig ECMAScript-kod men är inte en giltig TypeScript-konstruktion.

Flaggan esModuleInterop betyder bokstavligen "vi kommer att använda ECMAScript-importer i vår kod".
Nu, när människor har anammat och älskat ES-modulsyntax, är denna flagga tveklöst standarden.

En mer detaljerad artikel

Svar #2

Prova detta:

import { launch } from 'puppeteer';

Då är allt du behöver göra:

const browser = await launch();