Directory Structure
directory/
├── bin/
│ └── cli.js # CLI executable
├── lib/
│ └── helper.js # Additional library files
├── src/
│ └── index.js # Entry point
├── .eslintrc.json # ESLint configuration
├── .gitignore # Git ignore rules
├── .nvmrc # nvm configuration
├── package.json # Package metadata
└── README.md # Project documentation
package.json
{
"name": "example-package", // ชื่อ Package (lower-hyphen-case)
"version": "1.0.0", // กำหนด Version โดยใช้ SemVer
"description": "A description", // คำอธิบาย
"main": "./src/index.js", // Entry point ของ Package
"type": "module", // ใช้ระบบ ESM Import
"bin": { // Executable ที่ลิงก์กับ CLI
"example-cli": "./bin/cli.js"
},
"scripts": { // npm run *
"start": "node index.js", // `npm start`
"build": "node build.js", // `npm run build`
"test": "jest", // `npm test`
"lint": "eslint .", // `npm run lint`
},
"dependencies": { // Production dependencies
"express": "^4.18.2",
"dotenv": "^16.1.4"
},
"devDependencies": { // Development dependencies
"jest": "^29.6.1",
"eslint": "^8.51.0"
},
"peerDependencies": { // Dependencies ที่ต้องการติดตั้งเอง
"react": ">=17.0.0"
},
"optionalDependencies": { // Dependencies ที่ไม่จำเป็นต้องติดตั้ง
"fsevents": "^2.3.2"
},
"engines": { // กำหนด Node.js และ npm ที่ต้องการ
"node": ">=14.0.0",
"npm": ">=7.0.0"
},
"keywords": [ // คำค้นหาสำหรับ Registry
"example",
"nodejs",
"package"
],
"author": { // ชื่อผู้พัฒนา
"name": "Your Name",
"email": "[email protected]",
"url": "https://your-website.com"
},
"license": "MIT", // ประเภทลิขสิทธิ์
"repository": { // รายละเอียด Repository
"type": "git",
"url": "https://github.com/your-repo/example-package.git"
},
"bugs": { // รายละเอียดการติดตามแก้ไขบัค
"url": "https://github.com/your-repo/example-package/issues"
},
"homepage": "https://example.com", // หน้าแรกของ Package
"files": [ // ไฟล์ที่จะเผยแพร่ไปยัง Registry
"dist/",
"lib/",
"bin/"
],
"private": false // true ก็ต่อเมื่อไม่ต้องการ Publish
}
Shebang
#!/usr/bin/env node
console.log('Hello CLI') // และโค้ดอื่นๆ
Node CLI
Command | เกี่ยวกับ |
---|
node -h | ดูชุดคําสั่งทั้งหมด |
node -v | ตรวจสอบเวอร์ชั่น Node.js |
node | เริ่มต้น Node.js REPL |
node <file.js> | รันไฟล์ JavaScript |
node inspect <file.js> | รันไฟล์ JavaScript แบบ Debug |
node -e "console.log(1 + 2)" | รันคําสั่ง JavaScript |
NPM CLI
Command | เกี่ยวกับ |
---|
npm -h | ดูชุดคําสั่งทั้งหมด |
npm -v | ตรวจสอบเวอร์ชั่น NPM |
npm init | สร้างไฟล์ package.json |
npm init -y | สร้างไฟล์ package.json (แบบข้ามการตั้งค่า) |
npm run <script> | รันคำสั่งใน package.json |
npm start | รันคำสั่ง start ใน package.json |
npm test | รันคำสั่ง test ใน package.json |
npm build | รันคำสั่ง build ใน package.json |
npm i | ติดตั้ง Packages จาก package.json |
npm i <name> | ติดตั้ง Package ที่ต้องการ |
npm i -g <name> | ติดตั้ง Package แบบ Global |
npm i -D <name> | ติดตั้ง Package แบบ Development |
npm ci | ติดตั้ง Package สำหรับ CI/CD |
npm r <name> | ถอนการติดตั้ง Package |
npm r -g <name> | ถอนการติดตั้ง Package แบบ Global |
npm list | ดู Packages ที่ติดตั้ง |
npm list -g | ดู Packages ที่ติดตั้งแบบ Global |
npm audit | ตรวจสอบความปลอดภัยของ Packages |
npm audit fix | แก้ไขความปลอดภัยของ Packages |
npm prune | ลบ Packages ที่ไม่ได้ใช้งาน |
npm outdated | ตรวจสอบ Packages ที่ต้องอัพเดท |
npm update | อัพเดท Packages ที่ต้องอัพเดท |
npm login | เข้าสู่ระบบ npmjs.com |
npm publish | เผยแพร่ Package ของตัวเอง |
npm config get <key> | ดูการตั้งค่า |
npm config set <key> <value> | เปลี่ยนการตั้งค่า |
npm cache clean --force | ล้างแคชของ NPM |
PM2
Command | เกี่ยวกับ |
---|
pm2 -h | ดูชุดคําสั่งทั้งหมด |
pm2 start <file.js> | รันไฟล์ JavaScript ด้วย PM2 |
pm2 start <file.js> --name <name> | รันพร้อมชื่อ |
pm2 start <file.js> -i max | รันพร้อมชื่อและ CPU ทั้งหมด |
pm2 start <file.js> --watch | รันพร้อม Watch Mode |
pm2 start <file.js> --cron "0 0 * * *" | รันพร้อม Cron Job |
pm2 ls | ดู Process ทั้งหมด |
pm2 monit | ดู Monitor ของ Process |
pm2 logs | ดู Log ของ Process |
pm2 stop <name> | หยุด Process |
pm2 stop all | หยุด Process ทั้งหมด |
pm2 restart <name> | รีสตาร์ท Process |
pm2 restart all | รีสตาร์ท Process ทั้งหมด |
pm2 del <name> | ลบ Process |
pm2 del all | ลบ Process ทั้งหมด |
pm2 save | บันทึก Process สำหรับเปิดระบบใหม่ |
pm2 startup | ตั้งค่า PM2 Startup |
pm2 unstartup | ยกเลิก PM2 Startup |
pm2 update | อัพเดท PM2 |
pm2 ecosystem | สร้างไฟล์ ecosystem.config.js |
ES Modules (ESM)
// วิธีนี้จะต้องกำหนด `"type": "module"` ลงใน `package.json`
import fs from 'node:fs'
import axios from 'axios'
import { someDataExported } from './module.js'
export const variable = 'value'
export function func() {}
export default functionOrVariable
CommonJS (CJS)
const fs = require('node:fs')
const axios = require('axios')
const { someDataExported } = require('./module.js')
exports.variable = 'value'
exports.func = function() {}
exports.default = functionOrVariable
Process Object
Code | เกี่ยวกับ |
---|
process.env.* | Environment Variables |
process.argv | Arguments ที่รับจาก CLI |
process.cwd() | Current Working Directory |
process.exit(code) | Exit Process |
process.on(event, callback) | Event Listener |
process.platform | Platform ปัจจุบันที่รัน |
process.uptime() | Uptime ของ Process |
process.memoryUsage() | Memory Usage ของ Process |
process.cpuUsage() | CPU Usage ของ Process |
process.pid | Process ID |
process.stdin | Standard Input |
process.stdout | Standard Output |
process.stderr | Standard Error |
Global Objects
Code | คําอธิบาย |
---|
__dirname | Path ของ Directory ปัจจุบัน (CJS) |
__filename | Path ของ File ปัจจุบัน (CJS) |
import.meta.dirname | Path ของ Directory ปัจจุบัน (ESM) |
import.meta.url | URL ของ File ปัจจุบัน (ESM) |
setTimeout(callback, delay) | Run หลังจาก Delay |
setInterval(callback, delay) | Run ทุก Delay |
clearTimeout(id) | Clear Timeout |
clearInterval(id) | Clear Interval |
Buffer | Binary Data |
Cluster
import express from 'express'
import cluster from 'node:cluster'
import os from 'node:os'
const numCPUs = os.cpus().length
if (cluster.isPrimary) {
console.log(`Primary process started. PID: ${process.pid}`)
for (let i = 0; i < numCPUs; i++) {
cluster.fork()
}
cluster.on('exit', (worker, code, signal) => {
console.log(`Worker ${worker.process.pid} exited`)
})
} else {
// Code ที่ต้องการให้ Worker ทำงาน
}
File System
import fs from 'node:fs' // มี Method มากกว่า เช่น .watch(), .createReadStream()
import fs from 'node:fs/promises' // Promise ทั้งหมด
await fs.readFile('./path/to/file.txt') // อ่านไฟล์
await fs.writeFile('./path/to/file.txt', 'content') // เขียนไฟล์
await fs.appendFile('./path/to/file.txt', 'content') // เพิ่มไฟล์ล่างสุด
await fs.unlink('./path/to/file.txt') // ลบไฟล์
await fs.rm('./path/to/file.txt') // ลบไฟล์
await fs.rm('./path/to', { recursive: true }) // ลบโฟลเดอร์และไฟล์อื่นๆทั้งหมด
await fs.rename('./path/to/file.txt', './path/to/newfile.txt') // เปลี่ยนชื่อไฟล์
await fs.copyFile('./path/to/file.txt', './path/to/newfile.txt') // คัดลอกไฟล์
await fs.readdir('./path/to') // รายชื่อไฟล์ในโฟลเดอร์
await fs.mkdir('./path/to') // สร้างโฟลเดอร์
await fs.rmdir('./path/to') // ลบโฟลเดอร์
await fs.stat('./path/to/file.txt') // ข้อมูลของไฟล์
await fs.access('./path/to/file.txt') // ตรวจสอบสิทธิ์ของไฟล์
await fs.chmod('./path/to/file.txt', 0o755) // เปลี่ยนสิทธิ์ของไฟล์
await fs.chown('./path/to/file.txt', 1000, 1000) // เปลี่ยนเจ้าของของไฟล์
fs.watch('./path/to', (event, filename) => {}) // ตรวจสอบการเปลี่ยนแปลงของไฟล์และโฟลเดอร์
fs.watchFile('./path/to/file.txt', (curr, prev) => {}) // ตรวจสอบการเปลี่ยนแปลงของไฟล์
fs.createReadStream('./path/to/file.txt') // อ่านไฟล์แบบ Stream
fs.createWriteStream('./path/to/file.txt') // เขียนไฟล์แบบ Stream
Path
import path from 'node:path'
path.join(__dirname, './path/to/file.txt') // รวม Path (Relative)
path.resolve(__dirname, './path/to/file.txt') // รวม Path (Absolute)
path.extname('file.txt') // นามสกุลไฟล์
path.basename('file.txt') // ชื่อไฟล์
path.dirname('path/to/file.txt') // ที่อยู่โฟลเดอร์
path.parse('path/to/file.txt') // แยก Path Object
path.format({ // รวม Path Object
root: '/',
dir: '/path/to',
base: 'file.txt',
ext: '.txt',
name: 'file'
})
path.normalize('path/to/file.txt') // ปรับ Path ตามระบบ
path.isAbsolute('/path/to/file.txt') // ตรวจสอบ Absolute Path
path.relative('/path/to', '/path/to/file.txt') // แปลงเป็น Relative Path
HTTP Server
import http from 'node:http'
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' })
res.end('Hello World\n')
})
server.listen(3000, () => {
console.log('Server running at http://localhost:3000/')
})
server.on('error', (err) => {
console.error(err)
})
server.on('close', () => {
console.log('Server closed')
})
Event Emitter
import EventEmitter from 'node:events'
class MyEmitter extends EventEmitter {} // สร้าง Class ที่สืบทอดจาก EventEmitter
const myEmitter = new MyEmitter() // สร้าง Instance ของ EventEmitter
myEmitter.on('event', (data) => { // เพิ่ม Event Listener
console.log('an event occurred!')
})
myEmitter.emit('event', { some: 'data' }) // ส่ง Event ไปยัง Listener
OS
import os from 'node:os'
os.arch() // สถาปัตยกรรมของ CPU
os.platform() // ระบบปฏิบัติการ
os.release() // รุ่นของระบบปฏิบัติการ
os.type() // ชนิดของระบบปฏิบัติการ
os.hostname() // ชื่อ Hostname
os.totalmem() // จำนวน Memory ทั้งหมด
os.freemem() // จำนวน Memory ว่าง
os.cpus() // ข้อมูลของ CPU
os.userInfo() // ข้อมูลของ User
Child Process
import child_process from 'node:child_process'
// รันคำสั่ง และส่งข้อมูลกลับมาเป็น Callback
child_process.exec('ls -lh', (err, stdout, stderr) => {
if (err) {
console.error(err)
return
}
console.log(stdout)
})
// รันคำสั่ง และส่งข้อมูลกลับมาเป็น Stream
child_process.spawn('ls', ['-lh']).stdout.on('data', (data) => {
console.log(data.toString())
})
// รันไฟล์ Shell Script
child_process.execFile('command.sh', (err, stdout, stderr) => {
if (err) {
console.error(err)
return
}
console.log(stdout)
})
Utils
import util from 'node:util'
util.format('Hello %s', 'World') // จัดรูปแบบข้อความ
util.inspect({ a: 1 }) // แสดงข้อมูลของ Object
util.promisify(fs.readFile) // แปลง Callback เป็น Promise
// Promisify สามารถใช้: https://www.npmjs.com/package/pify
Crypto
import crypto from 'node:crypto'
crypto.randomBytes(16).toString('hex') // สร้าง Random String
crypto.createHash('sha256').update('data').digest('hex') // สร้าง Hash
Dotenv
# .env
# https://www.npmjs.com/package/dotenv
NODE_ENV=development
PORT=3000
DB_HOST=localhost
DB_USER=root
DB_PASS=pass123
File System Packages
Package | คำอธิบาย |
---|
fs-extra | เพิ่มคุณสมบัติของ fs ที่หายไป |
mkdirp | สร้างโฟลเดอร์แบบ Recursive (โฟลเดอร์หลายลำดับ) |
ncp | คัดลอกไฟล์และโฟลเดอร์แบบ Recursive |
rimraf | ลบไฟล์แบบ rm -rf ที่ง่ายกว่าเดิม |
glob | ค้นหาและเลือกไฟล์แบบ Glob |
chokidar | Watch File, Directory ที่ดีกว่าเดิม |
Process Execution Packages
Package | คำอธิบาย |
---|
execa | ใช้แทน child_process ที่ดีกว่าเดิม |
zx | ใช้แทน child_process ที่ดีกว่าเดิม |
Single Executable Application Packages
Tool/Package | คำอธิบาย |
---|
pkg | แปลงจาก Node.js เป็น Single Executable Application สำหรับระบบต่างๆ |
Deno Compile | เลือกใช้ Deno แทน Node.js |
Bun Executables | เลือกใช้ Bun แทน Node.js |
Utility Packages
Package | คำอธิบาย |
---|
lodash | Utility Functions (แนะนำ) |
underscore | Utility Functions |
ramda | Utility Functions |
remeda | Utility Functions (สร้างเพื่อ TypeScript ที่ดีขึ้น) |
radashi | Utility Functions (สร้างเพื่อ TypeScript ที่ดีขึ้น) |
Faker Packages
Package | คำอธิบาย |
---|
faker | สร้างข้อมูลปลอม |
chance | สร้างข้อมูลปลอม |
Text Packages
Package | คำอธิบาย |
---|
bytes | แสดงข้อมูล Bytes ที่ดีขึ้น |
pretty-bytes | แสดงข้อมูล Bytes ที่ดีขึ้น |
ms | แปลงจากข้อความวัน เป็นจำนวนสำหรับใช้ฟังก์ชั่นต่างๆ |
pretty-ms | แปลงจากจำนวน เป็นวันเวลาที่อ่านได้ |
slugify | แปลงจากข้อความเป็น URL Slug |
uuid | การสร้าง UUIDs ที่หลากหลาย (มาตรฐาน RFC9562) |
nanoid | การสร้าง Unique ID แบบกำหนดเอง และมีขนาดเล็ก |
yaml | อ่านเอกสาร YAML เป็น JSON |
Validation Packages
Package | คำอธิบาย |
---|
validator | รวมฟังก์ชั่นตรวจสอบรูปแบบข้อมูล |
zod | Schema Validator (ที่ดีที่สุดในตอนนี้) |
joi | Schema Validator |
yub | Schema Validator |
ajv | Schema Validator |
superstruct | Schema Validator |
HTTP Client Packages
Package | คำอธิบาย |
---|
axios | HTTP Client ที่ดีกว่าเดิม (แนะนำ) |
ky | HTTP Client ที่กำลังเป็นที่นิยมสูงขึ้น |
ofetch | HTTP Client อีกตัวที่น่าสนใจ |
node-fetch | HTTP Client สำหรับการใช้ fetch() ที่มีคุณสมบัติเพิ่มบน Node.js |
localtunnel | เปิด localhost บนเครื่องเราให้สามารถเข้าถึงออนไลน์ได้แบบชั่วคราว |
Backend Frameworks
Package | คำอธิบาย |
---|
express | Framework ที่นิยมมากที่สุด |
fastify | Framework อีกตัวที่มีความนิยมระดับหนึ่ง (แนะนำ) |
koa | Framework อีกตัวที่มีความนิยมระดับหนึ่ง |
hono | Framework ใหม่ที่ผมแนะนำให้ใช้หากเป็นงาน Full-stack |
@nestjs/cli | Framework แบบ Opinionated (มีโครงสร้างชัดเจน) |
@trpc/server | Framework สำหรับเชื่อมระหว่างหน้าบ้านที่ง่ายขึ้น |
elysia | Framework ฝีมือคนไทย (แต่ออกแบบสำหรับ Bun เป็นหลัก) |
ws | สำหรับการสร้าง WebSocket Server |
socket.io | สำหรับการสร้าง WebSocket Server อีกรูปแบบ |
Frontend Frameworks
Package | คำอธิบาย |
---|
http-server | สำหรับการจำลอง HTTP Server อย่างง่าย |
webpack | Bundler เก่าที่เคยนิยม แต่ไม่แนะนำ |
vite | Bundler ที่ยอดนิยมอย่างมาก ใช้ได้กับทุก Framework |
create-vite | CLI ของ Vite สำหรับสร้างโปรเจกต์อย่างรวดเร็ว |
slidev | สไลด์ที่ผมใช้ทำในปัจจุบัน |
astro | Framework ที่แนะนำสำหรับการสร้างเว็บหลากหลายรูปแบบ |
react | React - Frontend Framework ยอดนิยม |
vue | Vue.js - Frontend Framework ยอดนิยม |
angular | Angular - Frontend Framework ขนาดใหญ่ |
svelte | Svelte - Frontend Framework ที่ออกแบบใหม่ |
solidjs | Solid.js - Framework ที่ให้ประสิทธิภาพสูง |
Scraper Packages
Package | คำอธิบาย |
---|
cheerio | แปลงจาก HTML String เป็น DOM แบบ jQuery ที่ใช้งานบน Node.js ได้ |
puppeteer | สร้างบอทใช้งาน Web Browser ใน Node.js (แนะนำ) |
playwright | สร้างบอทใช้งาน Web Browser ใน Node.js (มาใหม่และน่าสนใจ) |
cypress | สร้างบอทใช้งาน Web Browser ใน Node.js (เหมาะสำหรับทดสอบเว็บ) |
Logger Packages
Package | คำอธิบาย |
---|
winston | Logger แบบกำหนดเองได้ขั้นสูง |
log4js | Logger เหมาะกับสร้างไฟล์ Log |
pino | Logger อย่างง่ายบน Console |
consola | Logger อย่างง่ายบน Console |
Desktop Frameworks
Package | คำอธิบาย |
---|
electron | สร้างโปรแกรม Desktop แบบ Cross-platform (ของเก่า แต่มีความนิยมสูง) |
create-tauri-app | สร้างโปรแกรม Desktop แบบ Cross-platform (ของใหม่ น่าสนใจ) |
Image Packages
Package | คำอธิบาย |
---|
sharp | Image Processing |
qrcode | QRCode Generator |
Spreadsheet Packages
Package | คำอธิบาย |
---|
fast-csv | แปลงข้อมูลระหว่าง JSON กับ CSV |
exceljs | แก้ไขและจัดการกลุ่มไฟล์ Excel (แนะนำและใช้ได้ดีกว่า) |
xlsx | แก้ไขและจัดการกลุ่มไฟล์ Excel (ของเก่า แต่ยังมีความนิยมสูง) |
PDF Packages
Package | คำอธิบาย |
---|
pdfkit | สร้างไฟล์เอกสาร PDF |
pdfmake | สร้างไฟล์เอกสาร PDF |
jspdf | สร้างไฟล์เอกสาร PDF |
Queue Systems
Package | คำอธิบาย |
---|
Redis | Redis สำหรับทำระบบ Memory Cache ในการเก็บคิว |
bull | ระบบ Queue |
kue | ระบบ Queue |
Test Frameworks
Package | คำอธิบาย |
---|
jest | สร้างชุดทดสอบโปรแกรม (แนะนำ) |
vitest | สร้างชุดทดสอบโปรแกรม (มาใหม่และน่าสนใจ) |
mocha | สร้างชุดทดสอบโปรแกรม (แบบใช้พื้นฐาน) |
supertest | สร้างชุดทดสอบโปรแกรม (สำหรับ Backend) |
cypress | สร้างชุดทดสอบโปรแกรม (สำหรับ Frontend) |