สร้าง Customize Template และ Script ของ create-react-app ของตัวเอง
เมื่อความขี้เกียจเข้าครอบงำ อะไรๆก็เป็นไปได้ … เคยใช่ไหม ที่ใช้ create-react-app มาทุกครั้ง ต้องมานั่งไล่ลบไฟล์ที่ไม่ได้ใช้ทุกครั้ง แถมยังต้องเพิ่ม Folder ชื่อ Pages เอย Components เอย กว่าจะได้ Code Structure ของโปรเจคที่ต้องการก็ปาไปเกือบชั่วโมงแล้ว เสียเวลา Task อื่นจริง ๆ จะดีกว่าไหม ที่สร้าง Template ของตัวเองสะเลย รันครั้งเดียว ได้ Code Structure ได้ตามที่ต้องการเป๊ะๆ เลย ง่ายๆ เวลาขึ้นโปรเจคใหม่ ก็จะได้ไม่ต้องมานั่งลบ นั่งสร้างอีกแล้ว และสิ่งที่อยากจะแถมไปด้วยก็คือ การสร้าง Script ระหว่างการ Run ไปด้วย (อย่าเพิ่งสงกะสัย ติดตามต่อไปงับ)
เพื่อเป็นการไม่เสียนาฬิกา (`=..=) ผ่ามๆ เพื่อเป็นการไม่เสียเวลา ! เชิญรับชมได้เลยครับ
Content ในวันนี้:
1. สร้าง Template สักหน่อย
- Step 1: Forking Repo 🛠
- Step 2: Use CPE Method (Copy, Paste & Edit) 🧩
- Step 3: NPM Publish 🚀
2. สร้าง Script อีกสักนิด
- Step 1: Imagination 🎨
- Step 2: Make it done! 🏆
- Step 3: NPM Publish 🚀
3. ลองสร้างสัก Project
ดูง่ายไปไหม ถถถถถถถถ ลองดูกันครับ
ปล. ขออนุญาตข้ามความรู้พื้นฐานต่างๆ ที่คิดว่าควรข้ามไปนะครับ แต่ไม่ต้องห่วงผมทิ้ง Keyword ไว้ให้ Search ต่อได้งับ
1. สร้าง Template สักหน่อย
Step 1: Forking Repo 🛠
ขั้นตอนนี้ไม่ยากแค่ Fork โปรเจค create-react-app ของ Facebook ต้นฉบับเลยครับ จาก link นี้ [create-react-app](https://github.com/facebook/create-react-app)
ผลลัพธ์ที่ถูก ควรจะได้แบบนี้
ทำเสร็จก็ Clone ลงเครื่องเลย ทำในเครื่องสะดวกกว่า และเมื่อ Clone ลงมาเสร็จแล้วก็ เลือก Editor มาเปิด Project ตามใจชอบเลยครับ … VSCode ฉันเลือกนาย~
สำหรับ Folder ที่มีอยู่ใน create-react-app ที่เราเพิ่ง clone มานั้น ค่อนข้างเยอะมากกกกกก ดังนั้น อยากให้ผู้อ่าน Focus ไปที่ 2 Folder นี้เท่านั้นครับ
{project_path}/packages/cra-template
อันนี้ใช้สำหรับแก้ Code Structure{project_path}/packages/react-scripts/scripts
อันนี้ใช้สำหรับแก้ Script ระหว่างการติดตั้ง (เดี๋ยวอธิบายตอน “2. สร้าง Script อีกสักนิด” นะ)
Keyword for more knowledge: create-react-app, VSCode, Git, Git Repository, Git Clone, and Git Fork
Step 2: Use CPE Method (Copy, Paste & Edit) 🧩
ผมขอเสนอเทคนิค(ไม่)ลับ ที่หลายๆคนก็อาจจะทำแต่ไม่รู้จะตั้งชื่อมันว่าอะไร “CPE Method” เป็นวิธีที่ใช้ในการพัฒนาโปรแกรมต่างๆ ส่วนใหญ่ของผมเลยครับ 555555 เพราะมันคือ Copy: คัดลอกสิ่งที่คิดว่าจะใช้ได้, Paste: วางมันลงพื้นที่ของเรา & Edit: แก้ไขจนมันใช้ได้กับงานเรา … That’s it.
วิธีนี้จะเหมาะกับเคสนี้มาก เพราะมันแก้หลายที่ 5555 ก๊อบไปวางก่อนก็ได้ เดี๋ยวอธิบายอีกทีงับ
- เริ่มโดย “Copy” (หรือเรียก Duplicate ก็ไม่ผิดนะ) โฟลเดอร์ชื่อ
{project_path}/packages/cra-template/
ให้เป็นอีกโฟลเดอร์ และตั้งชื่อเป็นของเราก่อน เช่น{project_path}/packages/cra-template-watsize/
ประมาณนี้งับ - ต่อมา “Paste” ก่อนจะวางกันจริงๆ ให้ไปดูที่
{project_path}/packages/cra-template-{whatever}/template
(Hint: โฟลเดอร์ที่เราก้อบมาแล้วเปลี่ยนชื่อนั่นแหละ) ส่วนนี้จะเป็น Code Structure ของ App เลย ใส่ไฟล์ ใส่โฟลเดอร์อะไรไป ก็จะไปโผล่ผลลัพธ์ตามนั้นเลย ขั้นตอนนี้ก็ให้ไป Copy สิ่งที่ต้องการมา Paste ตรงนี้เลย อยากให้หน้าตา Code Stucture เป็นแบบไหน จัดเลยงับ อย่างผมได้เลือกตามความต้องการที่ใช้ประจำ เช่น เพิ่มโฟลเดอร์ components, pages, redux หรือแม้แต่ .env ก็ได้นะ
…
Hint: ถ้าใครสงสัยว่าทำไมเป็นgitignore
แทนที่จะเป็น.gitignore
อันนี้ถูกแล้วครับ เดี๋ยวมันจะเปลี่ยนให้เองตอนที่ติดตั้งผ่าน create-react-app
…
ตัวอย่างที่ผมได้ใส่เข้าไปเป็นแบบนี้
- ขั้นตอนสุดท้าย “Edit” ก็ไปแก้ไฟล์
{project_path}/packages/cra-template-{whatever}/package.json
ให้เข้าไปแก้ส่วน
1. “name” ให้ใช้ Template นี้นะ เพื่อความเข้าใจได้ง่ายcra-template-{whatever}
อย่าลืมแก้ {whatever} นะ
…
2. “version” ให้ใช้ version ที่ไม่ตรงกับที่มีอยู่ ถ้ายังไม่เคย publish มาก่อนก็ใช้ 0.1.0 อะไรก็ว่าไป แต่ถ้ามีการอัพเดท ต้องมาเลื่อน version ด้วยนะครับ
…
3. “url” *ทั้งหมด* ให้เปลี่ยนเป็น Account เรานะ (สังเกตข้างล่างตรง {YOUR_GITHUB_NAME} ให้เป็นชื่อของตัวเอง)
...
"name": "cra-template-{whatever}",
"version": "0.1.0",
...
"repository": {
"type": "git",
"url": "https://github.com/{YOUR_GITHUB_NAME}/create-react-app.git",
"directory": "packages/cra-template"
},
...
"bugs": {
"url": "https://github.com/{YOUR_GITHUB_NAME}/create-react-app/issues"
},
...
Yeah, Good girl…
Keyword for more knowledge: .gitignore
Step 3: NPM Publish 🚀
ขั้นตอนนี้เราจะเอาสิ่งที่เราทำเสร็จนี้ ขึ้นไปบนเว็บ (npmjs.com)[https://www.npmjs.com/] เพื่อที่จะได้ใช้ได้ทุกที่ที่มีอินเตอร์เน็ตไปเลย
อันดับแรกเช็คก่อนว่ามี Account ของ npmjs แล้วหรือยัง ถ้ายังก็กด Pause บทความนี้แล้วไปสมัครเลยงับ 55555
ถ้าหากมี Account ของ npmjs แล้วให้กรุณาตรวจสอบว่าเรารัน Command ถูกที่ กรุณารันที่ # {project_path}/packages/cra-template-{whatever}
รันคำสั่งดังนี้
# กรุณาตรวจสอบว่าเรารัน Command ถูกตำแหน่ง ให้กรุณารันที่
# {project_path}/packages/cra-template-{whatever}/
# ถ้าถูกแล้วก็รัน และทำตามขั้นตอนที่มันตอบกลับมาnpm login
npm publish
ส่วนแรก ผลลัพธ์ของ npm login
ส่วนผลลัพธ์หลังจากรัน npm publish
จะเป็นแบบนี้ครับ กรณีที่ Success
หากใครรันแล้วเจอ Error 403
ประมาณนี้ก็แสดงว่าชื่อที่เราคิดมันไปทับกับของคนอื่นเขา ให้เปลี่ยนชื่อใหม่เลย ตัวอย่างประมาณนี้
Keyword for more knowledge: npmjs
2. สร้าง Script อีกสักนิด
Step 1: Imagination 🎨
อันดับแรกก็แค่ “จินตนาการ” เอาครับ ว่าอยากได้อะไรใน Script ตอนติดตั้งบ้าง ถ้านึกอะไรไม่ออก ลองเริ่มต้นแก้จาก Banner ก่อนไหมครับ ง่ายดี
จากรูปด้านบน ส่วน Before นั้น หลังจากติดตั้ง เราจะมีเพียงแค่คำแนะนำว่า cd เข้าไปสิ แล้วก็รันดู บลาๆ ทีนี้ผมอยากจะปรับแต่งมันสักหน่อย ให้มันมีสีสัน มี Font-logo อะไรที่ดูน่าสนใจสักหน่อย ผมเลือกแต่งง่ายๆ ให้เห็นภาพ โดยการใส่ ASCII Art Text เข้าไปหลังจากติดตั้ง แล้วก็เพิ่มคำอีกเล็กๆน้อยๆ สำหรับแบบที่ร่างไว้ ประมาณนี้
Keyword for more knowledge: ASCII Art Text
Step 2: Make it done! 🏆
ขั้นตอนนี้ วิธีทำก็คือ CPE Method เหมือนเดิมงับ เข้าไปแก้ไฟล์ที่ {project_path}/packages/react-scripts/scripts/init.js
บรรทัดประมาณนี้
...
console.log();
console.log(‘We suggest that you begin by typing:’);
console.log();
console.log(chalk.cyan(' cd'), cdpath);
console.log(` ${chalk.cyan(`${displayedCommand} start`)}`);// *** OUR_FOCUS_ZONE ***
// *** OUR_FOCUS_ZONE ***if (readmeExists) {
console.log();
...
ปล.ตรงบริเวณ OUR_FOCUS_ZONE นี่ ในโค้ดจริงๆ ไม่มีนะ แค่จะอธิบายเฉยๆว่า เราจะใส่โค้ดเราไปตรงนั้นเพื่อลองดู ฮ่าๆ
ผมจะใส่ Text นิดๆหน่อยๆเข้าไป และผมเลือกที่จะใช้ Chalk ด้วยเพื่อความมีสีสัน ดังนี้
...
console.log();
console.log(‘We suggest that you begin by typing:’);
console.log();
console.log(chalk.cyan(' cd'), cdpath);
console.log(` ${chalk.cyan(`${displayedCommand} start`)}`);// *** OUR_FOCUS_ZONE ***
console.log();
console.log("Thank you for choosing me :D");
console.log();
console.log(chalk.yellow(`
____ __ ____ ___ .___________. _______. __ ________ _______
\\ \\ / \\ / / / \\ | | / || | | / | ____|
\\ \\/ \\/ / / ^ \\ '---| |----' | (----'| | '---/ / | |__
\\ / / /_\\ \\ | | \\ \\ | | / / | __|
\\ /\\ / / _____ \\ | | .----) | | | / /----.| |____
\\__/ \\__/ /__/ \\__\\ |__| |_______/ |__| /________||_______|
`))
console.log();
console.log(chalk.red('*** VERY IMPORTANT: ***'));
console.log('Create a .env file at the root of your project for handler environments e.g. `.env`, `.env.development`, `.env.test`');
// *** OUR_FOCUS_ZONE ***if (readmeExists) {
console.log();
...
อย่าเพิ่งตกอกตกใจ และสบถในใจว่า มึงใส่ xxx ไรลงไปว้ะเนี่ย เดี๋ยว Copy ไปวาง ก็จะสวยเอง อิอิ อ่อ…เกือบลืม เนื่องจาก Font ที่เรา Copy มาจากเว็บ Generate บางครั้งมันก็มาในรูปแบบของ ` (Grave Accent) หรือ \ (Back-slash) ดังนั้นอย่าลืมที่จะทำ String Replace escape character ด้วยนะครับ
Keyword for more knowledge: Escape Character
Step 3: NPM Publish 🚀
หลังจากร่างสมบูรณ์ได้ปรากฏออกมาแล้ว ก็อย่าลืมแก้ package.json นะครับ เข้าไปแก้ไฟล์ที่ {project_path}/packages/react-scripts/package.json
ตรงส่วนนี้ครับ
- “name” ให้ใช้ Template นี้นะ เพื่อความเข้าใจได้ง่าย
{whatever}-react-scripts
- “version” ให้ใช้ version ที่ไม่ตรงกับที่มีอยู่ ถ้ายังไม่เคย publish มาก่อนก็ใช้ 0.1.0 อะไรก็ว่าไป แต่ถ้ามีการอัพเดท ต้องมาเลื่อน version ด้วยนะครับ
- “url” *ทั้งหมด* ให้เปลี่ยนเป็น Account เรานะ (สังเกตข้างล่างตรง {YOUR_GITHUB_NAME} ให้เป็นชื่อของตัวเอง)
...
"name": "{whatever}-react-scripts",
"version": "0.1.0",
"description": "Configuration and scripts for Create React App.",
"repository": {
"type": "git",
"url": "https://github.com/{YOUR_GITHUB_NAME}/create-react-app.git",
"directory": "packages/react-scripts"
},
...
"bugs": {
"url": "https://github.com/{YOUR_GITHUB_NAME}/create-react-app/issues"
},
...
ผลลัพธ์ควรจะประมาณนี้
หลังจากร่างสมบูรณ์ได้ออกมาแล้วก็เอา publish ขึ้น NPM เลย
npm login
npm publish
Very Good… 👍👍
3. ลองสร้างสัก Project
หากผ่านด่าน 1. และ 2. มาได้แล้วก็มาเริ่มสร้างทดสอบดูสักอันหน่อยสิ จะหน้าตาเป็นอย่างไร ปล. ถึงแม้จะติดการ Test-first แค่ไหนก็ อดใจไม่ได้อยู่ดีที่บางครั้งก็ลืมไป ทำ Test ทีหลัง ฮ่าๆ
รันคำสั่งเลย
npx create-react-app {APP_NAME_THAT_YOU_WANT} --template {YOUR_TEMPLATE_NAME} --scripts-version {YOUR_SCRIPT_NAME}
อย่าลืม แทนที APP_NAME_THAT_YOU_WANT
คือชื่อแอพที่ต้องการ, YOUR_TEMPLATE_NAME
คือชื่อ Template และ YOUR_SCRIPT_NAME
คือชื่อ Script นะ
Example: npx create-react-app test-app-with-template --template cra-template-watsize-base --scripts-version watsize-base-react-scripts
แถ่แด๊
ส่วน Code Structure ที่เราได้ทำไว้ส่วนแรก เมื่อเทียบกับ Default ของ create-react-app ก็จะได้ประมาณนี้งับ
จบแล้วครับ =..=’ เหนื่อยเลย 5555555 ก็ถือว่าคงจะไม่ยากจนเกินไปนะครับ ถ้าหากทำตามสเต็ปแล้วยังไม่ได้ยังไง ทิ้งคอมเม้นท์ไว้เลยครับ แล้วก็ถ้าหากผมพิมพ์ผิด พิมพ์พลาด หรือให้ข้อมูลความรู้ไม่ถูกต้องประการใด ต้องขออภัยด้วยนะครับ และจะยินดีเป็นอย่างยิ่งเลยครับ หากท่านจะให้คำแนะนำหรือเพิ่มเติมเสริมแต่งอะไร ขอบคุณมากครับที่ทนอ่านกันจนจบ 555555
สำหรับใครอยากเห็น Code ฉบับเต็ม ไปตำกันที่นี่
แล้วพบกันใหม่นะครับ
พื้นที่สำหรับ ref.
- Create your own react template: https://dev.to/jimmymcbride/create-your-own-react-template-49p7
- Customizing create-react-app: How to Make Your Own Template: https://auth0.com/blog/how-to-configure-create-react-app/