جاوااسکریپت - 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();
