Я очень новичок в webpack, я обнаружил, что в сборке продукции мы можем уменьшить размер общего кода.
В настоящее время webpack составляет около 8 МБ файлов и main.js около 5 МБ.
Как уменьшить размер кода в сборке?
Я нашел образец файла конфигурации webpack из Интернета, и я настроил его для своего приложения, и я запустил npm run build
и начал его создание, и он сгенерировал некоторые файлы в каталоге ./dist/
.
package.json file
{
"name": "MyAPP",
"version": "0.1.0",
"description": "",
"main": "src/server/server.js",
"repository": {
"type": "git",
"url": ""
},
"keywords": [
],
"author": "Iam",
"license": "MIT",
"homepage": "http://example.com",
"scripts": {
"test": "",
"start": "babel-node src/server/bin/server",
"build": "rimraf dist && NODE_ENV=production webpack --config ./webpack.production.config.js --progress --profile --colors"
},
"dependencies": {
"scripts" : "", ...
},
"devDependencies": {
"scripts" : "", ...
}
}
webpack.config.js
var path = require('path');
var webpack = require('webpack');
var HtmlWebpackPlugin = require('html-webpack-plugin');
var public_dir = "src/frontend";
var ModernizrWebpackPlugin = require('modernizr-webpack-plugin');
module.exports = {
devtool: 'eval-source-map',
entry: [
'webpack-hot-middleware/client?reload=true',
path.join(__dirname, public_dir , 'main.js')
],
output: {
path: path.join(__dirname, '/dist/'),
filename: '[name].js',
publicPath: '/'
},
plugins: [
plugins
],
module: {
loaders: [loaders]
}
};
webpack.production.config.js
var path = require('path');
var webpack = require('webpack');
var HtmlWebpackPlugin = require('html-webpack-plugin');
var public_dir = "src/frontend";
var ModernizrWebpackPlugin = require('modernizr-webpack-plugin');
console.log(path.join(__dirname, 'src/frontend' , 'index.html'));
module.exports = {
devtool: 'eval-source-map',
entry: [
'webpack-hot-middleware/client?reload=true',
path.join(__dirname, 'src/frontend' , 'main.js')
],
output: {
path: path.join(__dirname, '/dist/'),
filename: '[name].js',
publicPath: '/'
},
plugins: [plugins],
resolve: {
root: [path.resolve('./src/frontend/utils'), path.resolve('./src/frontend')],
extensions: ['', '.js', '.css']
},
module: {
loaders: [loaders]
}
};
После наблюдения числа зрителей на этот вопрос я решил завершить ответ от Викрамадитья и Сандипа.
Чтобы создать производственный код, первое, что вам нужно создать, - это конфигурация производства с пакетами оптимизации, такими как
new webpack.optimize.CommonsChunkPlugin('common.js'),
new webpack.optimize.DedupePlugin(),
new webpack.optimize.UglifyJsPlugin(),
new webpack.optimize.AggressiveMergingPlugin()
Затем в файле package.json вы можете настроить процедуру сборки с помощью этой производственной конфигурации
"scripts": {
"build": "NODE_ENV=production webpack -p --config ./webpack.production.config.js"
},
теперь вам нужно запустить следующую команду для запуска сборки
npm run build
В соответствии с моей конфигурацией сборки сборки webpack построит источник в каталоге ./dist
.
Теперь ваш код пользовательского интерфейса будет доступен в каталоге ./dist/
. Установите ваш сервер для подачи этого кода пользовательского интерфейса для запроса. и вы закончили.!
./dist/
?
Вы можете добавить плагины, как предложено @Vikramaditya. Затем сгенерировать сборку. Вы должны запустить команду
webpack -p --config ./webpack.production.config.js
-p
сообщает webpack генерировать производственную сборку. Вы должны изменить конструкцию script в package.json, чтобы включить флаг создания.
src/server/bin/server
. Затем вы можете выяснить, как он обслуживает файлы и, возможно, изменить его. Я думаю, что он будет делать, запустив веб-пакет для создания файлов, а затем обслуживать их. Посмотрите на код этого файла.
Используйте эти плагины для оптимизации вашей сборки:
new webpack.optimize.CommonsChunkPlugin('common'),
new webpack.optimize.DedupePlugin(),
new webpack.optimize.UglifyJsPlugin(),
new webpack.optimize.AggressiveMergingPlugin()
Недавно я узнал о compression-webpack-pluginкоторый gzips ваш выходной пакет, чтобы уменьшить его размер. Добавьте это также в список перечисленных выше плагинов для дальнейшей оптимизации вашего производственного кода.
new CompressionPlugin({
asset: "[path].gz[query]",
algorithm: "gzip",
test: /\.js$|\.css$|\.html$/,
threshold: 10240,
minRatio: 0.8
})
Динамическое сжатие gzip на стороне сервера не рекомендуется для обслуживания статических клиентских файлов из-за большого использования ЦП.
common.js
.
Вы можете использовать argv модуль npm (установите его, запустив npm install argv --save) для получение параметров в файле webpack.config.js, а для производства вы используете флаг -p "build": "webpack -p" , вы можете добавить условие в webpack. config.js, как показано ниже
plugins: [
new webpack.DefinePlugin({
'process.env':{
'NODE_ENV': argv.p ? JSON.stringify('production') : JSON.stringify('development')
}
})
]
И вот оно.
argv
не работает внутри файла конфигурации webpack
process.argv.indexOf('-p') != -1
В дополнение к ответу Гильсона PJ:
new webpack.optimize.CommonsChunkPlugin('common.js'),
new webpack.optimize.DedupePlugin(),
new webpack.optimize.UglifyJsPlugin(),
new webpack.optimize.AggressiveMergingPlugin()
с
"scripts": {
"build": "NODE_ENV=production webpack -p --config ./webpack.production.config.js"
},
вызывает попытку дважды удвоить ваш код. Подробнее см. https://webpack.github.io/docs/cli.html#production-shortcut-p.
Вы можете исправить это, удалив UglifyJsPlugin из массива плагинов или добавьте OccurrenceOrderPlugin и удалите "-p" -flag. поэтому одним возможным решением могло бы быть
new webpack.optimize.CommonsChunkPlugin('common.js'),
new webpack.optimize.DedupePlugin(),
new webpack.optimize.UglifyJsPlugin(),
new webpack.optimize.OccurrenceOrderPlugin(),
new webpack.optimize.AggressiveMergingPlugin()
и
"scripts": {
"build": "NODE_ENV=production webpack --config ./webpack.production.config.js"
},
Это поможет вам.
plugins: [
new webpack.DefinePlugin({
'process.env': {
// This has effect on the react lib size
'NODE_ENV': JSON.stringify('production'),
}
}),
new ExtractTextPlugin("bundle.css", {allChunks: false}),
new webpack.optimize.AggressiveMergingPlugin(),
new webpack.optimize.OccurrenceOrderPlugin(),
new webpack.optimize.DedupePlugin(),
new webpack.optimize.UglifyJsPlugin({
mangle: true,
compress: {
warnings: false, // Suppress uglification warnings
pure_getters: true,
unsafe: true,
unsafe_comps: true,
screw_ie8: true
},
output: {
comments: false,
},
exclude: [/\.min\.js$/gi] // skip pre-minified libs
}),
new webpack.IgnorePlugin(/^\.\/locale$/, [/moment$/]), //https://stackoverflow.com/questions/25384360/how-to-prevent-moment-js-from-loading-locales-with-webpack
new CompressionPlugin({
asset: "[path].gz[query]",
algorithm: "gzip",
test: /\.js$|\.css$|\.html$/,
threshold: 10240,
minRatio: 0
})
],
Если в вашем webpack.dev.config и вашем файле webpack.prod.config имеется много дублирующегося кода, вы можете использовать boolean isProd
для активации определенных функций только в определенных ситуациях и иметь только один файл webpack.config.js.
const isProd = (process.env.NODE_ENV === 'production');
if (isProd) {
plugins.push(new AotPlugin({
"mainPath": "main.ts",
"hostReplacementPaths": {
"environments/index.ts": "environments/index.prod.ts"
},
"exclude": [],
"tsConfigPath": "src/tsconfig.app.json"
}));
plugins.push(new UglifyJsPlugin({
"mangle": {
"screw_ie8": true
},
"compress": {
"screw_ie8": true,
"warnings": false
},
"sourceMap": false
}));
}
Кстати: Плагин DedupePlugin был удален из Webpack. Вы должны удалить его из своей конфигурации.
UPDATE:
В дополнение к моему предыдущему ответу:
Если вы хотите скрыть свой код для выпуска, попробуйте enclosejs.com. Он позволяет:
Вы можете установить его с помощью npm install -g enclose