it-swarm.com.ru

Как запретить моменту.js загружать локали с помощью веб-пакета?

Здравствуйте, есть ли в любом случае, вы можете остановить moment.js от загрузки всех локалей (мне просто нужен английский), когда вы используете webpack? Я смотрю на источник, кажется, что если hasModule определен, что он для веб-пакета, то он всегда пытается потребовать () каждой локали. Я почти уверен, что для исправления требуется запрос на удаление. Но в любом случае мы можем это исправить с помощью конфигурации веб-пакета.

Вот мой конфиг веб-пакета для загрузки моментов

resolve: {
            alias: {
                moment: path.join(__dirname, "src/lib/bower/moment/moment.js")
            },
        },

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

Также, если это не может быть исправлено конфигурацией веб-пакета, здесь есть ссылка на функцию, в которую он загружает локали https://github.com/moment/moment/blob/develop/moment.js#L760- L772 Я попытался добавить "&& module.exports.loadLocales" к оператору if, но я думаю, что webpack не работает так, как это работает, просто требует, что бы я не использовал регулярное выражение, поэтому я не Я действительно не знаю, как бы ты все исправил. В любом случае спасибо за любую помощь.

193
epelc

Код require('./locale/' + name) может использовать каждый файл в каталоге locale. Таким образом, веб-пакет включает каждый файл как модуль в ваш пакет. Он не может знать, какой язык вы используете.

Существуют два плагина , которые помогают веб-пакету получить больше информации о том, какой модуль должен быть включен в ваш пакет: ContextReplacementPlugin и IgnorePlugin.

require('./locale/' + name) называется context (требование, которое содержит выражение). Веб-пакет выводит некоторую информацию из этого фрагмента кода: каталог и регулярное выражение. Здесь: directory = ".../moment/locale"regular expression = /^.*$/. Таким образом, по умолчанию каждый файл в каталоге locale включен.

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

Другой подход - игнорировать требование с помощью IgnorePlugin.

Вот пример:

var webpack = require("webpack");
module.exports = {
  // ...
  plugins: [
    new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /de|fr|hu/)
    // new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
  ]
};
287
Tobias K.

В наш проект я включил момент, подобный этому: import moment from 'moment/src/moment';, и это, похоже, помогает. Наше использование момента очень простое, поэтому я не уверен, будут ли какие-либо несоответствия с SDK. Я думаю, что это работает, потому что WebPack не знает, как статически найти файлы локали, поэтому вы получаете предупреждение (его легко спрятать, добавив пустую папку в moment/src/lib/locale/locale), но ни одна локаль не включает.

7
Adam McCormick

С webpack2 и последними версиями момента вы можете сделать:

import {fn as moment} from 'moment'

И затем в webpack.config.js вы делаете:

resolve: {
    packageMains: ['jsnext:main', 'main']
}
2
Kevin

Надлежащая модульная библиотека moment прийдет с Версия в какой-то момент, так что в настоящее время я использую angular-cli без --eject Я только что закончил использовать https://github.com/ ksloan/moment-mini нравится import * as moment from 'moment-mini';

2
Kuncevič

Основываясь на ответе Адама Маккрмика, вы были близки, измените свой псевдоним на:

resolve: {
    alias: {
        moment: 'moment/src/moment'
    },
},
2
bigopon