সিএসএস এবং জেএস আলাদাভাবে উত্পন্ন করতে আমি কি ওয়েবপ্যাক ব্যবহার করতে পারি?


86

আমার আছে:

  1. জেএস ফাইলগুলি আমি বান্ডিল করতে চাই।
  2. আমি সিএসএস-এ সংকলন করতে চাইছি এমন কম ফাইল (@ ইম্পোর্টগুলি একক বান্ডেলে সমাধান করে)।

আমি এগুলিকে দুটি পৃথক ইনপুট হিসাবে নির্দিষ্ট করার এবং দুটি পৃথক আউটপুট (সম্ভবত এক্সট্র্যাক্ট-টেক্সট-ওয়েবপ্যাক-প্লাগইনের মাধ্যমে) পাওয়ার আশা করছিলাম। সংকলন করার জন্য ওয়েবপ্যাকের সমস্ত যথাযথ প্লাগইন / লোডার রয়েছে তবে এটি পৃথকীকরণটি পছন্দ করবে বলে মনে হয় না।

আমি লোকদের সরাসরি জেএস থেকে তাদের কম ফাইলের প্রয়োজনীয়তার উদাহরণগুলি দেখেছি, যেমন require('./app.less');, ওয়েবপ্যাকটি those ফাইলগুলিকে বান্ডলে অন্তর্ভুক্ত করার জন্য বলার অপেক্ষা রাখে না। এটি আপনাকে কেবল একটি একক প্রবেশ পয়েন্ট রাখতে দেয়, তবে এটি আমার কাছে সত্যই ভুল বলে মনে হচ্ছে - আমার জেএস কোডটির সাথে কিছু করার নেই কেন আমার জেএসটিতে কম প্রয়োজন হবে?

আমি একাধিক এন্ট্রি পয়েন্টগুলি ব্যবহার করার চেষ্টা করেছি, এন্ট্রি জেএস এবং প্রধান এলইএসসি ফাইল উভয়ই হস্তান্তর করেছি, তবে একাধিক এন্ট্রি পয়েন্টগুলি ব্যবহার করার সময়, ওয়েবপ্যাকটি এমন একটি বান্ডিল জেনারেট করে যা জেএস লোডে চালায় না - এটি সমস্ত কিছু বান্ডিল করে, কিন্তু জানে না doesn't শুরুতে কি কার্যকর করা উচিত।

আমি কি কেবল ওয়েবপ্যাকটি ভুল ব্যবহার করছি? এই পৃথক মডিউলগুলির জন্য আমার কি ওয়েবপ্যাকের পৃথক দৃষ্টান্ত চালানো উচিত? আমি যদি জেএস-এ মিশ্রিত না করে থাকি তবে কি আমি জেএস-নন সম্পদের জন্য ওয়েবপ্যাকটি ব্যবহার করব?


আমি নীচের টিউটোরিয়ালটি সুপারিশ করতে পারি মাঝারি.ফ্রেইকোডেক্যাম্প.org/…
wilo087

উত্তর:


29

আমি যদি জেএস-এ মিশ্রিত না করে থাকি তবে কি আমি জেএস-নন সম্পদের জন্য ওয়েবপ্যাকটি ব্যবহার করব?

হয়তো না. ওয়েবপ্যাকটি অবশ্যই জেএস কেন্দ্রিক, আপনি যা তৈরি করছেন তা একটি জেএস অ্যাপ্লিকেশন is এর বাস্তবায়ন require()আপনাকে সমস্ত কিছুকে মডিউল হিসাবে বিবেচনা করতে দেয় (সাস / এলইএসই পার্টিয়াল, জেএসওএন, বেশ কিছু সহ) এবং স্বয়ংক্রিয়ভাবে আপনার জন্য আপনার নির্ভরতা পরিচালনা করে (আপনি যে সমস্ত requireকিছু বান্ডেলযুক্ত, এবং অন্য কিছুই নয়)।

আমার জেএস কোডের সাথে এর কোনও যোগসূত্র না থাকলে কেন আমার জেএসে কম প্রয়োজন হবে?

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

আপনি নিজে সিএসএস বান্ডিল করতে ওয়েবপ্যাক ব্যবহার করতে পারবেন কিনা তা আমি জানি না (যখন সিএসএস ফাইলগুলি কোনও জেএস থেকে রেফারেন্স করা হয় না)। আমি নিশ্চিত যে আপনি প্লাগইন ইত্যাদির সাহায্যে কোনও কিছু বেঁধে ফেলতে পারেন, তবে নিশ্চিত না যে বাক্সের বাইরে এটি সম্ভব। আপনি যদি আপনার জেএস থেকে সিএসএস ফাইলগুলি উল্লেখ করেন তবে আপনি সহজেই এক্সট্রাক্ট টেক্সট প্লাগইনটি দিয়ে সিএসএসকে আলাদা আলাদা ফাইলে বান্ডেল করতে পারবেন you


18

require('main/less)আপনার কোনও জেএস ব্যবহার না করে একটি পৃথক সিএসএস বান্ডেল তৈরি করা যেতে পারে , তবে ব্রেন্ডন তার উত্তরের প্রথম অংশে উল্লেখ করেছেন যে ওয়েবপ্যাক মডুলার জেএসের পাশাপাশি কোনও গ্লোবাল সিএসএস বান্ডেলের জন্য তৈরি করা হয়নি, তবে কয়েকটি বিকল্প রয়েছে are ।

প্রথমটি হ'ল মেইনলেস এর জন্য অতিরিক্ত প্রবেশের বিন্দু যুক্ত করা, তারপরে সিএসএস বান্ডেল তৈরি করতে এক্সট্রাক্ট টেক্সট প্লাগইন ব্যবহার করুন:

var webpack = require('webpack'),
    ExtractTextPlugin = require("extract-text-webpack-plugin");

module.exports = {
    entry: {
        home: [
            'js/common',
            'js/homepage'
        ],
        style: [
            'styles/main.less'
        ]
    },
    output: {
        path: 'dist',
        filename: "[name].min.js"
    },
    resolve: {
        extensions: ["", ".js"]
    },
    module: {
        loaders: [{
            test: /\.less$/,
            loader: ExtractTextPlugin.extract("style", "css", "less")
        }]
    },
    plugins: [
        new ExtractTextPlugin("[name].min.css", {
            allChunks: true
        })
    ]
};

এই পদ্ধতির সমস্যাটি হ'ল আপনি উদাহরণস্বরূপ একটি অযাচিত জেএস ফাইল পাশাপাশি style.jsবান্ডিলও উত্পন্ন করেন : এটি একটি খালি ওয়েবপ্যাক মডিউল।

অন্য বিকল্পটি হ'ল একটি বিদ্যমান ওয়েবপ্যাক এন্ট্রি পয়েন্টে প্রধান কম ফাইল যুক্ত করা:

var webpack = require('webpack'),
    ExtractTextPlugin = require("extract-text-webpack-plugin");

module.exports = {
    entry: {
        home: [
            'js/common',
            'js/homepage',
            'styles/main.less'
        ],
    },
    output: {
        path: 'dist',
        filename: "[name].min.js"
    },
    resolve: {
        extensions: ["", ".js"]
    },
    module: {
        loaders: [{
            test: /\.less$/,
            loader: ExtractTextPlugin.extract("style", "css", "less")
        }]
    },
    plugins: [
        new ExtractTextPlugin("[name].min.css", {
            allChunks: true
        })
    ]
};

এটি আদর্শ যদি আপনার কেবল ১ টি এন্ট্রি পয়েন্ট থাকে তবে আপনার যদি আরও বেশি থাকে তবে আপনার ওয়েবপ্যাক কনফিগারেশনটি কিছুটা অদ্ভুত দেখাবে কারণ আপনাকে মূল কম ফাইলটিতে কোন এন্ট্রি পয়েন্ট যুক্ত করতে হবে তা নির্বিচারে বেছে নিতে হবে।


10

বিডমাসনের প্রাক্তন উত্তরটি আরও স্পষ্ট করতে - মনে হয় পছন্দসই কনফিগারেশনটি প্রতিটি পৃষ্ঠার জন্য একটি জেএস এবং সিএসএস বান্ডিল তৈরি করা হবে, যেমন:

 entry: {
        Home: ["./path/to/home.js", "./path/to/home.less"],
        About: ["./path/to/about.js", "./path/to/about.less"]
    }

এবং তারপরে [name]স্যুইচটি ব্যবহার করুন :

output: {
        path: "path/to/generated/bundles",
        filename: "[name].js"
    },
plugins: new ExtractTextPlugin("[name].css")

পুরো কনফিগারেশন - কিছু সংযোজন এ প্রশ্নের সাথে সংযুক্ত না করে (আমরা আসলে কমের পরিবর্তে SASS ব্যবহার করছি):

var ExtractTextPlugin = require("extract-text-webpack-plugin");
var debug = process.env.NODE_ENV !== "production";
var webpack = require('webpack');
require('babel-polyfill');

module.exports = [{
    devtool: debug ? "inline-sourcemap" : null,
    entry: {
        Home: ['babel-polyfill', "./home.js","path/to/HomeRootStyle.scss"],
        SearchResults: ['babel-polyfill', "./searchResults.js","path/to/SearchResultsRootStyle.scss"]
    },
    module: {
        loaders: [
            {
                test: /\.jsx?$/,
                exclude: /(node_modules|bower_components)/,
                loader: 'babel-loader',
                query: {
                    presets: ['react', 'es2015'],
                    plugins: ['react-html-attrs', 'transform-class-properties', 'transform-decorators-legacy']
                }
            },
            {
                test: /\.scss$/,
                loader: ExtractTextPlugin.extract("style-loader","css-raw-loader!sass-loader")
            }
        ]
    },
    output: {
        path: "./res/generated",
        filename: "[name].js"
    },
    plugins: debug ? [new ExtractTextPlugin("[name].css")] : [
        new ExtractTextPlugin("[name].css"),
        new webpack.DefinePlugin({
            'process.env':{
                'NODE_ENV': JSON.stringify('production')
            }
        }),
        new webpack.optimize.UglifyJsPlugin({
            compress:{
                warnings: true
            }
        })
    ]
}
];

9

মিনি-সিএসএস-এক্সট্র্যাক্ট প্লাগইন সহ ওয়েবপ্যাক 4 সমাধান

ওয়েবপ্যাক টিমটি এক্সট্রাক্ট টেক্সট প্লাগইনটিতে মিনি-সিএসএস-এক্সট্র্যাক্ট ব্যবহার করার পরামর্শ দেয়

এই সমাধানটি আপনাকে কেবল আপনার সিএসএস এন্ট্রি সমন্বিত একটি পৃথক অংশ তৈরি করতে দেয়:

const path = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

function recursiveIssuer(m) {
  if (m.issuer) {
    return recursiveIssuer(m.issuer);
  } else if (m.name) {
    return m.name;
  } else {
    return false;
  }
}

module.exports = {
  entry: {
    foo: path.resolve(__dirname, 'src/foo'),
    bar: path.resolve(__dirname, 'src/bar'),
  },
  optimization: {
    splitChunks: {
      cacheGroups: {
        fooStyles: {
          name: 'foo',
          test: (m, c, entry = 'foo') =>
            m.constructor.name === 'CssModule' && recursiveIssuer(m) === entry,
          chunks: 'all',
          enforce: true,
        },
        barStyles: {
          name: 'bar',
          test: (m, c, entry = 'bar') =>
            m.constructor.name === 'CssModule' && recursiveIssuer(m) === entry,
          chunks: 'all',
          enforce: true,
        },
      },
    },
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: '[name].css',
    }),
  ],
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [MiniCssExtractPlugin.loader, 'css-loader'],
      },
    ],
  },
};

আমার ব্যক্তিগত প্রকল্পগুলির মধ্যে একটির মাল্টিপল এন্ট্রি ব্যবহার করে এখানে আরও স্বল্পতর উদাহরণ রয়েছে:

const ManifestPlugin = require('webpack-manifest-plugin')
const webpack = require('webpack')
const path = require('path')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const VENDOR = path.join(__dirname, 'node_modules')
const LOCAL_JS = path.join(__dirname, 'app/assets/js')
const LOCAL_SCSS = path.join(__dirname, 'app/assets/scss')
const BUILD_DIR = path.join(__dirname, 'public/dist')
const EXTERNAL = path.join(__dirname, 'public/external')

function recursiveIssuer(m) {
  if (m.issuer) {
    return recursiveIssuer(m.issuer);
  } else if (m.name) {
    return m.name;
  } else {
    return false;
  }
}

module.exports = {
  entry: {
    vendor: [
      `${VENDOR}/jquery/dist/jquery.js`,
      `${VENDOR}/codemirror/lib/codemirror.js`,
      `${VENDOR}/codemirror/mode/javascript/javascript.js`,
      `${VENDOR}/codemirror/mode/yaml/yaml.js`,
      `${VENDOR}/zeroclipboard/dist/ZeroClipboard.js`,
    ],
    app: [
      `${LOCAL_JS}/utils.js`,
      `${LOCAL_JS}/editor.js`,
      `${LOCAL_JS}/clipboard.js`,
      `${LOCAL_JS}/fixtures.js`,
      `${LOCAL_JS}/ui.js`,
      `${LOCAL_JS}/data.js`,
      `${LOCAL_JS}/application.js`,
      `${LOCAL_JS}/google.js`
    ],
    'appStyles': [
      `${EXTERNAL}/montserrat.css`,
      `${EXTERNAL}/icons.css`,
      `${VENDOR}/purecss/pure-min.css`,
      `${VENDOR}/purecss/grids-core-min.css`,
      `${VENDOR}/purecss/grids-responsive-min.css`,
      `${VENDOR}/codemirror/lib/codemirror.css`,
      `${VENDOR}/codemirror/theme/monokai.css`,
    ]
  },
  optimization: {
    splitChunks: {
      cacheGroups: {
        appStyles: {
          name: 'appStyles',
          test: (m, c, entry = 'appStyles') =>
            m.constructor.name === 'CssModule' && recursiveIssuer(m) === entry,
          chunks: 'all',
          enforce: true,
        },
      },
    },
  },
  module:  {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: [ 'script-loader'],
      },
      {
        test: /\.(scss|css)$/,
        use: [
          MiniCssExtractPlugin.loader,
          'css-loader',
        ],
      },
    ],
  },
  mode: 'development',
  resolve: {
    extensions: ['.js', '.css', '.scss']
  },
  output: {
    path: BUILD_DIR,
    filename: "[name].[chunkhash].js",
  },
  plugins: [
    new ManifestPlugin(),
    new MiniCssExtractPlugin({
      filename: '[name].css'
    }),
  ]
};

আমি বুঝতে পারি যে এই পদ্ধতিটি খুব মডুলার নয়, তবে এটি আপনাকে তৈরি করতে একটি ভিত্তি দেয় এবং এমন প্রকল্পগুলিতে ওয়েবপ্যাক গ্রহণের জন্য একটি দুর্দান্ত কৌশল যা আপনি জাভাস্ক্রিপ্ট এবং সিএসএসের সাথে আন্তঃ-মিশ্রণ করতে চান না।

এই পদ্ধতির খারাপ দিকটি হ'ল সিএসএস-লোডার এখনও একটি অতিরিক্ত জাভাস্ক্রিপ্ট ফাইল উত্পন্ন করে (আপনি এটি ব্যবহার করা চয়ন করুন বা না করুন), এটি সম্ভবত ওয়েবপ্যাক 5-এ স্থির করা হবে

আমি যদি জেএস-এ মিশ্রিত না করে থাকি তবে কি আমি জেএস-নন সম্পদের জন্য ওয়েবপ্যাকটি ব্যবহার করব?

আমি এর সাথে কিছু ভুল দেখছি না তবে শেষ পর্যন্ত এটি একাধিক বিল্ড সিস্টেম পরিচালনার জন্য আপনার সহনশীলতার উপর নির্ভর করে। আমার কাছে এটি ওভারকিলের মতো অনুভূত হয়, তাই আমার পছন্দটি ওয়েবপ্যাক ইকোসিস্টেমে থাকা।

উপরে বর্ণিত কৌশলগুলি সম্পর্কে আরও তথ্যের জন্য, দয়া করে দেখুন https://github.com/webpack-contrib/mini-css-extract-plugin#extracting-css-based-on-entry


এটি আজকের ডিফল্ট উত্তর হওয়া উচিত
জিওনা গ্রানাটা

8

হ্যাঁ, এটি সম্ভব তবে অন্যরা যেমন বলেছেন যে এটি করার জন্য আপনার অতিরিক্ত প্যাকেজ লাগবে (প্যাকেজ.জসনের অধীনে ডেভডিপেন্ডেন্সি দেখুন)। আমি আমার বুটস্ট্র্যাপ এসসিএসএস -> সিএসএস এবং বুটস্ট্র্যাপ জেএস -> জেএস সংকলন করতে ব্যবহৃত নমুনা কোডটি এখানে।

webpack.config.js:

module.exports = {
    mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',
    entry: ['./src/app.js', './src/scss/app.scss'],
    output: {
    path: path.resolve(__dirname, 'lib/modules/theme/public'),
    filename: 'js/bootstrap.js'
    },
    module: {
        rules: [
            {
                test: /\.scss$/,
                use: [
                    {
                        loader: 'file-loader',
                        options: {
                            name: 'css/bootstrap.css',
                        }
                    },
                    {
                        loader: 'extract-loader'
                    },
                    {
                        loader: 'css-loader?-url'
                    },
                    {
                        loader: 'postcss-loader'
                    },
                    {
                        loader: 'sass-loader'
                    }
                ]
            }
        ]
    }
};

অতিরিক্ত postcss.config.js ফাইল:

module.exports = {
    plugins: {
        'autoprefixer': {}
    }
}

প্যাকেজ.জসন:

{
  "main": "app.js",
  "scripts": {
    "build": "webpack",
    "start": "node app.js"
  },
  "author": "P'unk Avenue",
  "license": "MIT",
  "dependencies": {
    "bootstrap": "^4.1.3",
  },
  "devDependencies": {
    "autoprefixer": "^9.3.1",
    "css-loader": "^1.0.1",
    "exports-loader": "^0.7.0",
    "extract-loader": "^3.1.0",
    "file-loader": "^2.0.0",
    "node-sass": "^4.10.0",
    "popper.js": "^1.14.6",
    "postcss-cli": "^6.0.1",
    "postcss-loader": "^3.0.0",
    "sass-loader": "^7.1.0",
    "style-loader": "^0.23.1",
    "webpack": "^4.26.1",
    "webpack-cli": "^3.1.2"
  }
}

টিউটোরিয়ালটি এখানে দেখুন: https://florianbrinkmann.com/en/4240/sass-webpack


1

উল্লিখিত অন্যদের মতো আপনিও একটি প্লাগইন ব্যবহার করতে পারেন।

ExtractTextPlugin অবচয় করা হয়।

আপনি বর্তমানে MiniCssExtractPluginআপনার ওয়েবপ্যাক কনফিগারেশনে প্রস্তাবিত ব্যবহার করতে পারেন :

module.exports = {
     entry: {
        home: ['index.js', 'index.less']
     },
     plugins: [
            new MiniCssExtractPlugin({
                filename: '[name].css',
            }),
     ]
}

0

আপনি আপনার এন্ট্রি জেএস ফাইলে আপনার কম প্রয়োজনীয় বিবৃতিগুলিও রাখতে পারেন:

in body.js

// CSS
require('css/_variable.scss')
require('css/_npm.scss')
require('css/_library.scss')
require('css/_lib.scss')

তারপরে ওয়েবপ্যাকে

  entry: {
    body: [
      Path.join(__dirname, '/source/assets/javascripts/_body.js')
    ]
  },

const extractSass = new ExtractTextPlugin({
  filename: 'assets/stylesheets/all.bundle.css',
  disable: process.env.NODE_ENV === 'development',
  allChunks: true
})
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.