โมดูล SASS
บทความนี้อธิบายเกี่ยวกับโมดูล SASS
เราอธิบายวิธีการแบ่งส่วน SASS โดยใช้ @use และ @forward และวิธีการนำตัวแปร, มิกซ์อิน, ฟังก์ชัน, การตั้งค่าธีม และ Public API กลับมาใช้ใหม่
YouTube Video
โมดูล SASS
ระบบโมดูลของ SASS ช่วยกำหนดขอบเขตของสไตล์อย่างชัดเจน และช่วยให้การออกแบบง่ายต่อการนำกลับมาใช้ใหม่และบำรุงรักษา
แนวคิดพื้นฐานของโมดูล
โมดูล SASS แก้ปัญหาเรื่องการปนเปื้อนของ namespace ทั่วโลกและการพึ่งพาที่ไม่ชัดเจนที่เกิดขึ้นกับ @import แบบเดิม แต่ละไฟล์จะถูกโหลดขึ้นมาในฐานะโมดูลที่มี namespace ของตัวเอง และจะสามารถเข้าถึงได้เฉพาะสิ่งที่ประกาศ export ไว้อย่างชัดเจนเท่านั้นจากไฟล์อื่น
ตัวอย่างโครงสร้างไฟล์
ก่อนอื่น ต่อไปนี้คือตัวอย่างโครงสร้างโปรเจกต์ที่ใช้งานจริง ด้านล่างนี้คือตัวอย่างของดีไซน์ซิสเต็มขนาดเล็ก
1styles/
2├─ _variables.scss
3├─ _mixins.scss
4├─ _functions.scss
5├─ components/
6│ ├─ _button.scss
7│ └─ _card.scss
8├─ utilities/
9│ └─ _helpers.scss
10└─ main.scss- โครงสร้างนี้ช่วยให้การแบ่งโมดูล การทดสอบ และการเปลี่ยนบางส่วนทำได้ง่าย
- ไฟล์ partial จะมีเครื่องหมายขีดล่าง (_) นำหน้าชื่อไฟล์
พื้นฐานของ @use
@use ใช้สำหรับโหลดโมดูลพร้อมกำหนด namespace ให้ สิ่งนี้ช่วยป้องกันชื่อซ้ำและทำให้รู้ได้ชัดเจนว่าแต่ละรายการมาจากโมดูลใด
1// _variables.scss
2$primary-color: #0a74da;
3$padding-base: 12px;- ไฟล์นี้เป็นไฟล์เรียบง่ายที่ใช้กำหนดตัวแปรเท่านั้น ตัวแปรที่เผยแพร่จากโมดูลสามารถอ้างอิงได้โดยตรงผ่าน
@use
1// main.scss
2@use 'variables';
3
4.example {
5 color: variables.$primary-color;
6 padding: variables.$padding-base;
7}- ที่นี่ โมดูล
variablesถูกอ้างอิงด้วย namespacevariables.วิธีนี้ทำให้ทราบต้นทางของแต่ละรายการอย่างชัดเจน
การย่อหรือสร้างชื่อเรียกอื่นให้กับ namespace
การใช้ as จะช่วยให้สามารถย่อ namespace ได้
1@use 'variables' as vars;
2
3.btn {
4 color: vars.$primary-color;
5}- นี่คือตัวอย่างการ import โมดูล
variablesด้วยชื่อสั้นๆ ว่าvarsเลือกชื่อตามความสำคัญระหว่างการอ่านง่ายหรือพิมพ์สะดวก
การกำหนด Mixin
สามารถกำหนดมิกซ์อินและฟังก์ชันในแต่ละโมดูลและนำไปใช้งานได้ การเขียนคอมเมนต์ให้ตรงกับมาตรฐานโปรเจกต์ช่วยให้เข้าใจง่ายขึ้น
1// _mixins.scss
2// Create a simple responsive container mixin
3@mixin container($max-width: 1200px) {
4 width: 100%;
5 margin-left: auto;
6 margin-right: auto;
7 max-width: $max-width;
8}- ไฟล์นี้ใช้สำหรับกำหนดมิกซ์อินของคอนเทนเนอร์ โดยรองรับการรับอาร์กิวเมนต์และสามารถกำหนดค่าเริ่มต้นได้
1// main.scss
2@use 'mixins' as m;
3
4.wrapper {
5 @include m.container(1000px);
6}- ตัวอย่างนี้เป็นการใช้มิกซ์อินร่วมกับ
@include
การกำหนดฟังก์ชัน
ฟังก์ชันใช้สำหรับส่งค่ากลับ และสามารถกำหนดและนำกลับมาใช้ใหม่ภายในโมดูลได้ การนำการคำนวณค่าดีไซน์มาใส่ไว้ในฟังก์ชัน ช่วยให้สไตล์มีเสถียรภาพและดูแลรักษาง่ายขึ้น
1// _functions.scss
2@use 'sass:math';
3
4// Create a simple px-to-rem converter function
5@function to-rem($px, $base: 16) {
6 @return math.div($px, $base) * 1rem;
7}- ไฟล์นี้กำหนดฟังก์ชันที่แปลงค่าพิกเซลเป็น rem ระบุค่าพื้นฐานเริ่มต้นไว้ด้วย
1// main.scss
2@use 'functions' as f;
3
4.title {
5 font-size: f.to-rem(24);
6}- ตัวอย่างการเรียกใช้ฟังก์ชันผ่าน
@useและนำผลลัพธ์มาใช้กับสไตล์
การส่งออกโมดูลและ @forward (การออกแบบ API)
เมื่อคุณต้องการเปิดเผยไฟล์ภายในหลายไฟล์สู่ภายนอก คุณสามารถใช้ @forward เพื่อสร้าง 'public API'
1// _index.scss (module entry)
2@forward 'variables';
3@forward 'mixins';
4@forward 'functions';- ไฟล์ภายในหลายไฟล์สามารถรวมกันเป็นจุดเริ่มต้นเดียวและทำหน้าที่เป็น public API สิ่งนี้ช่วยให้ผู้ใช้เข้าถึงฟีเจอร์ทั้งหมดได้โดย import เพียงจุดเดียว
1// main.scss
2@use 'index' as ds; // ds = design system
3
4.button {
5 color: ds.$primary-color;
6 @include ds.container();
7}- เนื้อหาของ
variablesและmixinsสามารถเข้าถึงรวมกันได้ผ่านindex@forwardทำให้indexกลายเป็น public layer
การควบคุม API ด้วยตัวเลือก show / hide ของ @forward
หากต้องการเปิดเผยเฉพาะตัวแปรบางตัว สามารถใช้ตัวเลือก show หรือ hide
1// _variables.scss
2$internal-thing: 10px !default; // for internal use
3$primary-color: #0a74da !default;
4$secondary-color: #f5f5f5 !default;- การเพิ่ม
!defaultจะทำให้ค่าเหล่านั้นสามารถถูกเขียนทับได้
1// _index.scss
2@forward 'variables' show $primary-color, $secondary-color;
3@forward 'mixins';- การใช้
showร่วมกับ@forwardจะช่วยให้เปิดเผยเฉพาะ API ที่จำเป็น ตัวแปรและฟังก์ชันที่ใช้ภายในจะไม่ถูกมองเห็นจากภายนอก
การทำให้โมดูลสามารถตั้งค่าได้ (ด้วย with)
หากใช้ !default ในโมดูล ค่าจะถูกเขียนทับได้โดยใช้ with ตอน import
1// _theme.scss
2$brand-color: #ff6600 !default;
3$radius: 4px !default;
4
5@mixin button-style() {
6 background-color: $brand-color;
7 border-radius: $radius;
8}- โมดูลที่กำหนดค่าเริ่มต้นด้วย
!defaultสามารถรับการตั้งค่าผ่านwith
1// main.scss
2@use 'theme' with (
3 $brand-color: #2288ff,
4 $radius: 8px
5);
6
7.my-btn {
8 @include theme.button-style();
9}withใน@useช่วยให้เขียนทับค่าตัวแปรเริ่มต้นของโมดูลในขณะ import สิ่งนี้มีประโยชน์สำหรับการสลับธีม- โปรดทราบว่า
withมีผลเฉพาะตอน import เท่านั้นและจะไม่สามารถเปลี่ยนค่าได้ในภายหลัง
ตัวอย่างการใช้งานจริง: ปุ่มคอมโพเนนต์ (ตัวอย่างสมบูรณ์)
ลองออกแบบสไตล์ของปุ่มโดยใช้โมดูลกัน ก่อนอื่น แยกตัวแปรและมิกซ์อินออกเป็นโมดูลแยกต่างหาก
1// _variables.scss
2$btn-padding-y: 8px !default;
3$btn-padding-x: 16px !default;
4$btn-font-size: 14px !default;
5$btn-primary-bg: #0a74da !default;
6$btn-primary-color: #fff !default;- ตัวแปรเริ่มต้นสำหรับปุ่มกำหนดไว้ที่นี่ การกำหนด
!defaultทำให้ผู้ใช้งานสามารถเขียนทับค่าเหล่านี้ได้
1// _mixins.scss
2@use "variables" as v;
3
4@mixin btn-base() {
5 display: inline-flex;
6 align-items: center;
7 justify-content: center;
8 padding: v.$btn-padding-y v.$btn-padding-x;
9 font-size: v.$btn-font-size;
10 border: none;
11 cursor: pointer;
12}- มิกซ์อินหลักสำหรับปุ่มถูกกำหนดไว้ที่นี่ สิ่งเหล่านี้ถูกแยกเพื่อความสะดวกในการนำกลับมาใช้ซ้ำ
1// _button.scss
2@use 'variables' as v;
3@use 'mixins' as m;
4
5.button {
6 @include m.btn-base();
7 background: v.$btn-primary-bg;
8 color: v.$btn-primary-color;
9 border-radius: 4px;
10 transition: opacity 0.15s ease;
11 &:hover { opacity: 0.9; }
12}
13
14.button--large {
15 padding: calc(v.$btn-padding-y * 1.5) calc(v.$btn-padding-x * 1.5);
16 font-size: v.$btn-font-size * 1.25;
17}- สไตล์ของปุ่มถูกสร้างขึ้นโดยอ้างอิง namespace ผ่าน
@useเวอร์ชันหนึ่งถูกกำหนดเป็น.button--large
1// main.scss
2@use 'button'; // or @use 'index' that forwards button, variables, mixins- โดย import โมดูล
buttonคุณสามารถใช้งานสไตล์ของปุ่มได้ทันที
การเปลี่ยนธีม (โดยใช้ไฟล์ธีมหลายไฟล์)
การเปลี่ยนธีมสามารถทำได้โดยกำหนดค่า with หรือแยกธีมไว้ในโมดูลต่างหากและเปลี่ยนการใช้งานด้วย @use
1// themes/_light.scss
2$brand-color: #0a74da !default;1// themes/_dark.scss
2$brand-color: #111827 !default;- กำหนดสีของแบรนด์และการตั้งค่าอื่นๆ ในไฟล์ธีมหลายไฟล์ แล้วสลับใช้ขณะ build หรือ import
1// main.scss (light theme)
2@use 'theme' with ($brand-color: #0a74da);
3@use 'button';- เลือกธีมโดยใช้
withหรือ import เช่น@use 'themes/light'ขณะ build
ส่วนที่เป็น private และ public (ขีดล่างนำหน้า _ และ !default)
ใน SASS การเพิ่มขีดล่าง (_) หน้าชื่อไฟล์จะเป็นการกำหนดว่าเป็นไฟล์ partial อย่างไรก็ตาม เมื่อต้องการจัดการการแสดงผล export ของโมดูล ให้ใช้ show และ hide กับ @forward เพื่อควบคุมสิ่งที่จะส่งออก
คุณสามารถใช้ @forward เพื่อจัดระเบียบ public API และซ่อนสิ่งที่เป็น internal implementation จากภายนอก
แนวทางปฏิบัติที่ดีที่สุดสำหรับการใช้งานจริง
ด้านล่างนี้คือแนวคิดพื้นฐานที่มีประโยชน์เมื่อใช้ SASS ในสถานการณ์จริง แนวทางเหล่านี้จะช่วยลดความสับสนระหว่างการพัฒนา และรักษาโครงสร้างโค้ดให้เป็นระเบียบ
- หากตัวแปรใดมีแนวโน้มจะเปลี่ยนแปลงตามธีม ให้เพิ่ม
!defaultสิ่งนี้ทำให้ผู้ใช้สามารถแทนค่าต่าง ๆ ได้ง่ายขึ้น - โมดูลควรถูกแบ่งตามความรับผิดชอบและเน้นเป้าหมายเดียว การแยกตัวแปร มิกซ์อิน และคอมโพเนนต์ออกจากกันจะช่วยให้จัดการได้ง่ายขึ้น
- จัดการเนื้อหาสาธารณะด้วย
@forwardและใช้showหรือhideตามความจำเป็น การกำหนดขอบเขตของสิ่งที่เป็น public จะนำไปสู่การออกแบบที่ปลอดภัยยิ่งขึ้น - ใช้ namespace เพื่อให้ทราบชัดว่าแต่ละฟังก์ชันมาจากโมดูลใด สิ่งนี้ช่วยป้องกันความสับสนกับโค้ดส่วนอื่น
- โปรดจำไว้ว่า
withใช้งานได้แค่ตอนที่@useเท่านั้น เนื่องจากไม่สามารถเปลี่ยนแปลงได้ภายหลัง ให้ตั้งค่าตอน import - ใส่ขีดล่างนำหน้าชื่อไฟล์เพื่อให้เป็น partial จะได้ไม่ถูกคอมไพล์แยกเดี่ยว สิ่งนี้ช่วยให้นำไฟล์มารวมกันเป็นโครงสร้างขนาดใหญ่ได้ง่ายขึ้น
- การรวมตัวอย่างการใช้งานไว้ในโมดูล
indexช่วยในการทดสอบและเอกสารประกอบ สิ่งนี้ทำให้ผู้ใช้เข้าใจการทำงานได้ง่ายขึ้น
การคำนึงถึงประเด็นเหล่านี้จะช่วยให้คุณจัดการโปรเจกต์ขนาดใหญ่และรักษาความเป็นระเบียบของโค้ดในการทำงานเป็นทีม
สรุป
ระบบโมดูล SASS จัดระเบียบโค้ดสไตล์ผ่าน namespace, public APIs และการตั้งค่าที่ง่ายขึ้น การใช้ @use และ @forward อย่างคล่องแคล่วจะช่วยให้การพัฒนาเป็นทีม การเปลี่ยนธีม และการออกแบบไลบรารีทำได้ง่ายขึ้นมาก
คุณสามารถติดตามบทความข้างต้นโดยใช้ Visual Studio Code บนช่อง YouTube ของเรา กรุณาตรวจสอบช่อง YouTube ด้วย