ฉันไม่ชอบวิธีแก้ไขปัญหาที่นี่ (รวมถึงที่ฉันเคยให้ไว้ก่อนหน้านี้ ) และนี่คือเหตุผล:
- ปัญหาของคำตอบที่โหวตสูงสุดคือคุณต้องซิงค์รายการแท็กสคริปต์ด้วยตนเองเมื่อคุณเพิ่ม / เปลี่ยนชื่อ / ลบไฟล์ JS
- ปัญหาของคำตอบที่ยอมรับคือรายการไฟล์ JS ของคุณไม่สามารถจับคู่รูปแบบได้ หมายความว่าคุณต้องอัปเดตด้วยตัวเองใน Gruntfile
ฉันหาวิธีแก้ปัญหาทั้งสองนี้แล้ว ฉันตั้งค่างานเสี้ยงฮึดฮัดแสดงความไม่พอใจดังนั้นทุกครั้งที่มีการเพิ่มหรือลบไฟล์แท็กสคริปต์จะถูกสร้างขึ้นโดยอัตโนมัติเพื่อแสดงให้เห็นว่า ด้วยวิธีนี้คุณไม่จำเป็นต้องแก้ไขไฟล์ html หรือไฟล์ grunt ของคุณเมื่อคุณเพิ่ม / ลบ / เปลี่ยนชื่อไฟล์ JS ของคุณ
เพื่อสรุปวิธีการทำงานฉันมีเทมเพลต html ที่มีตัวแปรสำหรับแท็กสคริปต์ ฉันใช้https://github.com/alanshaw/grunt-include-replaceเพื่อเติมตัวแปรนั้น ในโหมด dev ตัวแปรนั้นมาจากรูปแบบการวนรอบของไฟล์ JS ทั้งหมดของฉัน ภารกิจเฝ้าดูคำนวณใหม่ค่านี้เมื่อเพิ่มหรือลบไฟล์ JS
ตอนนี้เพื่อให้ได้ผลลัพธ์ที่แตกต่างในโหมด 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
โหมด ในโหมด dev ตัวแปรนี้จะขยายเป็นค่าเช่นนี้:
<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>
แจ้งให้เราทราบหากคุณมีคำถามใด ๆ
PS: นี่เป็นโค้ดที่บ้าคลั่งสำหรับสิ่งที่ฉันต้องการจะทำในแอป JS ฝั่งไคลเอ็นต์ ฉันหวังว่าบางคนสามารถเปลี่ยนสิ่งนี้ให้เป็นปลั๊กอินที่ใช้ซ้ำได้ บางทีฉันอาจจะสักวัน