वेबपैक उत्पादन कोड का निर्माण कैसे करें और इसका उपयोग कैसे करें


94

मैं वेबपैक के लिए बहुत नया हूं, मैंने पाया कि निर्माण में हम समग्र कोड के आकार को कम करने में सक्षम हो सकते हैं। वर्तमान में वेबपैक लगभग 8MB फाइलें और main.js 5MB के आसपास बनाता है। उत्पादन निर्माण में कोड के आकार को कैसे कम करें? मुझे इंटरनेट से एक नमूना वेबपैक कॉन्फ़िगरेशन फ़ाइल मिली और मैंने अपने एप्लिकेशन के लिए कॉन्फ़िगर किया और मैंने इसे चलाया npm run buildऔर इसका निर्माण शुरू किया और इसने ./dist/निर्देशिका में कुछ फ़ाइलों को उत्पन्न किया ।

  1. अभी भी ये फाइलें भारी हैं (विकास संस्करण के समान)
  2. इन फ़ाइलों का उपयोग कैसे करें? वर्तमान में मैं एप्लिकेशन को चलाने के लिए वेबपैक-देव-सर्वर का उपयोग कर रहा हूं।

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]
  }
};

1
क्या आपको अपने अंतिम प्रश्न का उत्तर मिला? "इन फ़ाइलों का उपयोग कैसे करें? वर्तमान में मैं एप्लिकेशन को चलाने के लिए वेबपैक-देव-सर्वर का उपयोग कर रहा हूं।"
रैंडी

4
वेबपैक से पहले इंटरनेट इतना बेहतर था, बस इस सवाल और जवाब को देखें।
रैंडी एल

जवाबों:


65

आप @Vikramaditya द्वारा सुझाए गए प्लगइन्स को जोड़ सकते हैं। फिर उत्पादन का निर्माण करने के लिए। आपको कमांड चलाना है

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

-pWebpack बताता है एक उत्पादन का निर्माण उत्पन्न करने के लिए। आपको उत्पादन ध्वज को शामिल करने के लिए पैकेज स्क्रिप्ट में पैकेज स्क्रिप्ट को बदलना होगा ।


6
ठीक है धन्यवाद। मेरा अगला संदेह है कि उत्पादन कोड कैसे चलाया जाए? जब मैं उपरोक्त कमांड चलाता हूं तो यह डिस्टर्ब डायरेक्टरी में कुछ फाइल बनाता है। ठीक है यह सफलतापूर्वक संकलित है। अब इन फ़ाइलों का उपयोग कैसे करें? विकास मोड में मैंने 'एनपीएम स्टार्ट' का उपयोग किया और इसकी शुरुआत की।
गिलसन PJ

आप अपने पर जाते हैं src/server/bin/server। फिर आप यह पता लगा सकते हैं कि यह फ़ाइलों की सेवा कैसे कर रहा है और शायद इसे बदल सकता है। मुझे लगता है कि यह फाइल बनाने के लिए वेबपैक चला रहा है और फिर उनकी सेवा करेगा। इस फ़ाइल के कोड पर एक नज़र डालें।
संदीप

@Vikramaditya तुम मुझे में परिदृश्य के साथ मदद कर सकता है stackoverflow.com/questions/40993795/msbuild-and-webpack
lohiarahul

@GilsonPJ ने आपको बताया कि इन UI फ़ाइलों का उपयोग कैसे करें?
रैंडी

आपको पहली बार उपयोग कर वेबपैक स्थापित करने की आवश्यकता हैnpm install webpack
पीटर रेडर

43

इस सवाल पर दर्शकों की संख्या का अवलोकन करने के बाद मैंने विक्रमादित्य और संदीप से जवाब देने का फैसला किया।

उत्पादन कोड बनाने के लिए आपको जो पहली चीज़ बनानी है, वह है अनुकूलन पैकेज के साथ उत्पादन कॉन्फ़िगरेशन,

  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डायरेक्टरी बनाएंगे ।

अब आपका UI कोड ./dist/डायरेक्टरी में उपलब्ध होगा । इन फ़ाइलों को स्थिर संपत्ति के रूप में सेवा करने के लिए अपने सर्वर को कॉन्फ़िगर करें। किया हुआ!


7
अपने अंतिम वाक्य में आपका क्या मतलब है? इन कोड की आपूर्ति कैसे करें? मुझे पता है कि नोड.जेएस अपने आप में एक सर्वर बनाता है। लेकिन ./dist/निर्देशिका में फ़ाइल होने के बाद मैं इसे कैसे चला सकता हूं ?
newguy

6
बस एक नोट, -lp को uglifyJS प्लगइन के शीर्ष पर जोड़ने से समस्याएँ पैदा होती हैं क्योंकि यह दो बार बदसूरत करने की कोशिश करता है। -P cli ऑप्शन को हटाने से मेरे लिए ये समस्याएँ तय हो
गईं

'NODE_ENV' को आंतरिक या बाहरी कमांड, ऑपरेशनल प्रोग्राम या बैच फ़ाइल के रूप में मान्यता नहीं दी जाती है।
एंटोन दुजेंको

2
यह स्वीकृत उत्तर होना चाहिए, क्योंकि कोई भी यह नहीं कह रहा था कि वेबसाइट की सेवा कैसे की जाती है। अब आपका UI कोड/dist/ निर्देशिका में उपलब्ध होगा। अनुरोध के लिए इन UI कोड की आपूर्ति करने के लिए अपना सर्वर सेट करें। और आप कर रहे हैं।
jperelli

2
मुझे अभी भी यह नहीं पता है कि "अनुरोध के लिए इन यूआई कोड की आपूर्ति करने के लिए अपने सर्वर को कैसे सेट करें। और आप कर रहे हैं।" मैं समझता हूं कि हम यहां क्या करना चाहते हैं, लेकिन मुझे नहीं पता कि यह कैसे करना है
रैंडी

42

अपने निर्माण का अनुकूलन करने के लिए इन प्लग इन का उपयोग करें:

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

मुझे हाल ही में कम्प्रेशन- वेबपैक -प्लगइन के बारे में पता चला है जो इसके आकार को कम करने के लिए आपके आउटपुट बंडल को gzips करता है। अपने उत्पादन कोड को और अधिक अनुकूलित करने के लिए इसे उपरोक्त सूचीबद्ध प्लगइन्स सूची में जोड़ें।

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

भारी सीपीयू उपयोग के कारण स्थिर क्लाइंट-साइड फ़ाइलों की सेवा के लिए सर्वर साइड डायनामिक गज़िप संपीड़न की सिफारिश नहीं की जाती है।


1
commonschuckplugin पर 'common.js' भाग क्या करता है? उस प्लगइन को आसानी से समझ पाना मेरे लिए सबसे मुश्किल है।
इचिबन

2
CommonsChunkPlugin आपके सभी चंक्स से कॉमन कोड निकालता है और इसे एक अलग फाइल में डालता है common.js
विक्रमादित्य

3
यह उत्तर अब वेबपैक संस्करण 4 के लिए मान्य नहीं है
डेनिस

20

बस यह मैं खुद सीख रहा हूं। मैं दूसरे प्रश्न का उत्तर दूंगा:

  1. इन फ़ाइलों का उपयोग कैसे करें? वर्तमान में मैं एप्लिकेशन को चलाने के लिए वेबपैक-देव-सर्वर का उपयोग कर रहा हूं।

वेबपैक-देव-सर्वर का उपयोग करने के बजाय, आप बस एक "एक्सप्रेस" चला सकते हैं। उपयोग npm "एक्सप्रेस" स्थापित करें और इस परियोजना के रूट dir में एक 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/ (उदाहरण कोड नवीनतम पैकेज के अनुकूल नहीं है, लेकिन यह काम करेगा छोटी चोटियों के साथ)


2
यदि आपने नोडज, एक्सप्रेसज आदि चीजों को सीखना शुरू कर दिया है तो मैं आपको बताना चाहता हूं। यह प्रश्न अग्रिम स्तर का प्रश्न है। यह न केवल इन फ़ाइलों को चलाने के लिए है। यह कम से कम (संपीड़ित) उत्पादन कोड कैसे और उस संपीड़ित कोड को चलाने के लिए है
Arpit

1
@ अर्पित यह इंगित करने के लिए धन्यवाद। मैं इसके लिए बहुत नया हूं। मैंने मान लिया कि एक बार जब संपीड़ित कोड उत्पन्न हो जाता है, तो रनिंग विधि समान होनी चाहिए।
सियुआन जियांग

9

आप उपयोग कर सकते हैं argv NPM मॉड्यूल (चलाकर इसे स्थापित स्थापित NPM argv --save अपने webpack.config.js फ़ाइल में पैरामीटर प्राप्त करने के लिए) और उत्पादन के लिए के रूप में आप का उपयोग -p ध्वज "का निर्माण": "webpack -p" , आप कर सकते हैं नीचे दी गई तरह webpack.config.js फ़ाइल में शर्त जोड़ें

plugins: [
    new webpack.DefinePlugin({
        'process.env':{
            'NODE_ENV': argv.p ? JSON.stringify('production') : JSON.stringify('development')
        }
    })
]

और बस।


1
इसके बजाय उपयोग करेंprocess.argv.indexOf('-p') != -1
AjaxLeung

@AjaxLeung: आपको वेबपैक कॉन्फिगर argvफाइल में शामिल करना है:const argv = require('argv');
kadam

6

इससे आपको मदद मिलेगी।

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

5

गिलसन 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"
},

2

यदि आपके वेबपैक .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 प्लगइन वेबपैक से हटा दिया गया था। आपको इसे अपने कॉन्फ़िगरेशन से निकालना चाहिए।

अपडेट करें:

मेरे पिछले उत्तर के अलावा:

यदि आप अपने कोड को रिलीज़ के लिए छिपाना चाहते हैं, तो enclosejs.com पर प्रयास करें । यह आपको इसकी अनुमति देता है:

  • बिना स्रोतों के अपने एप्लिकेशन का रिलीज़ संस्करण बनाएं
  • सेल्फ-एक्सट्रैक्टिंग आर्काइव या इंस्टॉलर बनाएं
  • एक बंद स्रोत जीयूआई आवेदन करें
  • अपनी परिसंपत्तियों को निष्पादन योग्य के अंदर रखें

आप इसे स्थापित कर सकते हैं npm install -g enclose

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.