javascript - Puppeteer cu TypeScript nu funcționează cu esModuleInterop


Dacă încerc să folosesc puppeteer cu TypeScript și esModuleInterop=true setat în tsconfig.json, primesc o eroare care spune

puppeteer.launch nu este o funcție

dacă încerc să import puppeteer cu

import * as puppeteer from "puppeteer";

Acum la întrebarea mea: Este acesta un comportament intenționat sau un bug?

Pentru mine, nu e mare lucru să setezi esModuleInterop pe false, dar pare ciudat


Mic adaos:

dacă schimb manual puppeteer.launch() în puppeteer.default.launch() în index.js funcționează


Legături :

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

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

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

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

Răspuns #1

Folosește sintaxa import puppeteer from 'puppeteer' sau scapă de flagul esModuleInterop.

Cu mult timp în urmă, când limbajul TypeScript a fost dezvoltat, specificația modulelor ECMAScript era încă în stadiu de proiect. Mai mult, direcția TypeScript ca limbaj era ușor diferită: echipa TypeScript nu ezita să adauge funcționalități incompatibile cu ES. Una dintre aceste funcționalități este sintaxa modulelor.

import * as smth from 'smth' este un cod TypeScript valid, dar nu este cod ECMAScript.
import smth from 'smth' este un cod ECMAScript valid, dar nu este o construcție TypeScript validă.

Flagul esModuleInterop înseamnă literal „vom folosi importuri ECMAScript în codul nostru”.
Acum, când oamenii au adoptat și au iubit sintaxa modulelor ES, acest flag este, probabil, standardul.

Un articol mai detaliat

Răspunsul #2

Încearcă asta:

import { launch } from 'puppeteer';

Atunci tot ce trebuie să faci este:

const browser = await launch();