Rollup заменяет импорт узловых модулей относительными путями

У меня проблема с Rollup и rollup-plugin-node-resolve.

Если у меня есть импорт такого типа:

import _ from 'lodash';

он преобразуется в:

import _ from '../node_modules/lodash/lib/index.js';

Это разрывает пакет, когда я пытаюсь использовать его внутри проекта, который использует Webpack, потому что папка node_modules, очевидно, не является дочерней по отношению к папке моего пакета, связанного с Rollup (поскольку npm выравнивает зависимости).

Я уже определяю все node_modules как external.

Это моя соответствующая конфигурация:

{
  entry: 'dist/components-index.js',
  external: id => id.indexOf('node_modules') >= 0,
  plugins: [
    resolve({
      extensions: ['.jsx', '.js', '.json'],
    }),
    commonjs({
      namedExports: { '../xxx-styles/lib/index.js': ['common', 'dark', 'light' ] },
    }),
  ],
}

Как я могу сделать так, чтобы сборка сохраняла импорт модулей узлов с сохранением абсолютных путей? Я хотел бы сохранить их по мере написания, чтобы node.js / webpack / wathever мог правильно разрешить импорт.


person Fez Vrasta    schedule 21.07.2017    source источник


Ответы (1)


Вы хотите пометить lodash как внешний до разрешения:

{
  entry: 'dist/components-index.js',
  external: ['lodash', ...],
  plugins: [
    resolve({
      extensions: ['.jsx', '.js', '.json'],
    }),
    commonjs({
      namedExports: { '../xxx-styles/lib/index.js': ['common', 'dark', 'light' ] },
    }),
  ],
}

Хороший способ пометить все зависимости как внешние - использовать поле "dependencies" в файле package.json:

// rollup.config.js
import resolve from 'rollup-plugin-node-resolve';
import commonjs from 'rollup-plugin-commonjs';
import pkg from './package.json';

export default {
  entry: 'dist/components-index.js',
  external: Object.keys(pkg.dependencies),
  plugins: [
    resolve({
      extensions: ['.jsx', '.js', '.json'],
    }),
    commonjs({
      namedExports: { '../xxx-styles/lib/index.js': ['common', 'dark', 'light' ] },
    }),
  ],
}

Поскольку вы отмечаете все в node_modules как внешние, я бы порекомендовал не возиться с плагином resolve - если вы явно говорите о расширениях файлов (на которых Rollup, вероятно, будет настаивать в ближайшем будущем, чтобы повысить совместимость с собственными загрузчиками модулей в браузерах. ), она вам не понадобится.

person Rich Harris    schedule 21.07.2017
comment
Я уже использую external: id => id.indexOf('node_modules') >= 0,, чтобы пометить все зависимости node_modules как внешние, почему этого недостаточно? - person Fez Vrasta; 21.07.2017
comment
Поскольку к этому моменту файл был разрешен, он не становится «неразрешенным». Цель состоит в том, чтобы позволить вам указать, что конкретные файлы в исходном коде не должны объединяться по какой-либо причине - для сторонних пакетов вы должны исключить предварительное разрешение идентификатора. - person Rich Harris; 21.07.2017
comment
Я не совсем понимаю ... если я помещаю консольный журнал в функцию external, он возвращает путь, включая node_modules, поэтому он должен вернуть true и быть исключенным в соответствии с документацией? - person Fez Vrasta; 21.07.2017
comment
Кроме того, с вашим предложением, если я импортирую react-transition-group/CSSTransitionGroup, он не будет обнаружен как внешний - person Fez Vrasta; 21.07.2017
comment
Это исключено! Но путь уже решен. Только не включайте плагин resolve - это действительно просто. Если вы настаиваете на разрешении, сделайте что-нибудь вроде id => id !== myEntryFile && id[0] !== '.' - person Rich Harris; 22.07.2017
comment
Я говорю, что он не исключается, потому что Rollup сообщает мне, что он исключил его, потому что не смог его разрешить. В то время как другие пакеты не вызывают ошибок - person Fez Vrasta; 22.07.2017
comment
Хорошо, да, вам нужно добавить react-transition-group/CSSTransitionGroup в external. - person Rich Harris; 23.07.2017
comment
Это кошмар ???? - person Fez Vrasta; 23.07.2017
comment
Послушайте, почему вы используете resolve? Похоже, все ваши проблемы были бы решены, если бы вы просто не использовали это - person Rich Harris; 23.07.2017
comment
Потому что вся кодовая база уже использует это соглашение, и команда им довольна. Честно говоря, я ожидал, что моя настраиваемая внешняя функция будет работать как есть, я собираюсь отправить PR против документа, чтобы объяснить, что внешняя функция не предназначена для того, что все думают ... - person Fez Vrasta; 23.07.2017