Skip to main content

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

·3 mins

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

แยกที่อยู่ภาษาไทยเป็นส่วนๆด้วย 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