dockview - ตัวจัดการเลย์เอาต์หน้าต่างสำหรับ TypeScript/React/Vue (แท็บ, แบบลอย, ป๊อปเอาต์)
(github.com/mathuo)- dockview เป็น ตัวจัดการเลย์เอาต์แบบไม่มี dependency ที่รองรับแท็บ กลุ่ม กริด และ split-view ใช้งานได้กับ React, Vue, Angular และ JavaScript
- มีฟังก์ชันจัดการเลย์เอาต์ครบถ้วน รวมถึงการ serialize/deserialize เลย์เอาต์, dockable view, การ dock แท็บและกลุ่ม, drag and drop, กลุ่มแบบลอย และหน้าต่างป๊อปเอาต์
- มีการใช้ธีมและการปรับแต่ง, รองรับ Shadow DOM, รองรับทัชและมือถือ, API สำหรับขยายความสามารถ และเว็บไซต์เอกสารพร้อมตัวอย่างแบบสด
- แพ็กเกจแบ่งเป็น
dockview,dockview-react,dockview-vue,dockview-angularโดย React ต้องมี peer dependency เป็นreact16.8 ขึ้นไป, Vue ต้องมีvue3.4 ขึ้นไป และ Angular ต้องมี@angular/core21 ขึ้นไป - โครงสร้างการพัฒนาตั้งอยู่บน NX monorepo และ Yarn v1 workspaces โดย build ตามลำดับ
dockview-core → dockview → framework bindings
ฟีเจอร์เลย์เอาต์ที่ dockview มีให้
- dockview เป็นตัวจัดการเลย์เอาต์ที่รองรับแท็บ กลุ่ม กริด และ split-view
- แพ็กเกจพื้นฐานสำหรับ JavaScript เป็นแบบ zero dependencies และใช้งานฟีเจอร์ทั้งหมดได้ทันที
- ฟีเจอร์ที่รองรับ:
- การ serialize/deserialize เลย์เอาต์
- split-view, grid-view, dockable view
- การ dock แท็บและกลุ่ม
- drag and drop
- หน้าต่างป๊อปเอาต์
- กลุ่มแบบลอย
- รองรับทัชและมือถือ
- รองรับ Shadow DOM
- การใช้ธีมและการปรับแต่ง
- API สำหรับขยายความสามารถ
- เว็บไซต์เอกสารพร้อมตัวอย่างแบบสด
แพ็กเกจและเฟรมเวิร์กที่รองรับ
dockview: แพ็กเกจสำหรับ JavaScript ที่ไม่มี dependency และมีฟีเจอร์ครบถ้วนdockview-react: binding สำหรับ React โดยต้องมีreact16.8 ขึ้นไปเป็น peer dependencydockview-vue: binding สำหรับ Vue 3 โดยต้องมีvue3.4 ขึ้นไปเป็น peer dependencydockview-angular: binding สำหรับ Angular โดยต้องมี@angular/core21 ขึ้นไปเป็น peer dependency
การติดตั้งและตัวอย่างการใช้งานกับ React
- คำสั่งติดตั้งเป็นการเลือกแพ็กเกจตามเฟรมเวิร์ก
npm install dockviewnpm install dockview-reactnpm install dockview-vuenpm install dockview-angular
- ตัวอย่าง React ใช้โดย import
DockviewReactและdockview-react/dist/styles/dockview.css - ใน callback
onReadyเรียกevent.api.addPanelเพื่อเพิ่ม panel ที่มีid,component,params - ตัวอย่าง Vue และ Angular ดูได้ที่ เว็บไซต์เอกสาร
โครงสร้างการพัฒนาและการ build
- โปรเจกต์เป็น NX monorepo และใช้ Yarn v1 workspaces
- คำสั่งสำหรับการพัฒนา:
yarn install: ติดตั้ง dependenciesyarn build: build แพ็กเกจทั้งหมดyarn test: รันการทดสอบyarn lint: รัน ESLintyarn format: รัน Prettier
- NX จัดการลำดับการ build โดยอัตโนมัติ
dockview-core → dockview → dockview-reactdockview-core → dockview → dockview-vuedockview-core → dockview → dockview-angular
คุณภาพ ความปลอดภัย และไลเซนส์
- โปรเจกต์เน้น test coverage สูง, build ที่โปร่งใส และการวิเคราะห์โค้ด
- คำนึงถึง ความปลอดภัย รวมถึง publishing และ build ที่ตรวจสอบแล้วผ่าน GitHub Actions
- การตรวจสอบ build ดูได้จากคำแนะนำที่เกี่ยวกับ provenance ของ npm
- การมีส่วนร่วมสามารถทำได้ผ่าน issue หรือ pull request
- ไลเซนส์คือ MIT
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
ว้าว งานยอดเยี่ยมจริง ๆ เห็นครั้งแรกก็รู้สึกว่า TypeScript เขียนมาได้ถูกทาง และก็ดูเหมือนจะจับกระแสยุคนี้ได้ดีด้วย ต่อไปถ้าจะสร้างแอปพลิเคชัน AI คงต้องมี เครื่องมือพื้นฐาน แบบนี้มากขึ้นอีกมาก
ในเชิงเทคนิค ผมสงสัยมานานแล้วว่าตอนลากพาเนลหรือเปลี่ยนสถานะการแสดงผล มีการ mount/unmount คอมโพเนนต์อย่างไร บางครั้ง
display:noneอาจถูกกว่าการ mount/unmountอีกอย่าง โครงสร้างพาเนลก็แทบจะเป็นแบบ declarative อยู่แล้ว เลยสงสัยว่ามีแผนจะเปิดเผย ปลั๊กอิน Vite ที่ export เลย์เอาต์ TypeScript ที่บันทึกไว้ แล้วให้ฟังก์ชันหรือก็คือ TypeScript import ถูกแมปกับเนื้อหาพาเนลหรือไม่ กำลังคิดในแนวทาง TypeScript ที่บริสุทธิ์กว่า นอก JSX
https://dockview.dev/docs/core/panels/rendering
มีตัวเลือกให้คงเนื้อหาพาเนลไว้ใน DOM ตลอดเวลา และอย่างที่พูด ก็ทำแนวทางใกล้เคียงกับ
display: noneได้ ในทางกลับกันก็มีตัวเลือกให้ลบเนื้อหาออกจาก DOM ได้เช่นกันจากมุมมอง TypeScript ล้วน ๆ ไลบรารีส่วนใหญ่เขียนด้วย TypeScript ล้วน และมีเพียงไลบรารี wrapper เล็ก ๆ สำหรับ Vue กับ React
ในทางทฤษฎีสามารถเขียน wrapper สำหรับเฟรมเวิร์กอื่นอย่าง Angular ได้ด้วย และเป็นงานที่อยากลองทำภายในปีนี้
รองรับการโหลดและบันทึกสถานะด้วย
https://dockview.dev/docs/core/state/save
ถ้าคำตอบนี้ตอบคำถามได้หรือไม่ ช่วยบอกด้วยก็ดี
น่าประทับใจจริง ๆ โดยเฉพาะมีอยู่หลายจุดที่อยากชมมาก: ไม่มี dependency เลย ถือว่ายอดเยี่ยมมากสำหรับแพ็กเกจ JavaScript เอกสารก็สะอาดและมีตัวอย่าง transparent build ก็ควรกลายเป็นมาตรฐานด้วย
อยากให้แพ็กเกจ JavaScript มากกว่านี้เป็นแบบนี้
จากที่ลองค้นดูคร่าว ๆ ความเข้าใจคือมันดูเหมือนเป็นมาตรฐานอยู่แล้ว ถ้าแพ็กเกจไหนต้องให้ไปหาวิธี build เองแบบ manual หลังติดตั้งเพื่อให้มันทำงาน ผมก็ไม่ใช้ตั้งแต่แรกแล้ว
Dockview ยอดเยี่ยม และขอแสดงความยินดีกับโปรเจกต์สุดเจ๋งของ @mathuo ช่วงหลังผมทดสอบไลบรารีในหมวดนี้ 6–7 ตัวอย่างค่อนข้างละเอียด และ Dockview อยู่ในกลุ่มบนสุดแน่นอน GitHub ก็ active มากและดูแลดีมาก
เหตุผลเดียวที่โปรเจกต์ล่าสุดสุดท้ายเลือก FlexLayout(https://github.com/caplin/FlexLayout) คือ Dockview ยังไม่มีการรองรับขนาดที่กำหนดไว้ล่วงหน้า/ถูกจำกัด แต่หลังจากนั้นก็เพิ่มเข้ามาแล้วในแบบที่ดีมาก อีกอย่างผมชอบวิธีที่ FL จัดการแท็บแนวตั้งและ side panel ด้วยพฤติกรรมที่กำหนดไว้ล่วงหน้า
ผมตั้งตารอมากว่าจะได้ใช้ Dockview ในโปรเจกต์ถัด ๆ ไปสักโปรเจกต์
ผมกำลังทำของแบบนี้เป๊ะ ๆ เป็นโปรเจกต์ยามว่างอยู่พอดี ดีใจมากที่เจอสิ่งนี้ ตอนนี้ทิ้งโค้ดของตัวเองแล้วเดินหน้าสู่ขั้นถัดไปของโปรเจกต์ได้แล้ว
เมื่อเทียบกับ GoldenLayout เป็นอย่างไรบ้าง? ได้แรงบันดาลใจจากที่นั่นหรือเปล่า?
เมื่อก่อนผมชอบโปรเจกต์นั้นมาก แต่เสียดายที่การสนับสนุนหยุดไปโดยสิ้นเชิง แม้จะมีบางคนรับช่วงต่อ และอัปเดตอย่างกระตือรือร้น แต่ก็ยังไม่ค่อยเห็นเส้นทางอัปเกรดที่ใช้งานได้จริง
ตัวนี้ดูดี และอยากลองใช้ดู
ตอนแรกก็ได้รับแรงบันดาลใจจากตัวจัดการเลย์เอาต์อื่น ๆ รวมถึง GoldenLayout จริง ๆ เป้าหมายหลักตรงนี้คือ ไม่มี dependency เลย และเขียนด้วย TypeScript ล้วน พร้อมมีไลบรารี wrapper สำหรับเฟรมเวิร์กอย่าง Vue และ React
ยินดีรับฟีดแบ็กทุกอย่าง และเดโมบนเว็บไซต์แสดงฟีเจอร์ส่วนใหญ่ในปัจจุบันแล้ว ในรายการ Issues ก็มีสิ่งที่วางแผนไว้ข้างหน้าอีกมาก
ในทางทฤษฎีอาจดูแลลอจิก adapter สำหรับ GoldenLayout เองได้ แต่ในทางปฏิบัติมันดูเหมือนตายไปแล้ว มีไลบรารีที่ใหม่กว่าและให้ความรู้สึก drag-and-drop ดีกว่าอย่างไลบรารีนี้อยู่
ผมยังจำได้ว่าเมื่อประมาณ 6 ปีก่อน เคยพยายามใช้ GoldenLayout ในอีกโปรเจกต์หนึ่ง แต่เพราะปัญหาที่รู้สึกได้หลายอย่าง สุดท้ายเลยเขียนเองด้วย TypeScript ล้วน แม้จะใช้กันแพร่หลาย แต่จากประสบการณ์จริงก็ไม่ได้ยอดเยี่ยมขนาดนั้น
โปรเจกต์ดี อยากให้ใส่ คอนเทนต์ทั่วไป อย่างวิดีโอ ดรอปดาวน์ ข้อความจำนวนมาก ข้อความขนาดใหญ่ลงในเดโมด้วย จะได้เห็นว่าจัดการอย่างไร
แล้วก็สงสัยว่ามีเวอร์ชันที่มีแต่พาเนลโดยไม่มีกรอบหน้าต่างหรือไม่
ผมดูแล tiling window manager ที่เขียนด้วย Rust อยู่ และนึกไม่ออกเลยว่าจะมีความอดทนทำงานประเภทนี้ด้วย JS/TS ได้อย่างไร ขอคารวะ mathuo นี่เป็นหนึ่งในสิ่งที่เจ๋งที่สุดที่เห็นใน HN ช่วงหลัง ๆ
ดีมาก อยากให้มีการรองรับ SolidJS ด้วย ช่วงนี้ไม่ได้มีความชอบพิเศษระหว่าง React กับ Solid แต่มีโปรเจกต์อยู่สองสามตัวที่น่าจะใช้สิ่งนี้ได้และเขียนด้วย SolidJS
ถึงเวลาทำ Mosaic ใหม่แล้ว https://github.com/mlajtos/mosaic
ยอดเยี่ยม มีใครรู้จักไลบรารีแบบบริสุทธิ์ ไม่มี dependency คล้าย ๆ กัน สำหรับ คอนโทรลเดสก์ท็อปทั่วไป อย่างเมนู ที่เกินกว่าสิ่งที่ HTML มีให้ไหม?
0: https://daisyui.com