मैं यहां दिए गए समाधानों को नापसंद करता हूं (इनमें से जो मैंने पहले दिया था ) और यहां बताया गया है:
- सबसे अधिक वोट किए गए उत्तर के साथ समस्या यह है कि आपको जेएस फ़ाइल को जोड़ / नाम बदलने / हटाने के लिए स्क्रिप्ट टैग की सूची को मैन्युअल रूप से सिंक करना होगा।
- स्वीकृत उत्तर के साथ समस्या यह है कि आपकी जेएस फाइलों की सूची में पैटर्न मिलान नहीं हो सकता है। इसका मतलब है कि आपको इसे ग्रंटफाइल में हाथ से अपडेट करना है।
मुझे लगा है कि इन दोनों मुद्दों को कैसे हल किया जाए। मैंने अपना ग्रन्ट कार्य सेट कर दिया है ताकि हर बार जब कोई फ़ाइल जोड़ी जाए या हटाई जाए, तो स्क्रिप्ट टैग स्वतः ही उसे प्रतिबिंबित करने के लिए उत्पन्न हो जाएं। इस प्रकार, आपको अपनी JS फाइल को जोड़ने / हटाने / नाम बदलने के लिए अपनी html फ़ाइल या अपनी ग्रन्ट फ़ाइल को संशोधित करने की आवश्यकता नहीं है ।
यह बताने के लिए कि यह कैसे काम करता है, मेरे पास स्क्रिप्ट टैग के लिए एक चर के साथ एक HTML टेम्पलेट है। मैं उस चर को आबाद करने के लिए https://github.com/alanshaw/grunt-include-replace का उपयोग करता हूं । देव मोड में, वह चर मेरे सभी जेएस फाइलों के ग्लोबिंग पैटर्न से आता है। जब जेएस फ़ाइल जोड़ी जाती है या निकाली जाती है, तो वॉच टास्क इस मूल्य को पुनर्गणित करता है।
अब, dev या prod मोड में विभिन्न परिणाम प्राप्त करने के लिए, आप बस उस वेरिएबल को एक अलग मान के साथ पॉप्युलेट करते हैं। यहाँ कुछ कोड है:
var jsSrcFileArray = [
'src/main/scripts/app/js/Constants.js',
'src/main/scripts/app/js/Random.js',
'src/main/scripts/app/js/Vector.js',
'src/main/scripts/app/js/scripts.js',
'src/main/scripts/app/js/StatsData.js',
'src/main/scripts/app/js/Dialog.js',
'src/main/scripts/app/**/*.js',
'!src/main/scripts/app/js/AuditingReport.js'
];
var jsScriptTags = function (srcPattern, destPath) {
if (srcPattern === undefined) {
throw new Error("srcPattern undefined");
}
if (destPath === undefined) {
throw new Error("destPath undefined");
}
return grunt.util._.reduce(
grunt.file.expandMapping(srcPattern, destPath, {
filter: 'isFile',
flatten: true,
expand: true,
cwd: '.'
}),
function (sum, file) {
return sum + '\n<script src="' + file.dest + '" type="text/javascript"></script>';
},
''
);
};
...
grunt.initConfig({
includereplace: {
dev: {
options: {
globals: {
scriptsTags: '<%= jsScriptTags(jsSrcFileArray, "../../main/scripts/app/js")%>'
}
},
src: [
'src/**/html-template.html'
],
dest: 'src/main/generated/',
flatten: true,
cwd: '.',
expand: true
},
prod: {
options: {
globals: {
scriptsTags: '<script src="app.min.js" type="text/javascript"></script>'
}
},
src: [
'src/**/html-template.html'
],
dest: 'src/main/generatedprod/',
flatten: true,
cwd: '.',
expand: true
}
...
jsScriptTags: jsScriptTags
jsSrcFileArray
आपकी विशिष्ट ग्रन्ट फ़ाइल-ग्लोबिंग पैटर्न है। jsScriptTags
लेता है jsSrcFileArray
और script
दोनों पक्षों के टैग के साथ उन्हें एक साथ मिलाता है । destPath
मैं प्रत्येक फ़ाइल पर उपसर्ग चाहता हूँ।
और यहाँ HTML क्या दिखता है:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>Example</title>
</head>
<body>
@@scriptsTags
</body>
</html>
अब, जैसा कि आप विन्यास में देख सकते हैं, मैं उस चर का मान एक हार्ड कोडित script
टैग के रूप में उत्पन्न करता हूं जब यह prod
मोड में चलता है। देव विधा में, यह चर इस तरह से एक मूल्य में विस्तारित होगा:
<script src="../../main/scripts/app/js/Constants.js" type="text/javascript"></script>
<script src="../../main/scripts/app/js/Random.js" type="text/javascript"></script>
<script src="../../main/scripts/app/js/Vector.js" type="text/javascript"></script>
<script src="../../main/scripts/app/js/StatsData.js" type="text/javascript"></script>
<script src="../../main/scripts/app/js/Dialog.js" type="text/javascript"></script>
अगर आपका कोई प्रश्न हैं, तो मुझे से पूछें।
पुनश्च: यह हर क्लाइंट-साइड जेएस ऐप में जो कुछ करना चाहता है, उसके लिए कोड की एक पागल राशि है। मुझे आशा है कि कोई इसे पुन: प्रयोज्य प्लगइन में बदल सकता है। शायद मैं किसी दिन होगा।