मैं से स्थानांतरित करने के लिए कोशिश कर रहा हूँ Gulp
करने के लिए Webpack
। में Gulp
मैं काम जो प्रतियां से सभी फ़ाइलों और फ़ोल्डरों है / स्थिर / फ़ोल्डर में / निर्माण / फ़ोल्डर। उसी के साथ कैसे करें Webpack
? क्या मुझे कुछ प्लगइन की आवश्यकता है?
मैं से स्थानांतरित करने के लिए कोशिश कर रहा हूँ Gulp
करने के लिए Webpack
। में Gulp
मैं काम जो प्रतियां से सभी फ़ाइलों और फ़ोल्डरों है / स्थिर / फ़ोल्डर में / निर्माण / फ़ोल्डर। उसी के साथ कैसे करें Webpack
? क्या मुझे कुछ प्लगइन की आवश्यकता है?
जवाबों:
आपको चीजों को कॉपी करने की जरूरत नहीं है, वेबपैक gulp से अलग काम करता है। वेबपैक एक मॉड्यूल बंडल है और आपकी फ़ाइलों में आपके द्वारा संदर्भित सभी चीजें शामिल की जाएंगी। आपको बस उसके लिए एक लोडर निर्दिष्ट करने की आवश्यकता है।
इसलिए यदि आप लिखते हैं:
var myImage = require("./static/myImage.jpg");
वेबपैक पहले संदर्भित फ़ाइल को जावास्क्रिप्ट के रूप में पार्स करने का प्रयास करेगा (क्योंकि यह डिफ़ॉल्ट है)। बेशक, वह विफल हो जाएगा। इसलिए आपको उस फ़ाइल प्रकार के लिए एक लोडर निर्दिष्ट करने की आवश्यकता है। फ़ाइल - या यूआरएल-लोडर उदाहरण के लिए संदर्भित फ़ाइल ले, यह 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
( npm , Github ) का उपयोग करके स्थिर फ़ाइलों को भी कॉपी कर सकते हैं । अपने लिए static
करने के लिए build
उदाहरण:
const CopyWebpackPlugin = require('copy-webpack-plugin');
module.exports = {
context: path.join(__dirname, 'your-app'),
plugins: [
new CopyWebpackPlugin([
{ from: 'static' }
])
]
};
यदि आप अपनी स्टैटिक फ़ाइलों की प्रतिलिपि बनाना चाहते हैं, तो आप फ़ाइल-लोडर का इस तरह से उपयोग कर सकते हैं:
HTML फ़ाइलों के लिए:
webpack.config.js में:
module.exports = {
...
module: {
loaders: [
{ test: /\.(html)$/,
loader: "file?name=[path][name].[ext]&context=./app/static"
}
]
}
};
आपकी js फ़ाइल में:
require.context("./static/", true, /^\.\/.*\.html/);
./static/ आपकी js फ़ाइल कहाँ है के सापेक्ष है।
आप छवियों के साथ या जो भी कर सकते हैं। संदर्भ का पता लगाने के लिए एक शक्तिशाली तरीका है !!
index.html
एक उपनिर्देशिका में डाल रहा है जिसे यह कहा _
जा रहा है (अंडरस्कोर), क्या चल रहा है?
main.js
भीतर सब कुछ आयात कर रही है static
:require.context("./static/", true, /^.*/);
एक फायदा जो उपरोक्त कॉपी-वेबपैक-प्लगइन लाता है, जो पहले नहीं बताया गया है, वह यह है कि यहां बताए गए अन्य सभी तरीके अभी भी आपकी बंडल फ़ाइलों में संसाधनों को बंडल करते हैं (और आपको उन्हें कहीं "आवश्यकता" या "आयात" करने की आवश्यकता होती है)। अगर मैं बस कुछ छवियों को चारों ओर या कुछ टेम्पलेट धारावाहिकों में स्थानांतरित करना चाहता हूं, तो मैं अपनी जावास्क्रिप्ट बंडल फ़ाइल को बेकार संदर्भों के साथ बंद नहीं करना चाहता, मैं सिर्फ सही जगह पर फ़ाइलों को उत्सर्जित करना चाहता हूं। मुझे वेबपैक में ऐसा करने का कोई अन्य तरीका नहीं मिला है। निश्चित रूप से यह नहीं है कि मूल रूप से किस वेबपैक के लिए डिज़ाइन किया गया था, लेकिन यह निश्चित रूप से वर्तमान उपयोग का मामला है। (@BreakDS मुझे उम्मीद है कि यह आपके सवाल का जवाब देता है - यह केवल एक लाभ है अगर आप इसे चाहते हैं)
उपरोक्त सुझाव अच्छे हैं। लेकिन सीधे अपने प्रश्न का उत्तर देने का प्रयास करने के लिए मैं आपके द्वारा 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",
...
सरपट चलाने के लिए:
npm run copy
सबसे अधिक संभावना है कि आपको CopyWebpackPlugin का उपयोग करना चाहिए जिसका उल्लेख kevlened उत्तर में किया गया था। वैकल्पिक रूप से कुछ तरह की फाइलों जैसे .html या .json के लिए आप रॉ-लोडर या json-loader का भी उपयोग कर सकते हैं। इसके माध्यम से इंस्टॉल करें npm install -D raw-loader
और फिर आपको केवल हमारी webpack.config.js
फ़ाइल में एक और लोडर जोड़ने की आवश्यकता है ।
पसंद:
{
test: /\.html/,
loader: 'raw'
}
नोट: किसी भी परिवर्तन को प्रभावी करने के लिए वेबपैक-देव-सर्वर को पुनः आरंभ करें।
और अब आपको रिश्तेदार पथों का उपयोग करके HTML फ़ाइलों की आवश्यकता हो सकती है, इससे फ़ोल्डर्स को इधर-उधर ले जाना आसान हो जाता है।
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
और न ही उन्हें वैश्विक टकराव से बचने के लिए एक obtuse और "उम्मीद" अद्वितीय फ़ाइल नाम बनाना होगा। उसी कारण से हम CSS मॉड्यूल का उपयोग करते हैं ।
[path][name].[ext]
और विशिष्ट वातावरण या उपयोग के मामले में इसे संशोधित करने के लिए बहुत लचीलापन प्रदान किया गया है ... फ़ाइल-लोडर
आप अपने पैकेज में बैश लिख सकते हैं। json:
# 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"
मैं यहां भी फंस गया था। कॉपी-वेबपैक-प्लगइन ने मेरे लिए काम किया।
हालांकि, मेरे मामले में 'कॉपी-वेबपैक-प्लगइन' आवश्यक नहीं था (मैं बाद में सीखा)।
वेबपैक रूट पथ के
उदाहरण को अनदेखा करता है
<img src="/images/logo.png'>
इसलिए, रास्तों में 'कॉपी-वेबपैक-प्लगइन' का उपयोग '~' किए बिना इस काम को करने के लिए
<img src="~images/logo.png'>
'~' वेबपैक को 'चित्र' को एक मॉड्यूल मानने के लिए कहता है
ध्यान दें: आपको छवियों निर्देशिका की मूल निर्देशिका को जोड़ना पड़ सकता है
resolve: {
modules: [
'parent-directory of images',
'node_modules'
]
}
यात्रा https://vuejs-templates.github.io/webpack/static.html
वेबपैक कॉन्फ़िगरेशन फ़ाइल (वेबपैक 2 में) आपको एक वादा श्रृंखला को निर्यात करने की अनुमति देती है, जब तक कि अंतिम चरण एक वेबपैक कॉन्फिगर वस्तु को वापस कर देता है। वादा कॉन्फ़िगरेशन डॉक्स देखें । वहां से:
webpack अब कॉन्फ़िगरेशन फ़ाइल से एक वादा लौटाने का समर्थन करता है। यह आपको कॉन्फ़िगरेशन फ़ाइल में async प्रसंस्करण करने की अनुमति देता है।
आप एक सरल पुनरावर्ती प्रतिलिपि फ़ंक्शन बना सकते हैं जो आपकी फ़ाइल की प्रतिलिपि बनाता है, और उसके बाद ही वेबपैक को ट्रिगर करता है। उदाहरण के लिए:
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, /^\.\/.*\.*/);