Как предотвратить instant.js от загрузки локалей с помощью webpack?

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

Вот моя конфигурация webpack для загрузки momentjs

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

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

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

Ответ 1

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

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

require('./locale/' + name) называется context (требование, содержащее выражение). webpack содержит некоторую информацию из этого фрагмента кода: каталог и регулярное выражение. Здесь: 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$/)
  ]
};

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

import {fn as moment} from 'moment'

И затем в webpack.config.js вы выполните:

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