Как создать модуль ESM / CJS, который не требует добавления ‘.default’ к импорту

#typescript #babeljs #es6-modules #commonjs #tsc

Вопрос:

Я могу настроить свой package.json для использования различных импортных файлов для CJS и ESM:

   "main": "dist/cjs/index.js",
  "module": "dist/esm/index.js",
 

Я также могу настроить свой компилятор TypeScript для создания двух дистрибутивов:

 // 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"
    },
 

И я могу запустить их оба, используя tsc, чтобы создать папку dist cjs esm как с папкой, так и с папкой:

 "build": "tsc -p tsconfig.json amp;amp; tsc -p tsconfig-cjs.json"
 

Однако, когда я проверяю это, мне кажется, что требуется добавить .default к обоим моим примерам:

 // CJS
const someClass = require('package').default
const instance = new someClass()

// ESM
import someClass from 'package'
const instance = new someClass.default("")
 

Как я могу избежать добавления .default , требуемого в обоих примерах?

Мой пакет просто экспортирует один класс:

 import someClass from './class';

export default someClass;
 

Где класс также прост:

 class someClass { constructor() {} }

export default someClass
 

Ответ №1:

Для экспорта без значения по умолчанию требуется другой синтаксис:

 class someClass { constructor() {} }

export = someClass
 

(Чтобы импортировать подобный экспорт в проект машинописи, вам необходимо установить esModuleInterop флаг.)