Избегайте использования JS Map с неизменной картой - PullRequest
0 голосов
/ 15 января 2019

Как можно избежать путаницы родной карты с Immutable.Map?

Я использую immutable.js в реактивном проекте (ES6 или новее, поставляется с babel). Поэтому многие файлы начинаются с импорта, например:

import { Map } from 'immutable';

Все нормально, пока кто-нибудь не добавит указанный выше импорт в файл, который использует нативную карту JS , так что new Map() станет Immutable.Map.

Следовательно, я могу импортировать всю неизменяемую библиотеку (import Immutable from 'immutable';) и ссылаться на нее, используя Immutable.Map. Однако это, возможно, влияет на размер получающегося кода (компилятор, вероятно, не сможет выяснить, что используется не вся импортированная библиотека) и, вероятно, выглядит не очень хорошо.

Есть ли лучшие решения? Можно ли как-то ссылаться на родную карту JS конкретно?

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Я бы порекомендовал либо импортировать Map в свой компонент более высокого порядка, и передавать его в свой компонент в качестве реквизита, либо использовать import alias (как предложено в ответе @Jared Smiths)

HigherOrderComponent

import { Map } from 'immutable';


class HigherOrderComponent extends React.Component { 
    render() {
        return <myChildComponent map={Map} />;
    }
}

myChildComponent

class HigherOrderComponent extends React.Component { 
    componentDidMount () {
        this.myMap = new this.props.Map();
    }
    render() {
       // ...
    }
}
0 голосов
/ 15 января 2019

У вас есть два варианта здесь. Мне нравится первое, но YMMV.

  1. Собственные модули JavaScript позволяют создавать псевдонимы не только для импорта всей библиотеки, но и отдельных именованных импортов : import {Map as IMap} from 'immutable';. Теперь конфликта нет, и размер вашего пакета должен быть меньше. Дополнительный бонус: цель вашего кода может стать более понятной для будущих сопровождающих, которые теперь сразу узнают, что они не имеют дело с обычными родными Картами.

  2. Фактический конструктор является свойством глобального контекста: просто ссылка window.Map не будет конфликтовать с тем, который вы импортировали в пространство имен модуля.

...