По моему опыту, модули Common JS и ES являются современными технологиями. Возможно, вы решите пропустить Common JS, тогда вы будете жить без транспиляции. Однако многие фреймворки и другие библиотеки по-прежнему используют Common JS, и они не могут использовать модули ES.
В качестве упрощенного подхода вы можете сделать следующее:
First : написать все как модули ES по умолчанию и выложить пакет для использования в качестве модулей ES по умолчанию (например, установить "type":"module"
в вашем пакете. json и использовать .mjs
в качестве файла окончание).
Затем : Используйте Babel, но только для создания общего JS запасного варианта ваших модулей. Это может выглядеть так:
Добавьте следующие зависимости dev в ваш проект. (Существуют другие плагины Babel для особых случаев синтаксиса; обычно Babel скажет вам, какие из них нужны):
npm install --save-dev @babel/cli @babel/core @babel/plugin-syntax-import-meta @babel/plugin-transform-modules-commonjs
Затем добавьте следующий блок в ваш пакет. json:
"babel": {
"plugins": [
[ "@babel/plugin-transform-modules-commonjs" ],
[ "@babel/plugin-syntax-import-meta" ]
]
}
Теперь вы можете перенести свои модули ES в Common JS с помощью простой строки кода оболочки:
# assuming your ES modules are in the lib/ directory
for script in $(find lib/ -iname '*.mjs' | grep -v test.mjs | sed -e 's|.mjs||g'); do
npx babel $script.mjs > $script.cjs
done
Вы также можете добавить это как скрипт в ваш пакет. json.
"scripts": {
"build": "for script in $(find lib/ -iname '*.mjs' | grep -v test.mjs | sed -e 's|.mjs||g'); do npx babel $script.mjs > $script.cjs; done"
}
Теперь вы можете запустить это с npm run build
, добавить его в качестве ловушки фиксации или запустить его перед отправкой в реестр NPM. Вы также можете создать папку, отличную от той, в которой находятся ваши модули ES, и исключить эту папку с помощью .gitignore.
Так я создал несколько своих библиотек (по тем же причинам), и они отлично работают - как в Common JS, так и в средах с модулями ES.
Кстати, NodeJS содержит некоторую документацию по отгрузочным пакетам как для модулей ES, так и для Common JS: https://nodejs.org/api/esm.html#esm_dual_commonjs_es_module_packages