Как предотвратить 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']
}