আমি থেকে সরাতে চেষ্টা করছি Gulpকরার Webpack। ইন Gulpআমি কাজের যা কপি থেকে সব ফাইল এবং ফোল্ডার আছে / স্ট্যাটিক / ফোল্ডারে / বিল্ড / ফোল্ডার। কিভাবে একই সঙ্গে Webpack? আমার কি কিছু প্লাগইন দরকার?
আমি থেকে সরাতে চেষ্টা করছি Gulpকরার Webpack। ইন Gulpআমি কাজের যা কপি থেকে সব ফাইল এবং ফোল্ডার আছে / স্ট্যাটিক / ফোল্ডারে / বিল্ড / ফোল্ডার। কিভাবে একই সঙ্গে Webpack? আমার কি কিছু প্লাগইন দরকার?
উত্তর:
আপনার চারপাশের জিনিসগুলি অনুলিপি করার দরকার নেই, ওয়েবপ্যাক গুলির চেয়ে আলাদা কাজ করে। ওয়েবপ্যাক হ'ল একটি মডিউল বান্ডলার এবং আপনার ফাইলগুলিতে আপনি যা উল্লেখ করেন তা অন্তর্ভুক্ত করা হবে। এর জন্য আপনাকে একটি লোডার নির্দিষ্ট করতে হবে।
সুতরাং আপনি যদি লিখুন:
var myImage = require("./static/myImage.jpg");
ওয়েবপ্যাক প্রথমে রেফারেন্সযুক্ত ফাইলটিকে জাভাস্ক্রিপ্ট হিসাবে পার্স করার চেষ্টা করবে (কারণ এটি ডিফল্ট)। অবশ্যই, এটি ব্যর্থ হবে। এজন্য আপনাকে সেই ফাইল ধরণের জন্য একটি লোডার নির্দিষ্ট করতে হবে। ফাইল - অথবা URL-লোডার উদাহরণস্বরূপ উল্লেখ করা ফাইল নিতে, এটা webpack এর আউটপুট ফোল্ডার পুরা (যা হওয়া উচিত buildআপনার ক্ষেত্রে) এবং যে ফাইলের জন্য কুচি-কুচি করিয়া কাটা বস্তু URL ফিরে যান।
var myImage = require("./static/myImage.jpg");
console.log(myImage); // '/build/12as7f9asfasgasg.jpg'
সাধারণত লোডারগুলি ওয়েবপ্যাক কনফিগারেশনের মাধ্যমে প্রয়োগ করা হয়:
// webpack.config.js
module.exports = {
...
module: {
loaders: [
{ test: /\.(jpe?g|gif|png|svg|woff|ttf|wav|mp3)$/, loader: "file" }
]
}
};
অবশ্যই এই কাজটি করার জন্য আপনাকে প্রথমে ফাইল-লোডার ইনস্টল করতে হবে।
ফাইল-লোডার মডিউলটি ব্যবহার করে সম্পদের প্রয়োজন হ'ল ওয়েবপ্যাকটি যেভাবে ব্যবহার করার উদ্দেশ্যে ( উত্স )। তবে আপনার যদি আরও নমনীয়তার প্রয়োজন হয় বা একটি ক্লিনার ইন্টারফেস চান, আপনি আমার copy-webpack-plugin( এনপিএম , গিথুব ) ব্যবহার করে সরাসরি স্ট্যাটিক ফাইলগুলি অনুলিপি করতে পারেন । আপনার জন্য staticকরতে buildউদাহরণ:
const CopyWebpackPlugin = require('copy-webpack-plugin');
module.exports = {
context: path.join(__dirname, 'your-app'),
plugins: [
new CopyWebpackPlugin([
{ from: 'static' }
])
]
};
আপনি যদি আপনার স্থির ফাইলগুলি অনুলিপি করতে চান তবে আপনি ফাইল-লোডারটি এইভাবে ব্যবহার করতে পারেন:
এইচটিএমএল ফাইলগুলির জন্য:
ওয়েবপ্যাক.কমফিগ.জেজে:
module.exports = {
...
module: {
loaders: [
{ test: /\.(html)$/,
loader: "file?name=[path][name].[ext]&context=./app/static"
}
]
}
};
আপনার জেএস ফাইলটিতে:
require.context("./static/", true, /^\.\/.*\.html/);
./static/ আপনার js ফাইলের সাথে সম্পর্কিত।
আপনি ইমেজ বা যা কিছু সঙ্গে একই করতে পারেন। প্রসঙ্গটি এক্সপ্লোর করার একটি শক্তিশালী পদ্ধতি !!
index.htmlউপ-ডিরেক্টরিতে প্রবেশ করছে যা এটি তৈরি করছে _(আন্ডারস্কোর), কী হচ্ছে?
main.jsমধ্যে সমস্ত কিছু আমদানি করছে static:require.context("./static/", true, /^.*/);
পূর্বোক্ত অনুলিপি-ওয়েবপ্যাক-প্লাগইনটি নিয়ে আসার আগে একটি সুবিধা যা এখানে আগে ব্যাখ্যা করা হয়নি তা হ'ল এখানে বর্ণিত অন্যান্য সমস্ত পদ্ধতি এখনও আপনার বান্ডিল ফাইলগুলিতে সংস্থানগুলি বান্ডিল করে (এবং আপনাকে "কোথাও" প্রয়োজন "বা" আমদানি "করতে হবে)। আমি যদি কেবল কিছু চিত্র বা কিছু টেম্পলেট পার্টিয়ালকে ঘুরে দেখতে চাই তবে আমি আমার জাভাস্ক্রিপ্ট বান্ডিল ফাইলটিকে অকার্যকর রেফারেন্স সহ বিশৃঙ্খল করতে চাই না, আমি কেবল ফাইলগুলি সঠিক জায়গায় নির্গত করতে চাই। ওয়েবপ্যাকে এটি করার জন্য আমি অন্য কোনও উপায় খুঁজে পাইনি। স্বীকার করা যে ওয়েবপ্যাকটি মূলত যার জন্য ডিজাইন করা হয়েছিল তা নয়, তবে এটি অবশ্যই বর্তমান ব্যবহারের ক্ষেত্রে। (@ ব্র্যাকডিডিএস আশা করি এটি আপনার প্রশ্নের উত্তর দেয় - আপনি এটি চাইলে এটি কেবল একটি উপকার)
উপরোক্ত পরামর্শগুলি ভাল। তবে সরাসরি আপনার প্রশ্নের উত্তর দেওয়ার চেষ্টা করার জন্য আমি cpy-cliআপনার মধ্যে সংজ্ঞায়িত কোনও স্ক্রিপ্টে ব্যবহার করার পরামর্শ দেব package.json।
এই উদাহরণটি nodeআপনার পথে কোথাও প্রত্যাশা করে। cpy-cliবিকাশ নির্ভরতা হিসাবে ইনস্টল করুন :
npm install --save-dev cpy-cli
তারপরে কয়েকটি নোডেজ ফাইল তৈরি করুন। একটি অনুলিপি করতে এবং অন্যটি একটি চেকমার্ক এবং বার্তা প্রদর্শন করতে।
copy.js
#!/usr/bin/env node
var shelljs = require('shelljs');
var addCheckMark = require('./helpers/checkmark');
var path = require('path');
var cpy = path.join(__dirname, '../node_modules/cpy-cli/cli.js');
shelljs.exec(cpy + ' /static/* /build/', addCheckMark.bind(null, callback));
function callback() {
process.stdout.write(' Copied /static/* to the /build/ directory\n\n');
}
checkmark.js
var chalk = require('chalk');
/**
* Adds mark check symbol
*/
function addCheckMark(callback) {
process.stdout.write(chalk.green(' ✓'));
callback();
}
module.exports = addCheckMark;
স্ক্রিপ্টটি যুক্ত করুন package.json। ধরে নিচ্ছি স্ক্রিপ্টগুলি রয়েছে<project-root>/scripts/
...
"scripts": {
"copy": "node scripts/copy.js",
...
Sript চালানোর জন্য:
npm run copy
সম্ভবত আপনার কপিরউইবপ্যাক প্লাগইন ব্যবহার করা উচিত যা কেভলিন্ড উত্তরে উল্লিখিত ছিল। Html বা .json এর মতো কিছু ধরণের ফাইলের জন্য পর্যায়ক্রমে আপনি কাঁচা-লোডার বা জেসন-লোডারও ব্যবহার করতে পারেন। এটির মাধ্যমে ইনস্টল করুন npm install -D raw-loaderএবং তারপরে আপনাকে কেবল যা করতে হবে তা হ'ল আমাদের webpack.config.jsফাইলটিতে অন্য একটি লোডার যুক্ত করা ।
ভালো লেগেছে:
{
test: /\.html/,
loader: 'raw'
}
দ্রষ্টব্য: যে কোনও কনফিগার পরিবর্তন কার্যকর হওয়ার জন্য ওয়েবপ্যাক-ডেভ-সার্ভার পুনরায় চালু করুন।
এবং এখন আপনার আপেক্ষিক পাথ ব্যবহার করে এইচটিএমএল ফাইলের প্রয়োজন হতে পারে, এটি ফোল্ডারগুলিকে চারপাশে সরানো আরও সহজ করে তোলে।
template: require('./nav.html')
আমি স্থিতিটি লোড করার উপায় imagesএবং fonts:
module: {
rules: [
....
{
test: /\.(jpe?g|png|gif|svg)$/i,
/* Exclude fonts while working with images, e.g. .svg can be both image or font. */
exclude: path.resolve(__dirname, '../src/assets/fonts'),
use: [{
loader: 'file-loader',
options: {
name: '[name].[ext]',
outputPath: 'images/'
}
}]
},
{
test: /\.(woff(2)?|ttf|eot|svg|otf)(\?v=\d+\.\d+\.\d+)?$/,
/* Exclude images while working with fonts, e.g. .svg can be both image or font. */
exclude: path.resolve(__dirname, '../src/assets/images'),
use: [{
loader: 'file-loader',
options: {
name: '[name].[ext]',
outputPath: 'fonts/'
},
}
]
}
file-loaderকাজ করতে ইনস্টল করতে ভুলবেন না ।
logo.pngতা খতিয়ে দেখার দরকার নেই এবং তাদের বিশ্বব্যাপী সংঘর্ষ এড়াতে একটি অভ্যাস এবং "আশাবাদী" অনন্য ফাইল নাম তৈরি করতে হবে না। একই কারণে আমরা সিএসএস মডিউল ব্যবহার করি ।
[path][name].[ext]এবং নির্দিষ্ট পরিবেশ বা ক্ষেত্রে ব্যবহারের জন্য এটি পরিবর্তন করার জন্য প্রচুর নমনীয়তা সরবরাহ করা হয়েছে ... ফাইল-লোডার
আপনি আপনার প্যাকেজ.জসনে বাশ লিখতে পারেন:
# package.json
{
"name": ...,
"version": ...,
"scripts": {
"build": "NODE_ENV=production npm run webpack && cp -v <this> <that> && echo ok",
...
}
}
"build": "webpack && xcopy images dist\\images\\ /S /Y && xcopy css dist\\css\\ /S /Y"
আমিও এখানে আটকে ছিলাম। কপি-ওয়েবপ্যাক-প্লাগইন আমার জন্য কাজ করেছে।
তবে, 'কপি-ওয়েবপ্যাক-প্লাগইন' আমার ক্ষেত্রে প্রয়োজনীয় ছিল না (আমি পরে শিখেছি)।
webpack উপেক্ষা করে রুট পাথ
উদাহরণস্বরূপ
<img src="/images/logo.png'>
সুতরাং, 'অনুলিপি-ওয়েবপ্যাক-প্লাগইন ব্যবহার না করেই এই কাজটি করতে' make 'পথে ব্যবহার করুন
<img src="~images/logo.png'>
'images' ওয়েবপ্যাকটিকে 'চিত্রগুলি' মডিউল হিসাবে বিবেচনা করতে বলে
দ্রষ্টব্য: আপনাকে চিত্রের ডিরেক্টরি প্যারেন্ট ডিরেক্টরি যুক্ত করতে হতে পারে
resolve: {
modules: [
'parent-directory of images',
'node_modules'
]
}
পরিদর্শন https://vuejs-templates.github.io/webpack/static.html
ওয়েবপ্যাক কনফিগারেশন ফাইল (ওয়েবপ্যাক ২ এ) আপনাকে প্রতিশ্রুতি শৃঙ্খলা রফতানি করার অনুমতি দেয়, যতক্ষণ না শেষ পদক্ষেপটি একটি ওয়েবপ্যাক কনফিগার অবজেক্ট দেয়। প্রতিশ্রুতি কনফিগারেশন ডক্স দেখুন । সেখান থেকে:
ওয়েবপ্যাক এখন কনফিগারেশন ফাইল থেকে প্রতিশ্রুতি ফেরত সমর্থন করে। এটি আপনার কনফিগারেশন ফাইলে অ্যাসিঙ্ক প্রসেসিং করতে দেয়।
আপনি একটি সাধারণ পুনরাবৃত্তির অনুলিপি ফাংশন তৈরি করতে পারেন যা আপনার ফাইলটি অনুলিপি করে এবং তারপরেই ওয়েবপ্যাকটি ট্রিগার করে। উদাহরণ:
module.exports = function(){
return copyTheFiles( inpath, outpath).then( result => {
return { entry: "..." } // Etc etc
} )
}
আসুন আপনার সমস্ত স্থিতিশীল সম্পদগুলি মূল স্তরের "স্ট্যাটিক" ফোল্ডারে রয়েছে এবং আপনি সেগুলি সাবফোল্ডারের কাঠামো বজায় রেখে বিল্ড ফোল্ডারে অনুলিপি করতে চান, তারপরে আপনার এন্ট্রি ফাইলে) কেবল লিখুন
//index.js or index.jsx
require.context("!!file?name=[path][name].[ext]&context=./static!../static/", true, /^\.\/.*\.*/);