บทแนะนำเกี่ยวกับ Gulp 4 จะอธิบายทีละขั้นตอน วิธีการตั้งค่า Gulp ในเวิร์กโฟลว์ของคุณเพื่อคอมไพล์ไฟล์ Sass และ JavaScript
หากคุณยังไม่เคยใช้ Gulp เราขอแนะนำอย่างยิ่งให้คุณลองดู! คุณสามารถใช้ Gulp เพื่อทำงานที่เป็นประโยชน์มากมาย เช่น รวบรวมไฟล์ Sass ของคุณเป็น CSS ประมวลผลไฟล์ JavaScript และเพิ่มประสิทธิภาพไฟล์ของคุณ
ต่อไปนี้คือขั้นตอนพื้นฐานในการติดตั้งและเรียกใช้ Gulp ที่เราจะกล่าวถึงในบทแนะนำนี้:
- ติดตั้ง gulp-cli บนบรรทัดคำสั่งของคุณโดยเรียกใช้
npm install gulp-cli -g
. - ติดตั้ง Gulp โดยเรียกใช้
npm install gulp
. - ติดตั้งแพ็คเกจ npm อื่นๆ สำหรับเวิร์กโฟลว์อึกของคุณ
- สร้าง
gulpfile.js
ไฟล์ในรูทโปรเจ็กต์ของคุณ - นำเข้าแพ็คเกจ npm ของคุณเป็นโมดูลใน gulpfile ของคุณ
- เพิ่มงานของคุณไปที่ gulpfile เพื่อคอมไพล์ไฟล์ SCSS/JS และเรียกใช้งานการเฝ้าดู
- เรียกใช้
gulp
คำสั่งให้รันงานทั้งหมดของคุณ
อึกคืออะไรและทำหน้าที่อะไร
อึกเป็นเครื่องมือที่จะทำงานต่างๆ ให้กับคุณในเวิร์กโฟลว์การพัฒนาเว็บของคุณ มันอาจจะเรียกว่าบันเดิล เครื่องมือสร้าง หรือตัวดำเนินการงาน เครื่องมือที่คล้ายกันคือ Webpack และ Grunt (แม้ว่า Grunt จะล้าสมัยอย่างรวดเร็ว)
นี่คือสิ่งที่เราจะให้ Gulp ทำเพื่อเรา:
- รวบรวมไฟล์ Sass ของเราเป็น CSS
- เพิ่มคำนำหน้าผู้ขายใน CSS ของเรา
- ย่อไฟล์ CSS สุดท้ายของเรา
- ต่อ (เช่น รวม) ไฟล์ JS ของเรา
- อัปลักษณ์ไฟล์ JS สุดท้ายของเรา
- ย้ายไฟล์ CSS/JS สุดท้ายไปยัง
/dist
. ของเรา โฟลเดอร์
เจ๋งมากใช่มั้ย!
วิธีการทำงานคือ การตั้งค่าและงานทั้งหมดของคุณจะถูกเก็บไว้ใน gulpfile.js
ไฟล์. และคุณเรียกใช้ Gulp บนบรรทัดคำสั่งของคุณ
ส่วนที่ดีเกี่ยวกับเรื่องนั้นก็คือเมื่อคุณตั้งค่า gulpfile เรียบร้อยแล้ว คุณจะนำไฟล์ gulpfile ไปใช้กับโปรเจ็กต์อื่นๆ ได้อย่างง่ายดาย ประหยัดเวลาได้มาก!
ไปที่การติดตั้งและตั้งค่า Gulp บนคอมพิวเตอร์ของคุณกัน
วิธีการติดตั้งอึก 4
ก่อนที่คุณจะเรียกใช้ Gulp ได้ คุณจะต้องติดตั้งสองสามสิ่ง:
- ติดตั้ง Node.js หากยังไม่มี
- ติดตั้งยูทิลิตี้บรรทัดคำสั่งอึกโดยเรียกใช้
npm install --global gulp-cli
.
เมื่อคุณใช้ Gulp ได้แล้ว ลองดูโปรเจ็กต์ตัวอย่างที่ฉันสร้างซึ่งใช้ Gulp!
เป็นโครงการต้นแบบส่วนหน้าซึ่งเป็นวิธีที่รวดเร็วสำหรับฉันในการเริ่มต้นกับเว็บไซต์ส่วนหน้าง่ายๆ
(ฉันยังมีข้อมูลโค้ดมากมายในส่วนที่เหลือของบทช่วยสอนนี้ คุณจึงสามารถอ้างอิงถึงสิ่งเหล่านั้นได้เช่นกัน!)
ในการตั้งค่าโปรเจ็กต์ต้นแบบส่วนหน้า:
- โคลนหรือดาวน์โหลด Git repo ของโปรเจ็กต์นี้ลงในคอมพิวเตอร์ของคุณ
- เปิดโปรเจ็กต์ และในโฟลเดอร์โปรเจ็กต์รูท ไปที่บรรทัดคำสั่งของคุณและเรียกใช้
npm install
. สิ่งนี้จะติดตั้งแพ็คเกจ npm ที่แสดงในpackage.json
ไฟล์ โดยเฉพาะอึก 4
ตอนนี้คุณควรมีไฟล์โปรเจ็กต์ที่ตั้งค่า และแพ็คเกจ npm ทั้งหมดที่ติดตั้งไว้ที่เราจะใช้เพื่อรันงานอึก
เนื่องจากไฟล์จาก repo พร้อมใช้งานแล้ว หากคุณพิมพ์ gulp
ในบรรทัดคำสั่ง คุณควรเห็นผลลัพธ์ดังนี้:
> gulp
[22:29:48] Using gulpfile ~\Documents\GitHub\frontend-boilerplate\gulpfile.js
[22:29:48] Starting 'default'...
[22:29:48] Starting 'scssTask'...
[22:29:48] Starting 'cacheBustTask'...
[22:29:48] Finished 'cacheBustTask' after 39 ms
[22:29:48] Starting 'jsTask'...
[22:29:48] Finished 'jsTask' after 340 ms
[22:29:48] Finished 'scssTask' after 347 ms
[22:29:48] Starting 'watchTask'...
และคุณได้วิ่งอึก!
เกิดอะไรขึ้นในโปรเจ็กต์เมื่อคุณเรียกใช้ Gulp
เอาล่ะ คุณมีโครงการที่ทำงานสำเร็จแล้ว! ตอนนี้ มาดูรายละเอียดเพิ่มเติมว่ามีอะไรอยู่ในโครงการและทำงานอย่างไร
อันดับแรก ต่อไปนี้คือข้อมูลสรุปสั้นๆ เกี่ยวกับโครงสร้างไฟล์ของโครงการของเรา:
- index.html — ไฟล์ HTML หลักของคุณ
- package.json — มีแพ็คเกจ npm ทั้งหมดที่จะติดตั้งเมื่อคุณเรียกใช้
npm install
. - gulpfile.js — มีการกำหนดค่าและรันงาน Gulp ทั้งหมด
- /แอป — โฟลเดอร์ที่ทำงาน คุณจะแก้ไขไฟล์ SCSS/JS ที่นี่
- /dist — อึกจะส่งออกไฟล์ที่นี่ อย่าแก้ไขไฟล์เหล่านี้
ในเวิร์กโฟลว์ของคุณ คุณจะต้องแก้ไขไฟล์ HTML, SCSS และ JS อึกจะตรวจจับการเปลี่ยนแปลงและรวบรวมทุกอย่าง จากนั้นคุณจะโหลดไฟล์ CSS/JS สุดท้ายจาก /dist
โฟลเดอร์ใน index.html
. ของคุณ ไฟล์.
ตอนนี้เรามี Gulp ทำงานอย่างไร มาดูวิธีการทำงานของ Gulp กันดีกว่า
สิ่งที่อยู่ใน gulpfile.js คืออะไร
นี่คือคำอธิบายเชิงลึกของแต่ละส่วนของ gulpfile และสิ่งที่พวกเขาทำ:
ขั้นตอนที่ 1:เริ่มต้นโมดูล npm
ที่ด้านบนสุดของ gulpfile.js
เรามีค่าคงที่มากมายที่นำเข้าแพ็คเกจ npm ที่เราติดตั้งไว้ก่อนหน้านี้ โดยใช้ require()
ฟังก์ชัน
นี่คือสิ่งที่แพ็คเกจของเราทำ:
แพ็คเกจอึก:
gulp
— รันทุกอย่างใน gulpfile.js เรากำลังส่งออกเฉพาะฟังก์ชันอึกเฉพาะที่เราจะใช้ เช่นsrc
,dest
,watch
, และคนอื่น ๆ. ซึ่งช่วยให้เราสามารถเรียกใช้ฟังก์ชันเหล่านั้นได้โดยตรงโดยไม่ต้องใช้gulp
เช่น เราก็แค่พิมพ์src()
แทนที่จะเป็นgulp.src()
.
แพ็คเกจ CSS:
gulp-sourcemaps
— แมปสไตล์ CSS กลับไปที่ไฟล์ SCSS ดั้งเดิมในเครื่องมือพัฒนาเบราว์เซอร์ของคุณgulp-sass
— รวบรวม SCSS เป็น CSSgulp-postcss
— เรียกใช้คำเติมหน้าอัตโนมัติและ cssnano (ดูด้านล่าง)autoprefixer
— เพิ่มคำนำหน้าผู้ขายให้กับ CSScssnano
— ลดขนาด CSS
แพ็คเกจ JS:
gulp-concat
— เชื่อมไฟล์ JS หลายไฟล์เป็นไฟล์เดียวgulp-uglify
— ลดขนาด JS
เรายังใช้การแทนที่สตริงเพื่อทำลายแคชในการอ้างอิงไฟล์ CSS และ JS ใน index.html เพื่อให้แน่ใจว่าเมื่อคุณทำการเปลี่ยนแปลงไฟล์ เว็บไซต์จะโหลดสำเนาล่าสุดของไฟล์เหล่านั้น
แพ็คเกจแทนที่สตริง:
gulp-replace
— เพิ่มพารามิเตอร์สตริงในการอ้างอิง CSS/JS สำหรับการป้องกันแคช
ตอนนี้เราได้เพิ่มโมดูลแล้ว มาเริ่มกันเลย!
ขั้นตอนที่ 2:ใช้โมดูลเพื่อเรียกใช้งานอึกของคุณ
"งาน" ในอึกนั้นเป็นฟังก์ชันที่ดำเนินการตามวัตถุประสงค์เฉพาะ
เรากำลังสร้างงานยูทิลิตี้สองสามงานเพื่อคอมไพล์ไฟล์ SCSS และ JS ของเรา และดูไฟล์เหล่านั้นสำหรับการเปลี่ยนแปลงใดๆ จากนั้นงานยูทิลิตี้เหล่านั้นจะทำงานในงานอึกเริ่มต้นของเราเมื่อเราพิมพ์ gulp
บนบรรทัดคำสั่ง
การสร้างค่าคงที่สำหรับเส้นทางของไฟล์
ก่อนที่จะเขียนงานของเรา เรามีโค้ดสองสามบรรทัดที่บันทึกเส้นทางของไฟล์เป็นค่าคงที่ นี่เป็นทางเลือก แต่ฉันชอบใช้ตัวแปรพาธ เพื่อที่เราจะได้ไม่ต้องพิมพ์ซ้ำทุกครั้ง:
รหัสนี้สร้าง scssPath
และ jsPath
ค่าคงที่ที่เราจะใช้เพื่อบอก Gulp ว่าพบไฟล์ใด
งาน Sass
นี่คือรหัสสำหรับงาน Sass ของเรา:
function scssTask(){
return src(files.scssPath)
.pipe(sourcemaps.init())
.pipe(sass())
.pipe(postcss([ autoprefixer(), cssnano() ]))
.pipe(sourcemaps.write('.'))
.pipe(dest('dist')
);
}
งาน Sass ของเราเรียกว่า scssTask()
,กำลังทำหลายอย่าง. ใน Gulp คุณสามารถโยงหลายฟังก์ชันได้โดยใช้ฟังก์ชัน Gulp pipe()
หลังจากใช้งานครั้งแรก
ในงานของเรา Gulp กำลังเรียกใช้ src()
. เป็นครั้งแรก เพื่อโหลดไดเร็กทอรีต้นทางของไฟล์ SCSS มันใช้ค่าคงที่ที่เราสร้างไว้ก่อนหน้านี้ files.scssPath
.
จากนั้นหลังจาก src()
เรากำลังนำทุกสิ่งทุกอย่างเข้าสู่กระบวนการสร้าง คุณสามารถคิดได้เหมือนกับการเพิ่มส่วนต่างๆ ของไพพ์ลงในไพพ์ที่มีอยู่
ฟังก์ชันที่ทำงานอยู่คือ:
sourcemaps.init()
— ต้องเพิ่ม sourcemap ก่อนหลังจากsrc()
sass()
รวบรวมไฟล์ SCSS ทั้งหมดเป็นไฟล์ CSS เดียวpostcss()
รันปลั๊กอินอื่นอีกสองตัว:autoprefixer()
เพื่อเพิ่มคำนำหน้าผู้ขายให้กับ CSScssnano()
เพื่อลดขนาดไฟล์ CSS
sourcemaps.write()
สร้างไฟล์ sourcemaps ในไดเร็กทอรีเดียวกันdest()
บอกให้อึกใส่ไฟล์ CSS สุดท้ายและไฟล์ซอร์สแมป CSS ลงใน/dist
โฟลเดอร์
งาน JS
นี่คือรหัสสำหรับงานของเราในการรวบรวมไฟล์ JS:
function jsTask(){
return src([files.jsPath])
.pipe(concat('all.js'))
.pipe(uglify())
.pipe(dest('dist')
);
}
งาน JavaScript ของเราที่เรียกว่า jsTask()
, ยังใช้งานหลายฟังก์ชัน:
src()
เพื่อโหลดไฟล์ JS จากfiles.jsPath
.concat()
เพื่อเชื่อมไฟล์ JS ทั้งหมดเป็นไฟล์ JS เดียวuglify()
เพื่อทำให้อัปลักษณ์/ย่อขนาดไฟล์ JSdest()
เพื่อย้ายไฟล์ JS สุดท้ายไปไว้ใน/dist
โฟลเดอร์
งานทำลายแคช
นี่คือรหัสสำหรับงานป้องกันแคช:
var cbString = new Date().getTime();
function cacheBustTask(){
return src(['index.html'])
.pipe(replace(/cb=\d+/, 'cb=' + cbString))
.pipe(dest('.'));
}
ในไฟล์ index.html ฉันใช้ข้อมูลอ้างอิงต่อไปนี้สำหรับไฟล์ CSS และ JS:
<link rel="stylesheet" href="dist/style.css?cb=123">
<script src="dist/all.js?cb=123"></script>
สาเหตุที่ระบบป้องกันแคชมีประโยชน์เนื่องจากเบราว์เซอร์และเซิร์ฟเวอร์โฮสต์เว็บมักจะแคชหรือบันทึกสำเนาของไฟล์เนื้อหา เช่น ไฟล์ CSS และ JS ดังนั้นเมื่อคุณโหลดหน้าเดิมอีกครั้ง เบราว์เซอร์ก็จะโหลดสำเนาที่แคชไว้ภายในเครื่องได้เร็วกว่า แทนที่จะต้องดาวน์โหลดซ้ำจากเซิร์ฟเวอร์
ปัญหาคือบางครั้งคุณไม่ต้องการโหลดเวอร์ชันเก่าที่บันทึกไว้ เมื่อคุณได้ทำการเปลี่ยนแปลงในไฟล์ CSS หรือ JS ของคุณและปรับใช้กับเซิร์ฟเวอร์อีกครั้ง คุณต้องการบังคับให้ผู้อื่นดาวน์โหลดไฟล์เหล่านั้นอีกครั้ง
วิธีหนึ่งในการบังคับให้ดาวน์โหลดใหม่คือการเพิ่มสตริงการสืบค้นเล็กน้อย
?cb=123
ต่อท้ายไฟล์อ้างอิงเหล่านั้น หากเบราว์เซอร์โหลดหน้าซ้ำและสตริงการสืบค้นแตกต่างจากครั้งที่แล้ว ไฟล์จะรีเฟรช
ฉันกำลังใช้อึ replace()
ฟังก์ชั่นเพื่อค้นหาสตริงที่มี “cb=” และตัวเลขใดๆ และแทนที่ตัวเลขนั้นด้วยตัวเลขใหม่ที่ประกอบด้วยเวลาปัจจุบันที่แปลงเป็นมิลลิวินาทีตั้งแต่ปี 1970
ด้วยวิธีนี้ทุกครั้งที่อึกทำงาน สตริงการสืบค้นจะแตกต่างออกไป และคุณจะต้องแน่ใจว่าไฟล์ CSS และ JS ใหม่ได้รับการโหลดในเบราว์เซอร์ของผู้ใช้
อึกติดตามงาน
อึก watch()
ฟังก์ชั่นเป็นคุณสมบัติที่มีประโยชน์อย่างยิ่ง เมื่อคุณเรียกใช้ มันจะทำงานอย่างต่อเนื่อง ดูไฟล์ของคุณเพื่อตรวจจับการเปลี่ยนแปลงใดๆ เมื่อตรวจพบการเปลี่ยนแปลง ระบบจะเรียกใช้งานตามจำนวนที่คุณแจ้ง
วิธีนี้ยอดเยี่ยมเพราะคุณไม่จำเป็นต้องเรียกใช้ gulp
. ด้วยตนเอง หลังจากเปลี่ยนโค้ดทุกครั้ง
นี่คือโค้ดตัวอย่างงานดูอึกของเรา:
function watchTask(){
watch(
[files.scssPath, files.jsPath],
parallel(scssTask, jsTask)
);
}
watch()
ฟังก์ชันใช้พารามิเตอร์สามตัว แต่เราแค่ใช้สองตัว:
- globs หมายถึงสตริงพาธของไฟล์
- ตัวเลือก (ไม่ได้ใช้) และ
- งาน หมายถึงงานใดที่เราต้องการเรียกใช้
งานที่เราทำคือดูไฟล์ใน scssPath
และ jsPath
ไดเรกทอรี จากนั้นหากมีการเปลี่ยนแปลงใดๆ ให้เรียกใช้ scssTask
และ jsTask
งานพร้อมกัน
ตอนนี้เราได้ตั้งค่างานยูทิลิตี้แล้ว เราต้องตั้งค่างาน Gulp หลักของเรา
เริ่มต้นงานอึก
นี่คืองาน Gulp หลัก ซึ่งจะทำงานโดยอัตโนมัติหากคุณพิมพ์ gulp
บนบรรทัดคำสั่ง
exports.default = series(
parallel(scssTask, jsTask),
watchTask);
อึกจะค้นหา default
. โดยอัตโนมัติ งานใน gulpfile.js
. ของคุณ เมื่อคุณใช้ gulp
สั่งการ. ดังนั้นคุณต้องส่งออกงานเริ่มต้นเพื่อให้มันทำงานได้
งานเริ่มต้นของเราจะทำดังต่อไปนี้:
- เรียกใช้
scssTask
และjsTask
พร้อมกันโดยใช้parallel()
- จากนั้นเรียกใช้
watchTask
คุณจะสังเกตเห็นว่าเรากำลังใส่งานทั้งหมดเหล่านั้นไว้ใน series()
ฟังก์ชัน
นี่เป็นหนึ่งในการเปลี่ยนแปลงครั้งสำคัญในอึก 4 สำหรับวิธีจัดการงาน คุณต้องห่องานทั้งหมด (แม้แต่งานเดียว) ทั้งใน series()
หรือ parallel()
.
การเปลี่ยนแปลงในอึก 4
หากคุณเคยใช้ tasks()
เพื่อเรียกใช้ทุกอย่าง คุณอาจสังเกตเห็นว่าตอนนี้มีความแตกต่าง
แทนที่จะใช้ gulp.task()
เพื่อให้มีฟังก์ชันงานทั้งหมดของคุณ เรากำลังสร้างฟังก์ชันจริง เช่น scssTask()
และ watchTask()
.
ทั้งนี้เป็นไปตามหลักเกณฑ์อย่างเป็นทางการของ Gulp ในการสร้างงาน
ทีม Gulp แนะนำให้ใช้ exports
แทนที่จะเป็น tasks()
:
ดังนั้นในขณะที่ยังให้คุณใช้ task()
ฟังก์ชัน การสร้างฟังก์ชัน JS สำหรับแต่ละงานแล้วส่งออกเป็นปัจจุบันมากกว่า หากทำได้ ฉันขอแนะนำให้อัปเดตไวยากรณ์ของคุณเพื่อให้เป็นไปตามนี้ เนื่องจากเป็นไปได้ที่อึกจะเลิกใช้ task()
ในบางจุด
มีปัญหาในการย้ายข้อมูลจากอึ 3 หรือไม่
หากคุณเคยใช้ Gulp 3 และต้องการเพียงทำให้สิ่งที่แดงๆ ใช้งานได้กับ Gulp 4 แสดงว่าคุณโชคดี!
การเปลี่ยนแปลงที่สำคัญคือวิธีการรันงานของคุณ
อึก 4 แนะนำสองฟังก์ชันใหม่เพื่อเรียกใช้งาน:series()
และ parallel()
. ช่วยให้คุณมีตัวเลือกในการทำงานหลายงานพร้อมกัน หรือทำงานทีละงาน
ก่อนหน้านี้ ในอึก 3 คุณสามารถแสดงรายการฟังก์ชันเดียวหรือหลายฟังก์ชันในอาร์เรย์ได้ อย่างไรก็ตาม ในอึก 4 ทำได้โดยไม่ใส่ series()
หรือ parallel()
จะโยนข้อผิดพลาดในขณะนี้
สิ่งที่ชอบ:
AssertionError [ERR_ASSERTION]: Task function must be specified
วิธีแก้ไขอย่างรวดเร็วมีดังนี้
งานในรูปแบบ (เก่า) อึก 3
ในอึก 3 คุณอาจเรียกใช้งานด้วยวิธีนี้:
gulp.task('default', ['sass', 'js', 'watch']);
gulp.watch('app/scss/*.scss', ['sass']);
งานในรูปแบบ Gulp 4
ใส่งานเหล่านั้นลงในฟังก์ชัน series() ดังนี้:
gulp.task('default', gulp.series('sass', 'js', 'watch'));
gulp.watch('app/scss/*.scss', gulp.series('sass'));
และนั่นจะแก้ไขข้อผิดพลาดของฟังก์ชันงานด้วยการเปลี่ยนแปลงที่น้อยที่สุด! 🙂
ดาวน์โหลดไฟล์โครงการ
รหัสทั้งหมดที่ฉันแสดงที่นี่มาจากที่เก็บ GitHub ที่ฉันมีสำหรับต้นแบบส่วนหน้า หมายถึงชุดเริ่มต้นอย่างรวดเร็วสำหรับโครงการเว็บไซต์ส่วนหน้าแบบง่ายๆ
คุณสามารถตรวจสอบ ปรับแต่ง และใช้สำหรับโครงการของคุณเองได้!
ตรวจสอบที่เก็บ GitHub ที่นี่