Npm Модуль ES не работает с Express / Babel - PullRequest
0 голосов
/ 20 февраля 2020

Во-первых, весь код доступен в этом репозитории , чтобы легко его попробовать. (и пакет опубликован в npm, поэтому его можно использовать в качестве теста)

Я пытаюсь сделать так, чтобы этот простой NPM пакет ESModule работал в обратном направлении с Nodejs Common JS + babel.


Пакет (1-npm-package в репозитории Github)

пакет. json

{
  "name": "test-es6-module-npm-package",
  "version": "0.1.0",
  "description": "Text NPM package ESModule",
  "main": "src/index.js",
  "type": "module",
  "author": "ArthyFiciel"
}

источник / индекс. js

export const sayHello = (name) => {
  console.log(`[Npm module package]: Hello ${name}`);
};

Ps: этот пакет опубликован для npm и может использоваться с npm i test-es6-module-npm-package и import { sayHello } from 'test-es6-module-npm-package'


ОШИБКА (4-commonjs-express-with-babel-and-esm в репозитории Github)

Этот проект представляет собой простой Express сервер, использующий пакет Babel.

. json (Поставьте только ссылку, чтобы избежать больших файлов)

src / index, js

import express from 'express';

import { sayHello } from 'test-es6-module-npm-package'; // <<< THIS CAUSING ERROR

const PORT = process.env.PORT || 7000;
const app = express();

app.listen(PORT, async () => {
  sayHello(`I'm server on port ${PORT}`);
});

Но когда я пытаюсь запустить его, я получаю ошибка:

/test-es6-module/4-commonjs-express-with-babel-and-esm/node_modules/test-es6-module-npm-package/src/index.js:1
export const sayHello = (name) => {
^^^^^^

SyntaxError: Unexpected token 'export'
    at Module._compile (internal/modules/cjs/loader.js:895:18)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
    at Module.load (internal/modules/cjs/loader.js:815:32)
    at Function.Module._load (internal/modules/cjs/loader.js:727:14)
    at Module.require (internal/modules/cjs/loader.js:852:19)
    at require (internal/modules/cjs/helpers.js:74:18)
    at Object.<anonymous> (/home/arthyficiel/Dev/GrilledCode/StackOverflow/test-es6-module/4-commonjs-express-with-babel-and-esm/dist/index.js:11:32)
    at Module._compile (internal/modules/cjs/loader.js:959:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
    at Module.load (internal/modules/cjs/loader.js:815:32)

Проект GitHub также предоставляет 2 других теста:

  • 2-express Сервер ESModule express, который подтверждает пакет работает.
  • 3-commonjs-express-with-babel Точно такие же проекты (4-commonjs-express-with-babel-and-esm) без каких-либо ссылок nce к моему пакету, работает нормально.

версия узла v12.14.0

NPM версия v6.13.4

1 Ответ

0 голосов
/ 21 февраля 2020

Хорошо, после многих исследований я обнаружил, что Babel не связывает ваши зависимости с вашим проектом. Таким образом, проект Common JS не может реализовать пакет чистого ESM (но должен использовать пакет-обертку, который просто переносит пакет ESM в Common JS).

Лучшее решение (сторона пакета), которое я нашел для публикации sh Гибридный пакет:

  • Разработка пакета:
    • в качестве ESM (с использованием type:"module" на root package.json)
    • в src/
  • Добавьте Babel, чтобы создать версию Common JS (в каталог ./lib)
    • , затем запустите сценарий транспиляции на publishOnly npm script
    • и не забудьте добавить {type:"commonjs"} на ./lib (я сделал это с echo \"{\\\"type\\\":\\\"commonjs\\\"}\" > ./lib/package.json в конце prepublishOnly)
  • Укажите обе версии (EsM и CJS) для пакета Root. json:
    • "main":"lib/index.js" // Common JS версия
    • "exports":"./src/index.js" // Версия ESM по умолчанию

Github: Я добавил этот ответ (и другие примеры) в репозиторий: npm -package-with- cjs -поддержка

Примечание: Я все еще ищу решение на стороне root -проекта, а не на стороне пакета. Может быть, способ найти все чистые esm и связать их вместе?

Дополнительные ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...