Встряхивание дерева не работает для библиотеки компонентов react с использованием именованного импорта

#reactjs #webpack #import #rollupjs #tree-shaking

#reactjs #webpack #импорт #rollupjs #встряхивание дерева

Вопрос:

Количество проектов нашей компании растет, поэтому мы решили перенести наш ui kit в отдельный частный пакет npm. Для сборки комплекта перед публикацией мы решили использовать накопительный пакет. Файловая структура для ui kit довольно стандартная, мы:

 src
       - Components
         - Alert
         - Button
         - Heading
         - ...
       HOC, static...

       - index.js
 

Корень index.js файл используется только для повторного экспорта всех компонентов.

 export {default as Alert} from './Components/Alert';
export {default as Button} from './Components/Button';
...
 

Наша главная цель — иметь возможность получать компоненты из нашего набора, используя именованный импорт.

 import {Alert, Button} from '@company/ui-kit';
 

Также важно правильно работающее встряхивание дерева, потому что некоторые из наших проектов используют только 2/31 компонент из комплекта, поэтому мы хотим видеть в окончательной сборке только те компоненты, которые были использованы, и это главная проблема. Мы перепробовали множество вариантов конфигурации свертки с одним выходным файлом или фрагментами и поняли, что встряхивание дерева работает только с фрагментами, и что более интересно, оно работает только с прямым импортом фрагмента, а не с именованным импортом из index.js .

 import Alert from '@company/ui-kit/Alert'; // tree shaking works, only Alert get into build
import {Alert} from '@company/ui-kit'; // tree shaking not working, all kit components are got into the build
 

Может ли кто-нибудь объяснить мне, почему это происходит? И есть ли какой-либо способ использовать именованный импорт с правильно работающим встряхиванием дерева. Что также очень любопытно, мы пытались протестировать встряхивание дерева с именованным импортом в некоторых популярных библиотеках, таких как material ui, и там это тоже не работает. Встряхивание дерева работает только при прямом импорте из чанка.

Также необходимо упомянуть, что мы тестировали встряхивание дерева только в проектах, созданных с помощью create-react-app. Я действительно не думаю, что проблема может быть внутри конфигурации create-react-app bundler, но, возможно, это поможет разобраться в этом.

Для полной картины также прикрепляем нашу конфигурацию свертки:

 import multiInput from 'rollup-plugin-multi-input';
import babel from 'rollup-plugin-babel';
import commonjs from 'rollup-plugin-commonjs';
import external from 'rollup-plugin-peer-deps-external';
import resolve from 'rollup-plugin-node-resolve';
import copy from 'rollup-plugin-copy'
import postcss from 'rollup-plugin-postcss';
import postcssUrl from 'postcss-url';
import asset from "rollup-plugin-smart-asset";

export default {
    input: ['src/index.js', 'src/Components/**/*.js'],
    output: [
        {
            dir: './',
            format: 'cjs',
            sourcemap: true,
            exports: 'auto',
            chunkFileNames: '__chunks/[name]_[hash].js'
        }
    ],
    plugins: [
        multiInput({relative: 'src/'}),
        external(),
        postcss({
            modules: false,
            extract: true,
            minimize: true,
            sourceMap: true,
            plugins: [postcssUrl({url: 'inline', maxSize: 1000})],
        }),
        copy({targets: [{src: 'src/static/icons/fonts/*', dest: 'fonts'}]}),
        babel({exclude: 'node_modules/**'}),
        asset({url: 'copy', keepImport: true, useHash: false, keepName: true, assetsPath: 'assets/'}),
        resolve(),
        commonjs({include: 'node_modules/**'})
    ]
};
 

Заранее спасибо за ваши ответы!

Комментарии:

1. Такая же проблема. В итоге вы нашли решение этой проблемы?

2. @jordanjlatimer К сожалению, нет. Похоже, единственный способ — использовать прямой импорт из фрагментов.