node.js - Importarea unui modul CommonJS într-un proiect Typescript care exportă ESModules


Îmi fac o bibliotecă NodeJs în Typescript și plănuiesc să o fac compatibilă cu Node@14+. Așa că am decis să bazez acest proiect ca un ESModule în loc de CommonJs. Acum, există câteva biblioteci necesare care sunt CommonJs și instalez @types-urile lor. Importurile fișierului meu typescript arată astfel:

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 arată așa:

{
  "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
  }
}

Așa cum puteți vedea, țintesc ES2020 deoarece acesta este complet suportat de Node@14+ și mi-am bazat configurația pe răspunsul incredibil de aici https://stackoverflow.com/a/61305579/5863472. De asemenea, setez "type": "module" în fișierul meu package.json.

Acest lucru se compilează fără problemă, dar nu rulează. Eroarea aruncată de Node este

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

^^^^^^^^

SyntaxError: Export denumit 'readFile' nu a fost găsit. Modulul solicitat 'fs-extra' este un modul CommonJS, care poate să nu suporte toate module.exports ca exporturi denumite.

Modulele CommonJS pot fi întotdeauna importate prin exportul implicit, de exemplu folosind:

import pkg din 'fs-extra';

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

Același cod se compilează bine folosind "module": "ES2020" în tsconfig.json și eliminând cheia type din package.json.

Modul în care am găsit să rezolv această problemă este urmând mesajul de eroare. Aceasta funcționează bine:

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;

Dar asta se simte atât de anevoios și pare ceva ce ar putea fi automatizat. Îmi scapă vreo opțiune de compilare sau ceva care poate să convertească automat import { foo } from 'bar' în import bar from 'bar'; const { foo }=bar.

P.S. Chiar nu vreau să folosesc Babel...