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...