Как импортировать как новую копию объекта? - PullRequest
0 голосов
/ 27 июня 2018

В моем приложении «Реакция» я хочу использовать библиотеку (money.js) из двух компонентов с разными настройками.

Эта библиотека:
http://openexchangerates.github.io/money.js/
http://openexchangerates.github.io/money.js/money.js

Я проверил, что javascript использует ссылку, поэтому два компонента на самом деле ссылаются на одно и то же.

Создает ли импорт новую копию импортированной библиотеки?

Импорт переменной ES6 по ссылке или копии

Возможно ли это без изменения исходного кода (в идеале), я могу сделать что-то вроде следующего

// a.js
import fx from 'money'
fx.rates={USD:1, EUR: 2.001}

// b.js
import fx from 'money'
fx.rates={USD:1, EUR: 2.002}

В моей ситуации я заметил, что изменение ставок в b.js также влияет на a.js.

Ответы [ 3 ]

0 голосов
/ 27 июня 2018

Вы можете клонировать объект оценки в каждом файле: -

var localRatesVariable = Object.assign({}, fx.rates);

0 голосов
/ 27 июня 2018

Модули оцениваются один раз, это одно из их основных свойств. Можно переоценить модуль в некоторой среде, которая поддерживает его (Node.js), но не в клиентском приложении.

В этом случае библиотека жестко запрограммирована для использования fx.rates object . Даже если он скопирован, он продолжит использовать его.

Надлежащим способом является изменение исходного кода библиотеки для поддержки нескольких экземпляров.

Альтернативой является создание оболочки, которая взламывает библиотеку и ведет себя так, как ожидается. Учитывая, что это convert метод, который использует fx.rates и он синхронный, его можно пропатчить, чтобы поменять свойство rates во время вызова:

import fx from 'money'

export default function fxFactory(rates) {
  return Object.assign({}, fx, {
    convert(...args) {
      let convertResult;
      const ratesOriginal = fx.rates;
      try {
        fx.rates = rates;
        convertResult = fx.convert(...args);
      } finally {
        fx.rates = ratesOriginal;
      }
      return convertResult;
    }
  });
}

// a.js
import fxFactory from './fx'
const rates={USD:1, EUR: 2.001};
const fx1 = fxFactory(rates);
0 голосов
/ 27 июня 2018

Нет, нет единого универсального способа клонирования модуля или загрузки его отдельных копий. Возможно, вы сможете сделать это, но это будет зависеть от конкретного способа кодирования модуля.

К сожалению, используемая вами библиотека не имеет понятия экземпляра вместо того, чтобы делать все глобальным для библиотеки. Возможно, вы захотите добавить эту концепцию в библиотеку и отправить исходный репо-запрос на извлечение (если они отклонят его, вы всегда можете создать ответвление).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...