Свертывание с CommonJS, импорт и экспорт с treehaking

Я пытаюсь заставить работать rollup, commonjs, es6 и tree shaking правильно.

В настоящее время у меня есть следующий сценарий сборки:

'use strict';

const rollup = require('rollup');
const resolve = require('rollup-plugin-node-resolve');
const commonjs = require('rollup-plugin-commonjs');

rollup.rollup({
  input: 'main.js',
  format: 'iife',
  plugins: [
    {
      transform(code, id) {
        return code;
      }
    },
    resolve({
      extensions: ['.js', '.jsx']
    }),
    commonjs({
      extensions: ['.js', '.jsx']
    })
  ]
})
.then(({ generate }) => generate({
  format: 'iife',
  name: 'test',
}))
.then(({ code }) => console.log(code));

который загружает следующий main.js файл

const { firstFunction } = require('./exports');

firstFunction();

и файл export.js

export function firstFunction() {
  return this.name;
}

export function secondFunction() {
  return this.name;
}

выводит следующее:

var test = (function () {
'use strict';

function firstFunction$1() {
  return this.name;
}

function secondFunction() {
  return this.name;
}


var exports$1 = Object.freeze({
    firstFunction: firstFunction$1,
    secondFunction: secondFunction
});

var require$$0 = ( exports$1 && undefined ) || exports$1;

const { firstFunction } = require$$0;

firstFunction();

var main = {

};

return main;

}());

Я не уверен, что это правильное поведение, я предполагал, что смогу использовать встряхивание дерева с файлом es6 export.js и, следовательно, мне не нужно будет импортировать secondFunction() из export.js в наш связанный код.

Я пробовал несколько комбинаций настроек, но, похоже, ничто не может заставить работать дрожание дерева.

Стоит отметить, что я использую commonjs на сервере и пытаюсь использовать один и тот же файл, связанный с клиентом - вот почему у меня есть смесь cjs и es6.


person Prisoner    schedule 04.10.2017    source источник
comment
если возможно, используйте import вместо require   -  person Lux    schedule 05.10.2017
comment
@Lux Мне нужно использовать commonjs для main.js, поскольку он работает на узле.   -  person Prisoner    schedule 05.10.2017
comment
Это не имеет смысла, если вы используете export в export.js (при условии, что отсутствующий s является опечаткой). И вы это транспилируете import. Вся идея свертки состоит в том, чтобы удалить все import и заменить их одним единственным IIFE (или чем угодно)   -  person Lux    schedule 05.10.2017
comment
Дело в том, что я использую commonjs на сервере и хочу поделиться этим фрагментом кода с клиентом (это файл представления, написанный с помощью jsx). Если мы говорим, что на 100% нет способа заставить commonjs встряхнуть деревья, я посмотрю на другие решения, но тот факт, что cjs требует экспортного файла с именем es6 - я предполагал, что это сработает.   -  person Prisoner    schedule 06.10.2017


Ответы (1)


Как заявил Lux в комментариях, проблема в том, что вы смешиваете модули cjs и ES. Кажется, что rollup-plugin-commonjs не мешает импорту.

Сначала вы должны объединить свои файлы с помощью накопительного пакета и использовать cjs в качестве выходного формата. Затем вы require пакет.

Это должно привести к тому, что ваш javascript treehaken будет готов к работе с узлом.

person pishpish    schedule 05.10.2017
comment
Как я уже упоминал в другом комментарии, я использую commonjs на сервере и хочу поделиться этим фрагментом кода с клиентом (это файл представления, написанный с помощью jsx). Если мы говорим, что 100% нет способа заставить commonjs встряхнуть деревья, то я посмотрю на другие решения, но тот факт, что cjs требует экспортного файла с именем es6 - я предполагал, что это сработает. - person Prisoner; 06.10.2017
comment
Я не совсем понимаю тебя. Разве вы не можете изменить require в main.js на import? - person pishpish; 06.10.2017
comment
Неа. Потому что тогда узел не сможет его запустить. Экспорт с именем es6 пока недоступен в узле. - person Prisoner; 06.10.2017
comment
Если вы используете свертку на main.js (и он использует исключительно синтаксис модуля ES), вы получите модуль, который можно использовать в узле, с преимуществами treehaking. - person pishpish; 07.10.2017
comment
Я знаю, но я действительно хотел бы использовать commonjs на сервере и перенести его для использования на клиенте. - person Prisoner; 08.10.2017