Импорт момента-темзона и момента-диапазона с помощью webpack (Babel/ES6)

Я использую Webpack с загрузчиком Babel. Написание стандартов ES6. Я установил и момент-время и диапазон моментов с npm.

Оба эти являются плагинами moment.js, и оба они зависят от пакета момента и экспортируют отдельную библиотеку момента. Поэтому, когда я делаю

import moment from 'moment-timezone';
import moment2 from 'moment-range';

тогда я получаю две отдельные ссылки на момент.

Как я могу настроить его, чтобы использовать момент с функциями часового пояса и диапазона?

Спасибо!

Ответ 1

Документы показывают синтаксис CommonJS для этого:

var moment = require('moment');
require('moment-range');
require('moment-timezone');

// moment() now has both range and timezone plugin features

В ES6:

import moment from 'moment';
import 'moment-range';
import 'moment-timezone';

ИЗМЕНИТЬ

Так как moment-timezone не расширяет существующий импорт, а расширяет сам moment, что насчет этого?

import moment from 'moment-timezone';
import 'moment-range';

Ответ 2

У меня была эта проблема с разными пакетами: moment-timezone и frozen-moment. Корень всего зла имеет две зависимости moment в разных частях дерева. В моем случае у меня было moment прямо под node_modules, а также внутри frozen-moment node-modules. Это означало, что moment-timezone и frozen-moment использовали разные экземпляры moment.

Убедитесь, что вы используете версии пакетов, которые совместимы друг с другом, так что moment-range не нужно извлекать другую версию moment. Когда у вас это будет правильно, вы сможете это сделать:

import moment from 'moment';
import momentTimezone from 'moment-timezone';
import momentRange from 'moment-range';

console.log(moment === momentTimezone === momentRange); // logs 'true'

Имейте в виду, что только для правильной настройки теста вы должны использовать его, как в главном ответе:

import moment from 'moment';
import 'moment-timezone';
import 'moment-range';

Ответ 3

Все вышеупомянутые решения не сработали для меня, и мне пришлось прибегнуть к этому:

import moment from 'moment';
window.moment = moment;
import {extendMoment} from 'moment-range';
extendMoment(window.moment);

Немного взломан, но работает.

Ответ 4

Я нахожу стандартную реализацию моментального диапазона довольно уродливым, так как он просто расширяет моментный объект, а IMO - своего рода "хакерским".

Так я это делаю:

import { default as DateRange } from 'moment-range';

const myRange = new DateRange(x, y);