Можно ли как-нибудь остановить moment.js
загрузку всех локалей (мне просто нужен английский) при использовании веб-пакета? Я смотрю на источник, и кажется, что если hasModule
определено, что это для веб-пакета, то он всегда пытается в require()
каждой локали. Я почти уверен, что для исправления требуется запрос на удаление. Но есть ли способ исправить это с помощью конфигурации веб-пакета?
Вот мой конфиг веб-пакета для загрузки моментов:
resolve: {
alias: {
moment: path.join(__dirname, "src/lib/bower/moment/moment.js")
},
},
Тогда везде, где мне это нужно, я просто делаю require('moment')
. Это работает, но он добавляет около 250 КБ ненужных языковых файлов в мой комплект. Также я использую бауэр-версию момента и глотка.
Также, если это не может быть исправлено конфигурацией веб-пакета, здесь есть ссылка на функцию, в которую он загружает локали . Я попытался добавить && module.exports.loadLocales
к if
заявлению, но я думаю, что веб-пакет на самом деле не работает так, как это будет работать. Это просто require
не смотря ни на что. Я думаю, что сейчас используется регулярное выражение, поэтому я не знаю, как бы вы его исправили.
источник
nmp
вместоbower
?Ответы:
Код
require('./locale/' + name)
может использовать каждый файл вlocale
директории. Таким образом, веб-пакет включает в себя каждый файл как модуль в вашем комплекте. Он не может знать, какой язык вы используете.Есть два плагина , которые полезны, чтобы дать веб-пакету больше информации о том, какой модуль должен быть включен в ваш пакет:
ContextReplacementPlugin
иIgnorePlugin
.require('./locale/' + name)
называется контекстом (требование, которое содержит выражение). Webpack выводит некоторую информацию из этого фрагмента кода: каталог и регулярное выражение. Здесь:directory = ".../moment/locale"
regular expression = /^.*$/
. Таким образом, по умолчанию каждый файл вlocale
каталоге включен.ContextReplacementPlugin
Позволяет переопределить выведенную информацию т.е. обеспечить новое регулярное выражение (выбрать языки , которые вы хотите включить).Другой подход заключается в игнорировании потребности с
IgnorePlugin
.Вот пример:
источник
new webpack.IgnorePlugin(/^\.\/lang$/, /moment$/)
из вашего комментария на GitHub будет работать.plugins: [ new webpack.IgnorePlugin(/^\.\/locale$/, [/moment$/]) ],
который работал просто отлично.В нашем проекте я включаю момент, подобный этому:
import moment from 'moment/src/moment';
и это, кажется, делает свое дело. Наше использование момента очень простое, поэтому я не уверен, будут ли какие-либо несоответствия с SDK. Я думаю, что это работает, потому что WebPack не знает, как статически найти файлы локали, поэтому вы получаете предупреждение (его легко скрыть, добавив пустую папку вmoment/src/lib/locale/locale
), но ни одна локаль не включает.источник
moment
библиотека выйдет с версией 3 github.com/moment/moment/milestone/15 в какой-то момент.Надлежащая модульная
moment
библиотека в какой-то момент выйдет с версией 3, так что в настоящее время я использую angular-cli без--eject
использования только https://github.com/ksloan/moment-mini likeimport * as moment from 'moment-mini';
источник
Основываясь на ответе Адама Маккрмика, вы были близки, измените свой псевдоним на:
источник
С
webpack2
последними версиями вы можете сделать:И тогда в
webpack.config.js
вас делают:источник
mainFields: ...