จาก script สั้นๆ เรามาสร้าง Node.js modules ไว้ใช้งานกันเถอะพี่น้อง

Cover image

จากบทความที่แล้ว

แยกที่อยู่ภาษาไทยเป็นส่วนๆด้วย Javascript

วันนี้เราจะมาเปลี่ยนมันเป็น Node.js modules ไว้ใช้เองหรือแจกจ่ายเพื่อนพี่น้องคนอื่นๆด้วย ไม่พูดพร่ำทำเพลงครับเริ่มเลยแล้วกัน

สร้าง account NPM User

ด้วยการเข้าไปลงทะเบียนที่นี่ก่อนเลยครับ https://www.npmjs.com/signup

หลังจากเรียบร้อยแล้วทำการ login บน terminal ของเราเอาไว้ด้วยนะครับ

$ npm login

ก็ทำการใส่ username / password ให้เรียบร้อยตามขั้นตอน พอเสร็จแล้วมาตรวจสอบอีกทีว่าใช่เราแล้วใช่ไหมด้วยคำสั่งนี้ครับ

$ npm whoami

สร้างไฟล์ package.json ก่อน

เข้าไปที่ folder ของ script ของเราครับ แล้วใช้้สร้าง package.json ด้วยคำสั่ง

$ npm init

ก็ให้ใส่รายละเอียดตามต้องการของเราไปนะครับ ตั้งแต่ชื่อ คำอธิบาย เลขเวอร์ชัน เพราะสิ่งเหล่านี้จะถูกนำไปใช้ใน web ของ https://npmjs.org นั่นเองครับ

สร้าง index.js เป็นไฟล์หลักของเรา

โดย default Node.js module จะใช้ index.js เป็นไฟล์หลัก ไม่ว่าคุณจะเขียน script ไว้กี่ไฟล์เอาไว้ที่ไหนบ้างสุดท้ายอย่าลืม require มาไว้ที่นี่ด้วยครับ สุดท้ายก็ export ส่วนที่จะให้ผู้ใช้เรียกมาใช้ด้วย เช่น ของผมก็จะเป็น function split() ครับผม ใกล้เสร็จแล้วนะเนี่ย!

index.js

let subdistricts = require('subdistricts.json')

const split = (text) => {
    try {
        const cleanText = removePrefix(text);
        let wordlist = cleanText.split(' ').filter(word => /[-]{2,}/.test(word));
        wordlist = [...new Set(wordlist)];
        const mainAddress = findSubdistrict(wordlist);
        const result = finalResult(cleanText, mainAddress);
        return result;
    } catch (error) {
        console.error(error);
    }
};

...

module.exports = {
    split
}

ก่อนจะปล่อย ไม่เขียน test สักหน่อยหรอ?

เรากำลังจะทำ module ส่งให้ชาวบ้านชาวช่องใช้ เราก็ควรเขียน test ไว้สักหน่อยจริงไหมครับ จะได้รู้ว่าเขียนไปแก้ไปแล้ว function ของเรามันยังทำงานได้ดีอยู่เหมือนเดิมใช่ไหม ไม่งั้นเดี๋ยว update code ใหม่เข้าไปแล้วทำงานชาวบ้านใช้ไม่ได้จะโดนสวดเอานะครับ

โดยวันนี้ผมจะเลือกใช้ Mocha มาใช้ในการทำ unit test นะครับ ไม่ต้องพูดเยอะครับ ติดตั้ง Mocha ใน dev-dependency แล้วก็สร้าง test/test.js ตามคำสั่งด้านล่างเลยครับ

$ npm install --save-dev mocha
$ mkdir test && cd test
$ code test.js

แล้วเราก็เขียน test ให้เรียบร้อย ดังตัวอย่างครับ

test/test.js

const assert = require('assert');
const Splitter = require('../index');

describe('ปกติ', () => {
    const input1 = 'นายดราก้อน ตันเด้อ   อาคารเอ ชั้น  10    (081-234-5678) ห้อง 3  เขตพญาไท กรุงเทพมหานคร แขวงสามเสนใน 10400';
    const result = Splitter.split(input1);

    describe('#name', () => {
        it('should be "นายดราก้อน ตันเด้อ"', () => {
            assert.equal(result.name, 'นายดราก้อน ตันเด้อ');
        });
    });
    describe('#phone', () => {
        it('should be "0812345678"', () => {
            assert.equal(result.phone, '0812345678');
        });
    });
    describe('#address1', () => {
        it('should be "อาคารเอ ชั้น 10 ห้อง 3"', () => {
            assert.equal(result.address, 'อาคารเอ ชั้น 10 ห้อง 3');
        });
    });
    describe('#subdistrict', () => {
        it('should be สามเสนใน', () => {
            assert.equal(result.subdistrict, 'สามเสนใน');
        });
    });
    describe('#district', () => {
        it('should be พญาไท', () => {
            assert.equal(result.district, 'พญาไท');
        });
    });
    describe('#province', () => {
        it('should be กรุงเทพมหานคร', () => {
            assert.equal(result.province, 'กรุงเทพมหานคร');
        });
    });
    describe('#zipcode', () => {
        it('should be 10400', () => {
            assert.equal(result.zipcode, '10400');
        });
    });
});

ใครไม่เข้าใจก็ลองอ่านการใช้งาน Mocha เพิ่มเติม ได้ที่เว็บหลักเลยครับ https://mochajs.org/

เพื่อความสะดวกเราก็มาเพิ่ม "test": "mocha" ใน package.json ครับ หลังจากนั้นเราจะได้ใช้ npm run test เพื่อ run test

{
  "name": "thai-address-splitter",
  ...
  "main": "index.js",
  "scripts": {
    "test": "mocha"
  },
  ...
}

เมื่อ run ดูก็จะพบความสวยงามครับผม

ลอง run test

จบในส่วนของการเตรียม module แล้วครับ

ได้เวลา Publish แล้ว

เมื่อทุกอย่างพร้อมจะรออะไรล่ะครับ ส่งขึ้นไปที่ npmjs.org ได้เลยครับ โดยการ pulish จะมี 2 แบบนะครับ

  • แบบ Private ใช้คำสั่ง npm publish
  • แบบ Public ใช้คำสั่ง npm publish --access public

ซึ่งผมเลือกแบบ public ครับ เพราะไหนๆก็เขียนบทความอธิบายไปแล้วก็ปล่อยเลยละกัน อ้อ!! เพื่อความสมบูรณ์แบบอย่าลืมเขียน document เอาไว้ใน readme.md ด้วยนะครับ

ลอง publish

ลองสวมบทผู้ใช้บ้างซิ

หลังจาก publish เรียบร้อยแล้ว เราจะสามารถค้นหา package ของเราด้วยชื่อได้ พอคลิกเข้ามาดูรายละเอียดก็จะเจอ ข้อมูลใน readme.md ที่เราเขียนเอาไว้ครับ อยู่บนเว็บแล้ว

ผมจะลองเป็นคนแรกที่จะ download package นี้มาใช้ครับผม โดยจะสร้าง project ขึ้นมาแล้วก็เรียกใช้ thai-address-splitter

$ mkdir test-folder
$ cd test-folder
$ npm init
$ npm install thai-address-splitter
$ code .

สร้าง index.js เพื่อทดลองเรียกใช้งาน (เห็นไหมๆ มี suggestion ใน require ด้วย)

อยู่บนเว็บแล้ว

const Splitter = require('thai-address-splitter');

(() => {
    const address = Splitter.split('คุณดอกฝ้าย สายเขียว 799/11 ถนนจักรแก้ว แขวงวังบูรพาภิรมย์ เขตพระนคร  กรุงเทพ 10200 เบอร์ 0911222333')
    console.log(address);
})();

ลอง run ดูถ้าใช้ได้ก็แปลว่าทุกอย่างเรียบร้อย

อยู่บนเว็บแล้ว

เสร็จแล้วครับผม เปลี่ยนจาก script สั้นๆไปเป็น Node.js modules ที่พร้อมให้ทุกคน download ก็มีเพียงเท่านี้แหละครับ สำหรับท่านไหนที่มีข้อเสนอแนะสามารถบอกผมได้เลยครับ ผมยินดีมากที่จะได้ปรับปรุงครับ สำหรับท่านใดที่มีคำถามสามารถสอบถามเข้ามาที่ Inbox ของ Facebook Page ได้เลยนะครับ

อ้างอิง

Creating Node.js modules

บทความใกล้เคียง