প্রোডাকশন কোড কীভাবে তৈরি করা যায় এবং কীভাবে এটি ব্যবহার করতে হয় তা ওয়েবপ্যাক


95

আমি ওয়েবপ্যাকটিতে খুব নতুন, আমি দেখতে পেলাম যে প্রোডাকশন বিল্ডে আমরা সামগ্রিক কোডের আকার হ্রাস করতে পারব। বর্তমানে ওয়েবপ্যাকটি প্রায় 5 এমবি প্রায় 8 এমবি ফাইল এবং মেইন.জেগুলি তৈরি করে। উত্পাদন বিল্ডে কোডের আকারটি কীভাবে হ্রাস করবেন? আমি ইন্টারনেট থেকে একটি নমুনা ওয়েবপ্যাক কনফিগারেশন ফাইল পেয়েছি এবং আমি আমার অ্যাপ্লিকেশনটির জন্য কনফিগার করেছি এবং আমি চালনা করি npm run buildএবং এটি শুরু করি এবং এটি ./dist/ডিরেক্টরিতে কিছু ফাইল উত্পন্ন করে generated

  1. এখনও এই ফাইলগুলি ভারী (উন্নয়নের সংস্করণ হিসাবে একই)
  2. এই ফাইলগুলি কীভাবে ব্যবহার করবেন? বর্তমানে আমি অ্যাপ্লিকেশনটি চালানোর জন্য ওয়েবপ্যাক-ডেভ-সার্ভার ব্যবহার করছি।

প্যাকেজ.জসন ফাইল

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

ওয়েবপ্যাক.প্রডাকশন.কনফিগ.জেএস

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

4
আপনি আপনার শেষ প্রশ্নের উত্তর খুঁজে পেয়েছেন? "এই ফাইলগুলি কীভাবে ব্যবহার করবেন? বর্তমানে অ্যাপ্লিকেশনটি চালানোর জন্য আমি ওয়েবপ্যাক-ডেভ-সার্ভার ব্যবহার করছি" "
র্যান্ডি

4
ওয়েবপ্যাকের আগে ইন্টারনেটটি আরও ভাল ছিল, কেবল এই প্রশ্ন এবং উত্তরটি দেখুন।
র‌্যান্ডি এল

উত্তর:


66

আপনি @ ভিক্রামাদিত্য দ্বারা প্রস্তাবিত প্লাগইনগুলি যুক্ত করতে পারেন। তারপরে প্রোডাকশন বিল্ড তৈরি করতে হবে। আপনাকে কমান্ডটি চালাতে হবে

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

-pWebpack বলে একটি প্রকাশনা বিল্ড তৈরি করতে। উত্পাদনের পতাকাটি অন্তর্ভুক্ত করতে আপনাকে প্যাকেজ.জসনে বিল্ড স্ক্রিপ্ট পরিবর্তন করতে হবে ।


7
ঠিক আছে ধন্যবাদ. আমার পরবর্তী সন্দেহ কীভাবে প্রডাকশন কোডটি চালাবেন? যখন আমি উপরের কমান্ডটি চালিত করি এটি ডিস্ট ডিরেক্টরিতে কিছু ফাইল তৈরি করে। ঠিক আছে এটি সফলভাবে সংকলিত। এখন এই ফাইলগুলি কীভাবে ব্যবহার করবেন? বিকাশ মোডে আমি 'এনপিএম স্টার্ট' ব্যবহার করেছিলাম এবং এর শুরু হয়েছিল।
গিলসন পিজে

আপনি যদি আপনার যান src/server/bin/server। তারপরে আপনি কীভাবে এটি ফাইলগুলি পরিবেশন করছেন তা বুঝতে এবং এটি পরিবর্তন করতে পারেন change আমার মনে হয় এটি কী করবে তা হ'ল ফাইলগুলি তৈরি করতে ওয়েবপ্যাক চালানো এবং তারপরে সেগুলি দেওয়া। এই ফাইলের কোডটি দেখুন।
সন্দীপ

@Vikramaditya আপনি আমাকে দৃশ্যকল্প দিয়ে সাহায্য গেল stackoverflow.com/questions/40993795/msbuild-and-webpack
lohiarahul

@ গিলসনপিজে আপনি কীভাবে এই ইউআই ফাইলগুলি ব্যবহার করবেন তা বুঝতে পেরেছেন?
র্যান্ডি

আপনাকে প্রথমে ওয়েবপ্যাকটি ইনস্টল করতে হবেnpm install webpack
পিটার রেডার

43

এই প্রশ্নটিতে দর্শকের সংখ্যা পর্যবেক্ষণ করার পরে আমি বিক্রমাদিত্য এবং সন্দীপের কাছ থেকে একটি উত্তর উপসংহারের সিদ্ধান্ত নিয়েছি।

প্রোডাকশন কোডটি তৈরি করতে আপনার প্রথমে তৈরি করতে হবে অপ্টিমাইজেশন প্যাকেজগুলির সাথে প্রযোজনা কনফিগারেশন যেমন,

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

তারপরে প্যাকেজ.জসন ফাইলে আপনি এই উত্পাদন কনফিগারেশন সহ বিল্ড পদ্ধতিটি কনফিগার করতে পারেন

"scripts": {
    "build": "NODE_ENV=production webpack --config ./webpack.production.config.js"
},

বিল্ডটি শুরু করতে এখন আপনাকে নিম্নলিখিত কমান্ডটি চালাতে হবে

npm run build

আমার প্রোডাকশন বিল্ড কনফিগারেশন অনুযায়ী ওয়েবপ্যাকটি উত্সটি ./distডিরেক্টরিতে তৈরি করবে ।

এখন আপনার ইউআই কোড ./dist/ডিরেক্টরিতে পাওয়া যাবে । স্থিতিশীল সম্পদ হিসাবে এই ফাইলগুলি পরিবেশন করতে আপনার সার্ভারটি কনফিগার করুন। সম্পন্ন!


7
আপনার শেষ বাক্যে আপনি কী বোঝাতে চাইছেন? এই কোডগুলি কীভাবে সরবরাহ করবেন? আমি জানি node.js নিজেই একটি সার্ভার তৈরি করে। ./dist/ডিরেক্টরিটিতে ফাইল থাকার পরে আমি কীভাবে এটি চালাতে পারি ?
newguy

6
কেবল একটি নোট, uglifJS প্লাগইনের উপরে -p বিকল্পটি যুক্ত করার ফলে সমস্যাগুলির কারণ হয় কারণ এটি দুবার uglify করার চেষ্টা করে। -P ক্লিপ বিকল্পটি সরানো আমার জন্য এই সমস্যাগুলি স্থির করেছে
সময়সূচি 123

'NODE_ENV' কোনও অভ্যন্তরীণ বা বাহ্যিক কমান্ড, অপারেবল প্রোগ্রাম বা ব্যাচ ফাইল হিসাবে স্বীকৃত নয়।
আন্তন দুজনকো

4
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, কারণ কেউই কীভাবে ওয়েবসাইটটি পরিবেশন করবেন তা বলছিল না এখন আপনার ইউআই কোড ./dist/ ডিরেক্টরিতে পাওয়া যাবে। অনুরোধের জন্য এই ইউআই কোড সরবরাহ করতে আপনার সার্ভারটি সেট করুন। এবং আপনি সম্পন্ন হয়েছে!
jperelli

4
"অনুরোধের জন্য এই ইউআই কোড সরবরাহ করার জন্য আপনার সার্ভারটি সেট করুন কীভাবে তা আমি এখনও পাই না and আমি এখানে আমরা কী করতে চাই তা বুঝতে পেরেছি তবে কীভাবে এটি করতে হবে তা আমি জানি না
র্যান্ডি

42

আপনার উত্পাদন বিল্ডটি অনুকূল করতে এই প্লাগইনগুলি ব্যবহার করুন:

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

ভারী সিপিইউ ব্যবহারের কারণে স্ট্যাটিক ক্লায়েন্ট-সাইড ফাইলগুলি সরবরাহ করার জন্য সার্ভার সাইড ডায়নামিক জিজেপ সংক্ষেপণ প্রস্তাবিত নয়।


4
'সাধারণ.জেএস' অংশটি কমন্সচলপ্লিনে কি করে? এই প্লাগইনটি আমার পক্ষে সহজেই উপলব্ধি করা সহজ।
এচিবান

4
CommonsChunkPlugin আপনার সমস্ত অংশ থেকে সাধারণ কোডটি বের করে এনে একটি পৃথক ফাইলে রাখে common.js
বিক্রমাদিত্য

4
এই উত্তরটি আর আর ওয়েবপ্যাক সংস্করণ 4 -র জন্য বৈধ নয়
ডেনিস

20

শুধু আমি নিজে এই শিখছি। আমি দ্বিতীয় প্রশ্নের উত্তর দেব:

  1. এই ফাইলগুলি কীভাবে ব্যবহার করবেন? বর্তমানে আমি অ্যাপ্লিকেশনটি চালানোর জন্য ওয়েবপ্যাক-ডেভ-সার্ভার ব্যবহার করছি।

ওয়েবপ্যাক-ডেভ-সার্ভার ব্যবহার করার পরিবর্তে, আপনি কেবল একটি "এক্সপ্রেস" চালাতে পারেন। এনপিএম ইনস্টল "এক্সপ্রেস" ব্যবহার করুন এবং প্রকল্পের মূল ডিয়ারে একটি সার্ভার.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);

তারপরে, প্যাকেজ.জেসনে, একটি স্ক্রিপ্ট যুক্ত করুন:

"start": "node server.js"

পরিশেষে, অ্যাপটি চালনা করুন: npm run startসার্ভারটি শুরু করতে

একটি বিশদ উদাহরণ এখানে দেখা যাবে: https://alejandronapoles.com/2016/03/12/the-simplest-webpack-and-express-setup/ (উদাহরণ কোডটি সর্বশেষ প্যাকেজগুলির সাথে সামঞ্জস্যপূর্ণ নয়, তবে এটি কাজ করবে) ছোট টুইটগুলি সহ)


4
আপনি যদি নোডেজ, এক্সপ্রেস ইত্যাদি জিনিস শিখতে শুরু করেন তবে আমি আপনাকে বলতে চাই। এই প্রশ্নটি অগ্রিম স্তরের প্রশ্ন। এই ফাইলগুলি কীভাবে চালানো যায় তা কেবল নয়। এটি কীভাবে উত্পাদনের কোডটি ছোট করতে হবে (সংক্ষেপণ) এবং সেই সংকুচিত কোডটি কীভাবে চালানো যায়
Arpit

4
@ অর্পিত এটি নির্দেশ করার জন্য ধন্যবাদ। আমি এই খুব নতুন। আমি ধরে নিয়েছি যে সংকুচিত কোডটি তৈরি হয়ে গেলে, চলমান পদ্ধতিটি একই রকম হওয়া উচিত।
সিয়ুয়ান জিয়াং

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

এবং এটাই.


4
পরিবর্তে ব্যবহার করুনprocess.argv.indexOf('-p') != -1
AjaxLeung

@ অজ্যাক্সলিউং: আপনাকে argvওয়েবপ্যাক কনফিগারেশনের ফাইলটিতে অন্তর্ভুক্ত করতে হবে:const argv = require('argv');
কদম

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

গিলসন পিজে উত্তর ছাড়াও:

 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#pr Productions- shortcut- p দেখুন ।

আপনি প্লাগইনস-অ্যারে থেকে উগলিফাইজেএসপ্লাগিনটি সরিয়ে বা ঘটনা-অর্ডারপ্লাগিন যুক্ত করে "-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"
},

3

আপনার ওয়েবপ্যাক.দেব.কনফিগ এবং আপনার ওয়েবপ্যাক.প্রড.কনফিগে যদি আপনার অনেকগুলি সদৃশ কোড থাকে তবে isProdআপনি নির্দিষ্ট পরিস্থিতিতে কেবল কিছু বৈশিষ্ট্য সক্রিয় করতে একটি বুলিয়ান ব্যবহার করতে পারেন এবং কেবলমাত্র একটি একক ওয়েবপ্যাক.কমফিগ.জেএস ফাইল থাকতে পারে।

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

যাইহোক: ডেডাপিউ প্লাগিন প্লাগইনটি ওয়েবপ্যাক থেকে সরানো হয়েছিল। আপনার এটি আপনার কনফিগারেশন থেকে অপসারণ করা উচিত।

হালনাগাদ:

আমার আগের উত্তর ছাড়াও:

আপনি যদি মুক্তির জন্য আপনার কোডটি আড়াল করতে চান তবে enclosejs.com চেষ্টা করুন । এটি আপনাকে এটি করতে দেয়:

  • উত্স ছাড়াই আপনার অ্যাপ্লিকেশনটির একটি প্রকাশ সংস্করণ করুন
  • একটি স্ব-উত্তোলন সংরক্ষণাগার বা ইনস্টলার তৈরি করুন
  • একটি বদ্ধ উত্স জিইউআই অ্যাপ্লিকেশন করুন
  • এক্সেকিউটেবলের ভিতরে আপনার সম্পদ রাখুন

আপনি এটি দিয়ে ইনস্টল করতে পারেন npm install -g enclose

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.