node.js - Uvoz CommonJS modula u Typescript projekt koji izvozi ESModule


Pravim NodeJs biblioteku u Typescriptu i planiram da podržava Node@14+. Dakle, odlučio sam bazirati ovaj projekt kao ESModule umjesto CommonJs. Sada su potrebne neke biblioteke koje su CommonJs i instaliram njihove @types. Uvozi mog typescript fajla izgledaju ovako:

import { Command } from 'commander';
import inquirer from 'inquirer';
import { resolve } from 'path';
import { render } from 'mustache';

import { copySync, readdirSync, readFile, readFileSync, writeFile } from 'fs-extra';

i tsconfig.json izgleda ovako:

{
  "include": ["src/**/*"],
  "compilerOptions": {
    // type checking
    "exactOptionalPropertyTypes": true,
    "noFallthroughCasesInSwitch": true,
    "noImplicitOverride": true,
    "noImplicitReturns": true,
    "noPropertyAccessFromIndexSignature": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "strict": true,
    // module
    "module": "ES2020",
    "moduleResolution": "node",
    "rootDir": "src",
    "resolveJsonModule": true,
    // emit
    "outDir": "dist",
    //    "importHelpers": true,
    // imterop constraints
    "allowSyntheticDefaultImports": true,
    "forceConsistentCasingInFileNames": true,
    // language and environment
    "lib": ["ES2020"],
    "target": "ES2020",
    // completeness
    "skipLibCheck": true
  }
}

Kao što možete vidjeti, cilj mi je ES2020 jer ga u potpunosti podržava Node@14+, a svoju konfiguraciju temeljim na nevjerojatnom odgovoru ovdje https://stackoverflow.com/a/61305579/5863472. Također, postavljam "type": "module" u svom package.json.

Ovo se gradi bez problema, ali se ne pokreće. Pogrešku koju baca Node je

import { copySync, readdirSync, readFile, readFileSync, writeFile } from 'fs-extra';

^^^^^^^^

SyntaxError: Navedeni izvoz 'readFile' nije pronađen. Zahtjevani modul 'fs-extra' je CommonJS modul, koji možda ne podržava sve module.exports kao nazvane izvoze.

CommonJS module uvijek se mogu uvesti putem zadanog izvoza, na primjer koristeći:

import pkg iz 'fs-extra';

const { copySync, readdirSync, readFile, readFileSync, writeFile }=pkg;

Ista baza koda se dobro kompajlira koristeći "module": "ES2020" u mom tsconfig.json i uklanjanjem ključa type u mom package.json.

Način koji sam pronašao za rješavanje ovog problema je praćenje poruke o pogrešci. Ovo radi dobro:

import { Command } from 'commander';
import inquirer from 'inquirer';
import { resolve } from 'path';
import mustache from 'mustache';
import fs from 'fs-extra';

const { copySync, readdirSync, readFile, readFileSync, writeFile } = fs;
const { render } = mustache;

Ali ovo se čini jako nezgodno i izgleda kao nešto što bi se moglo automatizirati. Nedostaje li mi neka opcija kompilacije ili nešto što može automatski pretvoriti import { foo } from 'bar' u import bar from 'bar'; const { foo }=bar.

P.S. Stvarno ne želim koristiti Babel...