Как опубликовать пакет sh dual npm (модули Common JS +), чтобы субмодули были равномерно импортированы - PullRequest
1 голос
/ 02 февраля 2020

Я изо всех сил пытался упаковать пакет NPM так, чтобы он объединял как общие JS, так и ES-модули, но либо импортировался с одинаковым абсолютным путем к модулю. Не только основной модуль.

Например, у меня может быть каталог, в котором обе сборки имеют свои каталоги или каталог внутри пакета

/package
  /modules
    index.js
    submodule.js
  /node
    index.js
    submodule.js

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

Таким образом, вызов require('package/submodule') будет загружать /package/node/submodule.js, а import submodule from 'package/submodule' будет загружать /package/modules/submodule.js

Возможно ли это вообще, особенно если это не влияет на потребителей и работает со старыми версиями узла?

Я пробовал разные вещи, такие как условный экспорт, type=module, но столкнулся с проблемами, когда jest + babel- jest пытается импортировать не тот модуль.

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Хотя я не слишком доволен тем местом, в котором мы находимся, лучшим вариантом представляется esm

. Я настроил свои библиотеки, как показано в файле readme, так что в конечном итоге в пакете только одна сборка, а не модули + общая js двойная сборка, о которой я спрашивал

0 голосов
/ 28 марта 2020

Это недостаточно хорошо документировано или очевидно, но это возможно в Узле 13.7.0+ с использованием условного экспорта, мало чем отличающегося от , как вы бы сделали для главной точки входа . Ваши модули ES должны будут использовать расширение .mjs.

node_modules/package/package.json

{
    "main": "./node/index.js",
    "exports": {
        ".": [
            {
                "import": "./modules/index.mjs",
                "require": "./node/index.js",
                "default": "./node/index.js"
            },
            "./node/index.js"
        ],
        "./submodule": [
            {
                "import": "./modules/submodule.mjs",
                "require": "./node/submodule.js",
                "default": "./node/submodule.js"
            },
            "./node/submodule.js"
        ]
    }
}

node_modules/package/modules/index.mjs

export const index = 'mjs-index';

node_modules/package/modules/submodule.mjs

export const submodule = 'mjs-submodule';

node_modules/package/node/index.js

exports.index = 'cjs-index';

node_modules/package/node/submodule.js

exports.submodule = 'cjs-submodule';

Чем ваша посылка может использоваться следующим образом:

main.js

const {index} = require('package');
const {submodule} = require('package/submodule');

console.log(index);
console.log(submodule);

main.mjs

import {index} from 'package';
import {submodule} from 'package/submodule';

console.log(index);
console.log(submodule);

Вот вывод, который вы получите в Узле 13.11.0.

$ node main.js
cjs-index
cjs-submodule
$ node main.mjs
(node:44920) ExperimentalWarning: The ESM module loader is experimental.
mjs-index
mjs-submodule

Узел <13 </h2> Для более старых версий узла без поддержки субмодуля вам понадобится файл по пути субмодуля. Например, вы можете добавить эту заглушку: node_modules/package/submodule.js modules.exports = require('./node/submodule');

...