Crypto-js относится к библиотекам, которые активно используются в браузерной среде и Node.js для реализации криптографических примитивов: хеширование, симметричное шифрование, HMAC и набор вспомогательных утилит для работы с кодировками и бинарными данными. При интеграции в проекты с современными сборщиками ключевое значение имеет способ импорта, влияние на размер бандла и корректная работа в ESM/CJS окружениях.
Библиотека распространяется как CommonJS-модуль, что напрямую влияет на поведение tree-shaking и оптимизации в сборщиках. При неправильной конфигурации можно получить избыточный бандл, содержащий весь пакет целиком, даже если используется одна функция.
Пакет организован как набор независимых модулей:
crypto-js/corecrypto-js/md5crypto-js/sha256crypto-js/aescrypto-js/enc-utf8crypto-js/hmacКаждый алгоритм вынесен отдельно, но общий экспорт часто тянется через корневой модуль:
import CryptoJS from 'crypto-js';
Такой импорт удобен, но влечёт загрузку всей библиотеки. Для production-сборок это считается неоптимальным вариантом.
Более точечный импорт:
import SHA256 from 'crypto-js/sha256';
import AES from 'crypto-js/aes';
Webpack по умолчанию умеет работать с CommonJS, однако tree-shaking в таком режиме ограничен. Основная проблема Crypto-js — отсутствие ESM-сборки.
import SHA256 from 'crypto-js/sha256';
const hash = SHA256('message').toString();
Для уменьшения размера сборки применяется точечный импорт и настройка режима production:
module.exports = {
mode: 'production',
optimization: {
usedExports: true,
sideEffects: true
}
};
Однако usedExports не всегда позволяет удалить
неиспользуемые части Crypto-js, поскольку CommonJS-структура затрудняет
статический анализ.
Практика уменьшения бандла заключается в подмене импортов через
resolve.alias.
resolve: {
alias: {
'crypto-js': 'crypto-js/core'
}
}
Такой подход может привести к ошибкам, если используются алгоритмы вне core, поэтому применяется осторожно.
Rollup обеспечивает более строгий tree-shaking, но Crypto-js остаётся проблемным из-за CJS-архитектуры.
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'esm'
},
plugins: [
resolve(),
commonjs()
]
};
Rollup способен исключать неиспользуемые модули только при точечных импортах:
import MD5 from 'crypto-js/md5';
При импорте через корневой модуль оптимизация фактически не работает.
Crypto-js не предоставляет нативной ESM-сборки, поэтому сборщики вынуждены использовать транспиляцию через commonjs-плагины.
Типичные последствия:
Vite использует esbuild для предварительной обработки зависимостей. Crypto-js обрабатывается как CommonJS-пакет и преобразуется в ESM-обёртку.
При первом запуске dev-сервера Vite выполняет pre-bundle:
node_modules/.viteimport SHA256 from 'crypto-js/sha256';
Работает стабильно, но итоговый бандл всё равно зависит от структуры импорта.
Vite позволяет исключать излишние зависимости через
optimizeDeps:
export default {
optimizeDeps: {
include: ['crypto-js/sha256', 'crypto-js/aes']
}
};
Это ускоряет dev-сервер, но не решает проблему полного бандла при неправильных импортах.
Для ленивой загрузки криптографических операций применяется динамический импорт:
async function hashMessage(msg) {
const { default: SHA256 } = await import('crypto-js/sha256');
return SHA256(msg).toString();
}
Такой подход уменьшает initial bundle size, особенно в SPA с большим количеством редко используемых функций.
В масштабных проектах Crypto-js часто становится причиной увеличения бандла из-за неосторожного импорта.
Типичные стратегии контроля размера:
crypto-js/indexwebpack-bundle-analyzer или
аналогичные инструментыНесмотря на поддержку современных сборщиков, Crypto-js не является tree-shake-friendly библиотекой. Причины:
Фактически tree-shaking работает только на уровне модульного импорта файлов, а не внутренних функций.
В архитектуре фронтенд-приложений криптографические операции часто выделяются в отдельный слой:
/crypto
sha.js
aes.js
hmac.js
Каждый модуль импортирует строго одну функцию из crypto-js, что позволяет контролировать зависимости и минимизировать пересборку при изменениях.
Поведение Crypto-js в современных инструментах сборки определяется не самим API библиотеки, а форматом её распространения. Webpack, Rollup и Vite по-разному обрабатывают CommonJS-модули, однако во всех случаях ключевым фактором оптимизации остаётся точность импортов и отказ от глобального подключения пакета целиком.