Webpack, как создавать производственный код и как его использовать

Я очень новичок в вебпаке и обнаружил, что в производственной сборке мы можем уменьшить размер всего кода. В настоящее время webpack собирает около 8 МБ файлов, а main.js - около 5 МБ. Как уменьшить размер кода в производственной сборке? Я нашел образец файла конфигурации веб-пакета из Интернета, настроил для своего приложения и запустил npm run build, и он начал собираться, и он сгенерировал некоторые файлы в ./dist/ каталог.

  1. Тем не менее, эти файлы тяжелые (так же, как версия для разработки)
  2. Как использовать эти файлы? В настоящее время я использую 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]
  }
};
73 голоса | спросил Gilson PJ 28 Jam1000000amThu, 28 Jan 2016 09:14:36 +030016 2016, 09:14:36

8 ответов


0

Наблюдая за количеством зрителей на этот вопрос, я решил сделать вывод от Викрамадитя и Сандипа.

Для создания производственного кода первое, что вам нужно создать, - это производственная конфигурация с такими пакетами оптимизации, как

  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"
},

теперь вам нужно выполнить следующую команду, чтобы начать сборку

npm run build

В соответствии с моей конфигурацией производственной сборки веб-пакет будет собирать исходный код в каталог ./dist.

Теперь ваш код пользовательского интерфейса будет доступен в каталоге ./dist/. Сконфигурируйте свой сервер для обслуживания этих файлов в качестве статических ресурсов. Готово!

ответил Gilson PJ 29 J000000Friday16 2016, 22:03:41
0

Вы можете добавить плагины в соответствии с предложением @Vikramaditya. Затем создать производственную сборку. Вы должны выполнить команду

webpack -p --config ./webpack.production.config.js

-p сообщает веб-пакету о создании производственной сборки. Вы должны изменить сценарий сборки в package.json , чтобы включить флаг производства.

ответил sandeep 28 Jpm1000000pmThu, 28 Jan 2016 13:00:09 +030016 2016, 13:00:09
0

Используйте эти плагины для оптимизации вашей производственной сборки:

  new webpack.optimize.CommonsChunkPlugin('common'),
  new webpack.optimize.DedupePlugin(),
  new webpack.optimize.UglifyJsPlugin(),
  new webpack.optimize.AggressiveMergingPlugin()
  

Недавно я узнал о compress-webpack-plugin сильный>   который упаковывает ваш выходной пакет, чтобы уменьшить его размер.   Добавьте это также в список плагинов, перечисленных выше, для дальнейшей оптимизации производственного кода.

new CompressionPlugin({
      asset: "[path].gz[query]",
      algorithm: "gzip",
      test: /\.js$|\.css$|\.html$/,
      threshold: 10240,
      minRatio: 0.8
})

Динамическое сжатие gzip на стороне сервера не рекомендуется для обслуживания статических файлов на стороне клиента из-за высокой загрузки ЦП.

ответил Vikramaditya 28 Jam1000000amThu, 28 Jan 2016 11:01:36 +030016 2016, 11:01:36
0

Просто изучаю это сам. Я отвечу на второй вопрос:

  1. Как использовать эти файлы? В настоящее время я использую webpack-dev-server для запуска приложения.

Вместо использования webpack-dev-server вы можете просто запустить "экспресс". используйте npm, установите «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 /заместитель Простейших-WebPack-и-экспресс-установка / (пример кода не совместим с последними пакетами, но он будет работать с небольшими изменениями)

ответил Siyuan Jiang 3 Jam1000000amWed, 03 Jan 2018 01:30:32 +030018 2018, 01:30:32
0

Вы можете использовать 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')
        }
    })
]

И это все.

ответил Hayk Aghabekyan 10 SatEurope/Moscow2016-12-10T12:24:30+03:00Europe/Moscow12bEurope/MoscowSat, 10 Dec 2016 12:24:30 +0300 2016, 12:24:30
0

Это поможет вам.

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
    })
  ],
ответил Khalid Azam 22 ThuEurope/Moscow2016-12-22T01:38:16+03:00Europe/Moscow12bEurope/MoscowThu, 22 Dec 2016 01:38:16 +0300 2016, 01:38:16
0

В дополнение к ответу Гилсона П.Дж .:

 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 или добавив 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"
},
ответил Putzi San 28 WedEurope/Moscow2016-12-28T22:53:05+03:00Europe/Moscow12bEurope/MoscowWed, 28 Dec 2016 22:53:05 +0300 2016, 22:53:05
0

Если в вашем 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. Вы должны удалить его из своей конфигурации.

UPDATE:

В дополнение к моему предыдущему ответу:

Если вы хотите скрыть свой код для выпуска, попробуйте enclosejs.com . Это позволяет вам:

  • сделайте выпускную версию своего приложения без источников
  • создать самораспаковывающийся архив или установщик
  • Создайте приложение с закрытым исходным кодом GUI
  • Поместите свои активы в исполняемый файл

Вы можете установить его с помощью npm install -g enclose

ответил MatthiasSommer 30 J0000006Europe/Moscow 2017, 16:42:29

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132