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

59

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

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

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]
  }
};
  • 1
    Вы нашли ответ на свой последний вопрос? «Как использовать эти файлы? В настоящее время я использую webpack-dev-server для запуска приложения».
  • 4
    Интернет был намного лучше, чем Webpack, просто посмотрите на этот вопрос и ответ.
Теги:
webpack
webpack-dev-server
npm

7 ответов

23
Лучший ответ

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

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

  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/. Установите ваш сервер для подачи этого кода пользовательского интерфейса для запроса. и вы закончили.!

  • 5
    Что вы имеете в виду в своем последнем предложении? Как поставить эти коды? Я знаю, что node.js создает сервер сам по себе. Но как я могу запустить его после того, как у меня есть файл в каталоге ./dist/ ?
  • 6
    Просто обратите внимание, добавление опции -p поверх плагина uglifyJS вызывает проблемы, так как он пытается сделать uglify дважды. Удаление опции -p cli устранило эти проблемы для меня
Показать ещё 4 комментария
46

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

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

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

  • 4
    хорошо спасибо. мое следующее сомнение в том, как запустить производственный код? когда я запускаю вышеупомянутую команду, она создает некоторые файлы в каталоге dist. хорошо, это скомпилировано успешно. Теперь, как использовать эти файлы? в режиме разработки я использовал 'npm start' и он запустился.
  • 0
    Если вы идете в свой src/server/bin/server . Затем вы можете выяснить, как он обслуживает файлы и, возможно, изменить его. Я думаю, что он будет делать, запустив веб-пакет для создания файлов, а затем обслуживать их. Посмотрите на код этого файла.
Показать ещё 3 комментария
31

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

  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 на стороне сервера не рекомендуется для обслуживания статических клиентских файлов из-за большого использования ЦП.

  • 1
    Что делает часть 'common.js' на commonschuckplugin? этот плагин мне труднее всего понять.
  • 2
    CommonsChunkPlugin извлекает общий код из всех ваших кусков и помещает его в отдельный файл common.js .
5

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

И вот оно.

  • 0
    argv не работает внутри файла конфигурации webpack
  • 1
    Вместо этого используйте process.argv.indexOf('-p') != -1
Показать ещё 1 комментарий
3

В дополнение к ответу Гильсона 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"
},
3

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

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
    })
  ],
1

Если в вашем 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню