جاوااسکریپت - Puppeteer با TypeScript با esModuleInterop کار نمیکند


اگر من سعی کنم از Puppeteer با TypeScript استفاده کنم و esModuleInterop=true در tsconfig.json تنظیم شده باشد، خطایی دریافت میکنم که میگوید

puppeteer.launch یک تابع نیست

اگر سعی کنم puppeteer را وارد کنم با

import * as puppeteer from "puppeteer";

حالا به سؤال من: آیا این رفتار مورد نظر است یا یک اشکال است؟

برای من، فقط تنظیم esModuleInterop روی false مسئلهی بزرگی نیست، اما به نظر عجیب میرسد


افزونه کوچک:

اگر من بهصورت دستی puppeteer.launch() را در index.js به 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

پاسخ شماره ۱

از سینتکس import puppeteer from 'puppeteer' استفاده کنید یا پرچم esModuleInterop را حذف کنید.

زمان زیادی پیش، زمانی که زبان تایپاسکریپت توسعه یافت، مشخصات ماژولهای ECMAScript هنوز در مرحله پیشنویس بود. علاوه بر این، جهتگیری تایپاسکریپت به عنوان یک زبان کمی متفاوت بود: تیم تایپاسکریپت از اضافه کردن ویژگیهایی که با ES سازگار نبودند، دریغ نمیکرد. یکی از این ویژگیها، نحو ماژولها است.

import * as smth from 'smth' یک کد تایپاسکریپت معتبر است، اما کد ECMAScript معتبر نیست.
import smth from 'smth' یک کد ECMAScript معتبر است اما یک ساختار تایپاسکریپت معتبر نیست.

پرچم esModuleInterop به معنای واقعی کلمه این است که «ما قصد داریم از وارد کردنهای ECMAScript در کد خود استفاده کنیم».
حالا، زمانی که مردم نحو ماژولهای ES را پذیرفته و دوست دارند، میتوان گفت این پرچم به طور قابل بحثی استاندارد است.

یک مقاله جزئیتر

پاسخ شماره ۲

این را امتحان کن:

import { launch } from 'puppeteer';

سپس تمام کاری که باید انجام دهید این است:

const browser = await launch();