มาใช้ Package management สำหรับ deno กันเถอะ
Tags: trex, packagemanagement, deno, oak
Published: 2020-05-30 15:29:18

หลังจากที่ผมได้ลองเล่น Deno มาได้สักพักก็ไปนึกถึง npm ที่เป็น Package management แล้วก็มาเจอ `Trex` ซึ่งอ่านว่าทีเร็กซ์ นั้นเป็นตัวจัดการที่ทำหน้าที่คล้าย npm เลย แต่ก็มีสิ่งที่เราต้องรู้จักก่อนที่จะใช้ `Trex` นั่นคือ `import_map.json`

##import_map.json
import_map.json คืออะไร ? มันก็คือ ไฟล์ที่ไว้กำหนด import map กับ modules สำหรับ deno แต่ตอนนี้เขาบอกว่ายังไม่ stable แต่ก็ลองมาใช้กันก่อนครับ มาดูข้อจำกัดตอนนี้กัน
- single import map
- no fallback URLs
- ไม่ support `std:` namespace
- supports ไฟล์ที่เป็น :, http: และ https: schemes เท่านั้น

มาดูตัวอย่างกัน ในทีนี้ผมจะใช้ framework oak ในการทำ http server นะครับ
ผมสร้างไฟล์ `index.ts` ตาม code ด้านล่างนี้
```typescript
import { Application } from 'https://deno.land/x/oak/mod.ts'

const app = new Application()

app.use(ctx => {
  ctx.response.body = 'Hello World!'
})

await app.listen({ port: 4000 })

```
แต่ถ้าเรากำหนดไฟล์ `import_map.json` เพื่อการ map modules ที่เราเรียกใช้จะได้ตามนี้ครับ 
code สำหรับ `import_map.json`
```json

{
  "imports": {
    "oak": "https://deno.land/x/oak/mod.ts"
  }
}
```
แล้วเราก็มาเปลี่ยน code ที่ไฟล์ index.ts ที่ import กันครับจะได้ code ตามตัวอย่างข้างล่างนี้
```typescript
import { Application } from 'oak'

const app = new Application()

app.use(ctx => {
  ctx.response.body = 'Hello World!'
})

await app.listen({ port: 4000 })

```
เพียงเท่านี้เราก็จะได้ใช้ import map เรียบร้อยแล้วครับ งั้นมาลองรันกันครับ

วิธีการรัน สิ่งที่จะต้องใช้ตอน deno run คือ
- --allow-net
- --importmap=import_map.json (ไว้กำหนดไฟล์ importmap)
- --unstable (importmap ยังไม่ stable เลยต้องกำหนด permission ว่ารันแบบ unstable)
```shell
$ deno run --allow-net --importmap=import_map.json --unstable  index.ts
```

เมื่อสั่ง deno run จากคำสั่งข้างต้นเสร็จเราลองเรียก `http://localhost:4000`
ผลลัพธ์ถ้าถูกต้องจะได้ Hello World!

OK ! งั้นต่อมาเรามาใช้ Package management สำหรับ deno กัน สิ่งที่ผมจะใช้คือ `Trex` นั่นเอง
##Trex

![Trex](https://i.ibb.co/fF4BRkZ/trexquad.jpg)
ก่อนอื่นเรามาติดตั้งกันครับ (ใช้ได้สำหรับ deno version 1.0.0 ขึ้นไปเท่านั้น)
```shell
$ deno install --allow-read --allow-write --allow-net --allow-run --unstable https://deno.land/x/trex/Trex.ts
```
หลังจากติดตั้งรองรัน Trex ดูครับโดยการเช็ค Trex version
```shell
$ Trex --version
```
ผลลัพธ์ที่ได้
```shell
Trex:
 Version v0.2.0 
 ༼ つ ◕_◕ ༽つ
```
โอเคน่าจะใช้งานได้แล้วครับ 👍
ก่อนอื่นเราลองลบไฟล์ `import_map.json` ของเราที่สร้างเองเมื่อสักครู่นี้ก่อนครับ
เมื่อลบแล้วมาติดตั้ง package กัน
คำสั่งก็เหมือน ๆ กับ npm เลยครับ
```shell
$ Trex install --map {modules name} // or Trex i --map {modules name}
```
ผมจะ install oak มาใช้งานนะครับ 
```shell
$ Trex i --map oak
```
เมื่อรันเสร็จแล้วก็จะมีไฟล์ `import_map.json` ที่ Trex ได้สร้างขึ้นมาพร้อมกับ code ที่ map กับ modules
เสร็จแล้วก็ลองรันไฟล์ `index.ts` ดูครับ
```shell
$ deno run --allow-net --importmap=import_map.json --unstable index.ts
```
เปิด Browser ขึ้นมาเข้า `http://localhost:4000` ผลลัพธ์ก็น่าจะได้
`Hello World!` มานะครับ

จะลบ modules ที่ map ก็แค่ใช้
```shell
$ Trex delete {modules name}
```

##สรุป

ข้อดีของ Trex คือสามารถกำหนด import map ให้เราโดยอัตโนมัติให้เรา แต่ถ้าเราไม่ใช้ก็ต้องกำหนด import map ด้วยตัวเอง ยังไงซะหวังว่าอนาคตน่าจะ stable และมีอะไรที่น่าสนใจอีกครับ หวังว่าบทความนี้จะมีประโยชน์ต่อผู้อ่านนะครับ ขอบคุณที่ยอมอ่านจนจบครับ 😀