جافاسكريبت - Puppeteer مع TypeScript لا يعمل مع esModuleInterop


إذا كنت أحاول استخدام Puppeteer مع TypeScript و esModuleInterop=true مضبوطة في tsconfig.json أحصل على خطأ يقول

puppeteer.launch ليست دالة

إذا حاولت استيراد puppeteer باستخدام

import * as puppeteer from "puppeteer";

والآن إلى سؤالي: هل هذا سلوك مقصود أم خطأ؟

بالنسبة لي، ليس بالأمر الكبير مجرد تعيين esModuleInterop إلى false، لكنه يبدو غريبًا


إضافة صغيرة:

إذا قمت بتغيير puppeteer.launch() يدوياً إلى puppeteer.default.launch() في index.js فإنه يعمل


روابط :

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

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

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

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

الإجابة رقم 1

استخدم بناء الجملة import puppeteer from 'puppeteer' أو تخلص من علامة esModuleInterop.

منذ وقت طويل، عندما تم تطوير لغة تايب سكربت، كانت مواصفة وحدات ECMAScript لا تزال قيد المسودة. علاوة على ذلك، كان اتجاه تايب سكربت كلغة مختلفًا قليلًا: لم يتردد فريق تايب سكربت في إضافة ميزات غير متوافقة مع ES. واحدة من هذه الميزات هي صياغة الوحدات.

import * as smth from 'smth' هو كود تايب سكريبت صالح، لكنه ليس كود ECMAScript.
import smth from 'smth' هو كود ECMAScript صالح لكنه ليس بناءً صالحًا في تايب سكريبت.

العلم esModuleInterop يعني حرفيًا "سنستخدم استيرادات ECMAScript في كودنا".
الآن، عندما تبنى الناس وأحبوا صياغة وحدات ES، يمكن القول إن هذا العلم أصبح المعيار.

مقالة أكثر تفصيلاً

الإجابة رقم 2

جرب هذا:

import { launch } from 'puppeteer';

ثم كل ما عليك فعله هو:

const browser = await launch();