typescript - İçe aktarmalara '.default' eklemeyi gerektirmeyen bir ESM/CJS modülünü nasıl yapabilirim
package.json dosyamı CJS ve ESM için farklı importlar kullanacak şekilde ayarlayabilirim:
"main": "dist/cjs/index.js",
"module": "dist/esm/index.js",
TypeScript derleyicimi iki dağıtım oluşturacak şekilde de ayarlayabilirim:
// 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"
},
Ve her ikisini de çalıştırabilir ve tsc kullanarak her ikisini de bir cjs ve esm klasörü içeren bir dist klasörü üretmek için çalıştırabilirim:
"build": "tsc -p tsconfig.json && tsc -p tsconfig-cjs.json"
Ancak, bunu test ettiğimde, her iki örneğime de .default eklemem gerektiği görünüyor:
// CJS
const someClass = require('package').default
const instance = new someClass()
// ESM
import someClass from 'package'
const instance = new someClass.default("")
Her iki örnekte de gerekli olan ek .default'den nasıl kaçınabilirim?
Paketim basitçe tek bir sınıf ihraç ediyor:
import someClass from './class';
export default someClass;
Sınıf da basitse:
class someClass { constructor() {} }
export default someClass
Cevap #1
Varsayılan olmayan bir dışa aktarma farklı bir sözdizimi gerektirir:
class someClass { constructor() {} }
export = someClass
(Böyle bir ihracatı TypeScript projesine ithal etmek için esModuleInterop bayrağını ayarlamanız gerekir.)
