#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
флаг.)