Использование Rollup для преобразования только в CommonJS без объединения

Как лучше всего решить эту проблему, описанную ниже?

... или мне следует использовать что-то другое, кроме Rollup для этой задачи?

...

Предположим, я разрабатываю библиотеку foo, которая предоставляет два модуля es6 a.js и b.js (т.е. разрешает import a from foo/a и import b from foo/b)

Исходные модули es6

// src/a.js
export default function a(x) { return x+'!' }

...

// src/b.js
import a from './a.js'
export default function b() { return a('Hi') }

Затем я хочу преобразовать как a.js, так и b.js в модули CommonJs и сохранить их в корневой папке проекта. Итак, я хочу, чтобы строка import a from './a' превратилась только в const a = require('./a') и пропустила объединение. Вот так:

Желаемый вывод CommonJS

// a.js
module.exports = function a(x) { return x+'!' }

...

// b.js
const a = require('./a')
module.exports = function b() { return a('Hi') }

Моим первым побуждением было использовать что-то вроде external: (id) => id!==currentFile в rollup.config.js, чтобы определить все родственные модули как внешние. Это почти работает, но в результате относительный путь импорта переписывается на const a = require('./src/a') (импорт es6-версии a.js из папки src).

Фактический результат

// a.js
module.exports = function a(x) { return x+'!' }

...

// b.js
const a = require('./src/a')
module.exports = function b() { return a('Hi') }

person Már Örlygsson    schedule 16.05.2018    source источник
comment
По сути, вы получаете лишний /src, который вам не нужен?   -  person Tarun Lalwani    schedule 18.05.2018
comment
да. Rollup рассматривает путь к внешнему модулю как фиксированную цель, и поэтому для экспортированного модуля CommonJS требуется версия es6 a.js   -  person Már Örlygsson    schedule 18.05.2018
comment
Можете ли вы дать образец репо с конфигурацией накопительного пакета, я хочу убедиться, что я отлаживаю его, находясь на одной странице с вами   -  person Tarun Lalwani    schedule 19.05.2018


Ответы (2)


Вы можете использовать это:

// rollup.config.js
export default {
    input: ['src/a.js', 'src/b.js'],
    output: {
        dir: '.',
        format: 'cjs'
    },
    experimentalCodeSplitting: true,
}
person Isidrok    schedule 19.05.2018
comment
Спасибо. Почему-то это кажется почти непреднамеренным побочным эффектом experimentalCodeSplitting, но он работает - за исключением некоторой дополнительной беспорядочной инъекции, вызванной тем, что выглядит как ошибка в функции разделения кода. (Я подниму этот вопрос на Github). - person Már Örlygsson; 20.05.2018
comment
Я действительно не думаю, что это побочный эффект (не путайте экспериментальныйCodeSplitting с экспериментальнымDynamicImports), это больше похоже на взлом, чтобы передать несколько входных файлов для объединения и получить их с тем же именем, что и у выходных. - person Isidrok; 20.05.2018

Также стоит упомянуть хук rollup resolveId, потому что он позволяет более точно контролировать исключение, а также путь импорта для замены. Из сводного документа:

resolveId

Тип: (источник: строка, импортер: строка) => строка | ложь | null | {id: строка, внешний ?: логический, moduleSideEffects ?: логический | null} Тип: асинхронный, первый

Определяет настраиваемый преобразователь. Резолвер может быть полезен, например, для поиск сторонних зависимостей. Возврат null относится к другим функциям resolveId и, в конечном итоге, к поведению разрешения по умолчанию; возвращает ложные сигналы о том, что источник следует рассматривать как внешний модуль и не включать в комплект. Если это произойдет для относительного импорта, идентификатор будет перенормирован так же, как при использовании внешнего параметра.

Если вы возвращаете объект, то можно разрешить импорт с другим идентификатором, одновременно исключив его из пакета. Это позволяет заменять зависимости внешними зависимостями, при этом пользователю не нужно вручную отмечать их как «внешние» с помощью параметра external:

resolveId(source) {
  if (source === 'my-dependency') {
    return {id: 'my-dependency-develop', external: true};
  }
  return null;
}

Относительные идентификаторы, то есть начинающиеся с ./ или ../, не будут перенормированы при возврате объекта. Если вы хотите этого поведения, вместо этого верните абсолютное расположение файловой системы как id.

Если для moduleSideEffects возвращается false в первом хуке, который разрешает идентификатор модуля, и никакой другой модуль ничего не импортирует из этого модуля, то этот модуль не будет включен без проверки фактических побочных эффектов внутри модуля. Если возвращается значение true, Rollup будет использовать свой алгоритм по умолчанию для включения всех операторов в модуль, которые имеют побочные эффекты (например, изменение глобальной или экспортированной переменной). Если возвращается null или флаг опущен, то moduleSideEffects будет определяться параметром treehake.moduleSideEffects или по умолчанию true. Перехватчики загрузки и преобразования могут переопределить это.

person Craig Hicks    schedule 09.08.2019