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

İlgili makaleler