แชร์ตัวแปรใน package.json ด้วย NPM config
Nuttavut Thongjor
Node.js

เรียนรู้การสร้างออบเจ็กต์ config ใน package.json เพื่อแชร์ค่าพารามิเตอร์ใน scripts

คำอธิบาย
ความคิดเห็น

เมื่อส่วนของ scripts ใน package.json มีความซับซ้อนมากขึ้นอันเกิดจากการแชร์ค่าพารามิเตอร์ร่วมกัน เช่น ค่าของพอร์ต นั่นทำให้ส่วนของ scripts มีส่วนซ้ำกันและต้องไล่แก้ไขทุกจุดเมื่อพารามิเตอร์เหล่านั้นเปลี่ยนแปลง

Code
1{
2 "name": "npm-config",
3 "scripts": {
4 "start": "node index.js -p 8080",
5 "test": "wait-on http://localhost:8080 && jest"
6 }
7}

จากตัวอย่างข้างต้น 8080 เป็นค่าของพอร์ตที่ถูกใช้ซ้ำทั้งจากสคริปต์ของ start และ test เมื่อเป็นเช่นนี้การแยก 8080 ออกมาตั้งเป็นค่าพารามิเตอร์แยกย่อมดีกว่า เพราะจะช่วยลดโค้ดที่ซ้ำและง่ายต่อการแก้ไขค่านี้ในอนาคต

package.json มีส่วนของออบเจ็กต์ config ที่สามารถตั้งค่า configuration parameters เพื่อนำค่านี้ไปใช้กับส่วนของ scripts ได้ จากตัวอย่างตั้งต้นเราจึงย้าย 8080 ออกเป็นค่า config ในชื่อของ port ดังนี้

Code
1{
2 "name": "npm-config",
3 "config": {
4 "port": 8080
5 },
6 "scripts": {
7 "start": "node index.js -p $npm_package_config_port",
8 "test": "wait-on http://localhost:$npm_package_config_port && jest"
9 }
10}

ส่วนของพารามิเตอร์สามารถถูกเข้าถึงได้ผ่านตัวแปรชื่อ $npm_package_config_<CONFIG> เช่นกรณีของ port ข้างต้น ตัวแปรที่เกิดขึ้นจึงเป็น $npm_package_config_port

นอกเหนือจากค่าพารามิเตอร์จะถูกอ้างอิงได้ใน scripts แล้ว มันยังสามารถถูกเข้าถึงได้จากในโค้ดด้วยเช่นกันผ่าน process.env.npm_package_config_<CONFIG> เช่น เราอาจสร้างไฟล์ index.js ดังนี้

JavaScript
1console.log(process.env.npm_package_config_port);

เมื่อทำการสั่ง npm start จะได้ผลลัพธ์เป็น 8080 อันเป็นค่าของ port ในออบเจ็กต์ config นั่นเอง