Приспособьте зависимости к ES или CJS с Rollup - PullRequest
0 голосов
/ 18 октября 2019

У меня есть пакет NPM (приватный), который работает как в браузере, так и в среде Node.

Это делается путем создания отдельных пакетов через Rollup для ES и CJS, поэтому вывод выглядит следующим образом:

dist/ejs/index.js // Import this for your browswer environments
dist/cjs/index.js // Use this for Node environments

Довольно стандартно. Теперь я добавляю к этому зависимость, которая следует той же схеме связывания.

Я могу импортировать библиотеку следующим образом:

import { externalLibrary } from "@external/ejs/externalLibrary";

Все хорошо в среде браузера. Но теперь это не работает в среде Node, поскольку я импортирую не CJS.

Я мог бы изменить способ импорта библиотеки в require и нацелить на пакет cjs:

const { externalLibrary } = require("@external/cjs/externalLibrary");

И хотя это работает в обеих средах, я не думаю, что это оптимально.

Есть ли лучший способ сделать это? Некоторая конфигурация, которую я мог бы указать при экспорте пакета CJS?

module.exports = {
  input: 'src/main.js',
  output: {
    file: 'bundle.js',
    format: 'cjs'
    // Behaviour here for @external/cjs/externalLibrary ?
  }
};

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

Похоже, вы уже нашли решение для этого, но даже при старом стиле импорта

import { externalLibrary } from "@external/dist/ejs/externalLibrary";

вы должны быть в состоянии выбрать подходящие форматы для cjs против esm. При использовании накопительного пакета вам необходимо настроить конфигурацию output, чтобы она представляла собой массив объектов с соответствующим форматом. Например:

module.exports = {
    input: 'src/main.js',
    output: [{ file: 'dist/index.cjs.js', format: 'cjs' }, 
             { file: 'dist/index.esm.js', format: 'es'  }],
}

Кроме того, будучи автором klap , я бы порекомендовал попробовать его, так как по умолчанию он принесет много других оптимизаций.

0 голосов
/ 21 октября 2019

Я пропустил конфигурацию package.json. Здесь вы можете указать разные входные файлы в зависимости от сборки:

{
  ...
  "main": "dist/cjs/index.js",
  "module": "dist/ejs/index.js",
  ...
}

Затем я удалил неявный импорт файла EJS и нацелился только на пакет:

// Before:
import { externalLibrary } from "@external/dist/ejs/externalLibrary";

// After:
import { externalLibrary } from "@external";

Это гарантируетв зависимости от среды, в которой используется пакет, используется сборка CJS или ES.

...