Я создаю пакет, который поддерживает модули CommonJS и ES.У меня это работает нормально для одной точки входа.Я написал свой код как ESM и с помощью Babel скомпилировал его в CJS перед публикацией.Соответствующий бит моего package.json
выглядит следующим образом:
"main": "cjs/",
"module": "esm/",
"scripts": {
"test": "jest ./test",
"clean": "rm -rf cjs",
"build": "npm run clean && babel esm --out-dir cjs",
"prepare": "npm test && npm run build"
}
Так что мой index.js
находится в esm/index.js
, а cjs/index.js
не существует до публикации пакета.Если пакет включен с помощью require
(например, const myPackage = require('my-package')
), он будет извлекать из cjs/
.Если он импортирован (например, import myPackage from 'my-packge'
), он извлечет из esm/
.
Моя проблема в том, что я хочу иметь возможность импортировать другие файлы из пакета (например, import adapter from 'my-package/adapters/mysql'
или const adapter = require('my-package/adapters/mysql')
),Но если я включу его таким образом, файл не будет найден.
Я могу импортировать его, используя полный путь (например, import adapter from 'my-package/esm/adapters/mysql'
или const adapter = require('my-package/cjs/adapters/mysql')
).Но я не хочу явно указывать тип модуля в пути.Кажется, что узел уже знает, как определить разницу между CJS и модулем ES (он знает, что требуется от main
и импорт из module
), поэтому я надеюсь, что можно сделать то же самое с несколькими файлами.
Есть ли способ включить пакет, как я описал выше, без необходимости явно указывать путь к esm/
или cjs/
?