typescript - Hogyan készítsek ESM/CJS modult úgy, hogy ne kelljen '.default'-ot hozzáadni az importokhoz
Be tudom állítani a package.json fájlomat úgy, hogy különböző importokat használjon CJS és ESM esetén:
"main": "dist/cjs/index.js",
"module": "dist/esm/index.js",
A TypeScript fordítómat is be tudom állítani úgy, hogy két kiadást hozzon létre:
// for ESM
{
"compilerOptions": {
"module": "es2020",
"target": "es2015",
"declaration": true,
"esModuleInterop": true,
"moduleResolution": "node",
"forceConsistentCasingInFileNames": true,
"outDir": "./dist/esm"
},
"include": [
"src/**/*"
]
}
// for CJS
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "CommonJS",
"outDir": "./dist/cjs"
},
És mindkettőt futtathatom a tsc segítségével, hogy létrehozzak egy dist mappát, benne egy cjs és egy esm mappával:
"build": "tsc -p tsconfig.json && tsc -p tsconfig-cjs.json"
Azonban, amikor ezt tesztelem, úgy tűnik, hogy mindkét példámhoz hozzá kell adnom a .default-t:
// CJS
const someClass = require('package').default
const instance = new someClass()
// ESM
import someClass from 'package'
const instance = new someClass.default("")
Hogyan kerülhetem el a hozzáadott .default használatát, amely mindkét példában szükséges?
A csomagom egyszerűen egyetlen osztályt exportál:
import someClass from './class';
export default someClass;
Ahol az osztály is egyszerű:
class someClass { constructor() {} }
export default someClass
Válasz #1
Az exportálás alapértelmezett nélkül más szintaxist igényel:
class someClass { constructor() {} }
export = someClass
(Ahhoz, hogy egy ilyen exportot importálj egy TypeScript projektben, be kell állítanod az esModuleInterop kapcsolót.)
