Я очень новичок в webpack, я обнаружил, что в производственной сборке мы можем уменьшить размер общего кода. В настоящее время webpack собирает около 8 МБ файлов, а main.js - около 5 МБ. Как уменьшить размер кода в производственной сборке? Я нашел образец файла конфигурации веб-пакета из Интернета, я настроил свое приложение, запустил npm run build
его, и он начал сборку, и он сгенерировал несколько файлов в ./dist/
каталоге.
- Тем не менее, эти файлы тяжелые (такие же, как и в версии для разработки)
- Как использовать эти файлы? В настоящее время я использую webpack-dev-server для запуска приложения.
файл package.json
{
"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]
}
};
Ответы:
Вы можете добавить плагины, как предлагает @Vikramaditya. Затем для создания производственной сборки. Вы должны запустить команду
Он
-p
сообщает webpack о необходимости создания производственной сборки. Вам нужно изменить сценарий сборки в package.json, чтобы включить флаг производства.источник
src/server/bin/server
. Затем вы сможете выяснить, как он обслуживает файлы, и, возможно, изменить это. Я думаю, он будет запускать webpack для создания файлов и их обслуживания. Взгляните на код этого файла.npm install webpack
Наблюдая за количеством зрителей на этот вопрос, я решил закончить ответ Викрамадитьи и Сандипа.
Чтобы собрать производственный код, первое, что вам нужно создать, это производственную конфигурацию с пакетами оптимизации, такими как,
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 --config ./webpack.production.config.js" },
теперь вам нужно запустить следующую команду, чтобы начать сборку
В соответствии с моей конфигурацией производственной сборки webpack создаст исходный код в
./dist
каталоге.Теперь ваш код пользовательского интерфейса будет доступен в
./dist/
каталоге. Настройте свой сервер для обслуживания этих файлов как статических ресурсов. Выполнено!источник
./dist/
каталоге?Используйте эти плагины для оптимизации вашей производственной сборки:
new webpack.optimize.CommonsChunkPlugin('common'), new webpack.optimize.DedupePlugin(), new webpack.optimize.UglifyJsPlugin(), new webpack.optimize.AggressiveMergingPlugin()
new CompressionPlugin({ asset: "[path].gz[query]", algorithm: "gzip", test: /\.js$|\.css$|\.html$/, threshold: 10240, minRatio: 0.8 })
Динамическое сжатие gzip на стороне сервера не рекомендуется для обслуживания статических файлов на стороне клиента из-за высокой загрузки ЦП.
источник
common.js
.Просто учусь этому сам. Отвечу на второй вопрос:
Вместо использования webpack-dev-server вы можете просто запустить «экспресс». используйте npm install "express" и создайте server.js в корневом каталоге проекта, примерно так:
var path = require("path"); var express = require("express"); var DIST_DIR = path.join(__dirname, "build"); var PORT = 3000; var app = express(); //Serving the files on the dist folder app.use(express.static(DIST_DIR)); //Send index.html when the user access the web app.get("*", function (req, res) { res.sendFile(path.join(DIST_DIR, "index.html")); }); app.listen(PORT);
Затем в package.json добавьте скрипт:
"start": "node server.js"
Наконец, запустите приложение:
npm run start
чтобы запустить серверПодробный пример можно увидеть по адресу: https://alejandronapoles.com/2016/03/12/the-simplest-webpack-and-express-setup/ (код примера несовместим с последними пакетами, но он будет работать с небольшими поправками)
источник
Вы можете использовать модуль 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') } }) ]
Вот и все.
источник
process.argv.indexOf('-p') != -1
argv
в файл конфигурации WebPack:const argv = require('argv');
Это вам поможет.
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$/]), ///programming/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 }) ],
источник
Помимо ответа Gilson 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». поэтому одно из возможных решений было бы
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" },
источник
Если у вас много повторяющегося кода в файлах webpack.dev.config и webpack.prod.config, вы можете использовать логическое значение
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. Вы должны удалить его из своей конфигурации.
ОБНОВИТЬ:
В дополнение к моему предыдущему ответу:
Если вы хотите скрыть свой код для выпуска, попробуйте enclosejs.com . Это позволяет:
Вы можете установить его с помощью
npm install -g enclose
источник