Moment.js - отличная библиотека для работы со значениями datetime в javascript, но у нее есть некоторые недостатки. Когда вы устанавливаете его как библиотеку npm и собираете с помощью webpack, он по умолчанию включает все языковые версии, поэтому пакет большой.
Взгляните на первый пример:
1. По умолчанию все языковые стандарты в одном файле.
Давай попробуем. Создайте новый проект узла:
mkdir project-with-moment cd project-with-moment npm init npm install moment npm install webpack --save-dev
Создайте файл конфигурации для webpack
const path = require('path'); module.exports = () => { return { output: { path: path.resolve(__dirname, 'build'), filename: 'app.js', }, entry: './src/index.js', }; };
И очень простой index.js в каталоге src.
import moment from 'moment'; console.log(moment().format('dddd'));
Попробуйте собрать это приложение.
node .\node_modules\webpack\bin\webpack.js
Он создает один пакет app.js размером 470 КБ. Это действительно здорово. И почему? Потому что даже локализация моментов на эсперанто входит в комплект. Давай избавимся от этого.
2. Используйте только один язык
Чаще всего используется только один языковой стандарт - английский или ваш родной язык.
Для этого вы можете использовать собственный плагин webpack, чтобы игнорировать некоторые файлы. Конфигурация нового веб-пакета выглядит так:
const webpack = require('webpack'); const path = require('path'); module.exports = () => { return { output: { path: path.resolve(__dirname, 'build'), filename: 'app.js', }, entry: './src/index.js', plugins: [ new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), ], }; };
Если вы хотите использовать только английский, вы закончили. Момент без локалей всего 133 кБ. Намного лучше.
Теперь вы можете импортировать другие локали, которые будут включены в комплект.
import 'moment/locale/cs.js'; import 'moment/locale/es.js';
3. Импортируйте все языковые стандарты как асинхронные блоки.
Лучшим решением для многоязычных приложений было бы разделение локалей моментов на части. С webpack это очень просто. Сначала обновите конфигурацию:
const webpack = require('webpack'); const path = require('path'); module.exports = () => { return { output: { path: path.resolve(__dirname, 'build'), filename: '[name].js', chunkFilename: 'chunks/[name]-[chunkhash].js', }, entry: { app: './src/index.js' }, plugins: [ new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), new webpack.optimize.CommonsChunkPlugin({ names: ['app'], async: true, }) ], }; };
Как видите, мы будем создавать чанки в собственном каталоге. Самым важным изменением является добавление подключаемого модуля фрагментов общего доступа. Каждая локаль зависит от кода momentjs. Это добавило бы код momentjs к каждому языку. Используя этот плагин, мы можем извлечь этот код в один файл - app.js. Мы также хотим загружать чанк асинхронно.
Чтобы загрузить языковой стандарт в ваше приложение, используйте метод импорта:
import('moment/locale/' + locale + '.js')
Обещание возврата метода импорта. Помните, что на данный момент языком по умолчанию является английский, он уже есть в пакете, и вам не нужно загружать его как фрагмент. Это не применимо, если вы хотите загрузить региональную английскую версию.
Если вы хотите увидеть более сложный пример с асинхронным загрузчиком, посмотрите мою суть - https://gist.github.com/fabulator/d0f5b8b441e88be3a4b0b7f8eb6275c8