Webpack как построить производственный код и как его использовать
Я очень новичок в webpack, я обнаружил, что в производственной сборке мы можем уменьшить размер общего кода.
В настоящее время webpack строит около 8 МБ файлов и main.js около 5 Мб.
Как уменьшить размер кода в сборку?
Я нашел пример файла конфигурации webpack из интернета, и я настроил для своего приложения, и я запускаю npm run build
и его начали строить и это породило некоторые файлы в
8 ответов:
вы можете добавить плагины, как предложил @Vikramaditya. Затем создать производственную сборку. Вы должны выполнить команду
webpack -p --config ./webpack.production.config.js
The
-p
сообщает webpack для создания производственной сборки. Вы должны изменить сценарий сборки в пакета.json включить флаг производства.
используйте эти плагины для оптимизации вашей производственной сборки:
new webpack.optimize.CommonsChunkPlugin('common'), new webpack.optimize.DedupePlugin(), new webpack.optimize.UglifyJsPlugin(), new webpack.optimize.AggressiveMergingPlugin()
Я недавно узнал о сжатие-webpack-плагин который gzips ваш выходной пакет, чтобы уменьшить его размер. Добавить это в список выше перечисленных плагинов для дальнейшей оптимизации вашего производства код.
new CompressionPlugin({ asset: "[path].gz[query]", algorithm: "gzip", test: /\.js$|\.css$|\.html$/, threshold: 10240, minRatio: 0.8 })
динамическое сжатие gzip на стороне сервера не рекомендуется для обслуживания статических файлов на стороне клиента из-за тяжелого процессора использование.
понаблюдав за количеством зрителей на этот вопрос я решил заключить ответ от Викрамадитьи и Сандипа.
чтобы построить производственный код, первое, что вам нужно создать, это производственная конфигурация с пакетами оптимизации, такими как
new webpack.optimize.CommonsChunkPlugin('common.js'), new webpack.optimize.DedupePlugin(), new webpack.optimize.UglifyJsPlugin(), new webpack.optimize.AggressiveMergingPlugin()
затем в упаковке.файл json вы можете настроить процедуру сборки с помощью этой производственной конфигурации
"scripts": { "build": "NODE_ENV=production webpack -p --config ./webpack.production.config.js" },
теперь вы должны выполнить следующую команду, чтобы инициировать строй
npm run build
в соответствии с моей производственной конфигурацией сборки webpack построит источник в .
теперь ваш пользовательский код будет доступен в
можно использовать argv модуль npm (установите его, запустив npm install argv --save) для получения параметров в вашем webpack.конфиг.js файл и как для производства вы используете - p флаг "build": "webpack-p", вы можете добавить условие в webpack.конфиг.JS файл, как показано ниже
plugins: [ new webpack.DefinePlugin({ 'process.env':{ 'NODE_ENV': argv.p ? JSON.stringify('production') : JSON.stringify('development') } }) ]
и все.
просто изучаю это сам. Я отвечу на второй вопрос:
- как использовать эти файлы? В настоящее время я использую webpack-dev-server для запуска приложения.
вместо использования webpack-dev-server, вы можете просто запустить "экспресс". используйте npm install "express" и создайте сервер.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);
затем в пакет.json, добавьте скрипт:
"start": "node server.js"
наконец, запустите приложение:
npm run start
для запуска сервераподробный пример можно увидеть на: https://alejandronapoles.com/2016/03/12/the-simplest-webpack-and-express-setup/ (пример кода не совместим с последними пакетами, но он будет работать с небольшими настройками)
Это вам поможет.
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 }) ],
в дополнение к 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 из plugins-array или добавить 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.разработка.конфигурация и ваш веб-пакет.подгонять.config, вы можете использовать логическое
isProd
активировать определенные функции только в определенных ситуациях и имеют только один webpack.конфиг.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. это позволяет:
- сделайте релизную версию вашего приложения без источников
- создать самораспаковывающийся архив или установщик
- сделать приложение GUI с закрытым исходным кодом
- Поместите свои активы в исполняемый файл
вы можете установить его с
npm install -g enclose