課程目標

  • 學習 node 匯入/匯出模組

課程內容

教大家怎麼把多個程式組裝起來,變成一個強大的主程式

順便學習 node 裡面自訂模組,匯出、匯入的語法!


建立 task1.js 放入以下內容

function task1() {
  console.log('====== start ======')
  console.log('this is task 1');
  console.log('====== finish ======')
}

module.exports = {
  task1: task1
};

建立 task2.js 放入以下內容

function task2() {
  console.log('====== start ======')
  console.log('this is task 2');
  console.log('====== finish ======')
}

module.exports = {
  task2: task2
};

建立 task3.js 放入以下內容

function task3() {
  console.log('====== start ======')
  console.log('this is task 3');
  console.log('====== finish ======')
}

module.exports = {
  task3: task3
};

在 node 中,要匯出模組時,只要使用全域變數 module 物件的屬性 exports 即可,這樣 node 就知道怎麼處理了

我們設計這些 task 程式,不再是直接拿來執行的腳本,而是提供特定功能的模組,所以記得把要匯出的任務寫在函式裡面


接著來寫主程式,通常會命名為 index 或 main

我們就建立 main.js 吧,放入以下內容

const readlineSync = require('readline-sync');

var module1 = require('./task1');
var module2 = require('./task2');
var module3 = require('./task3');

function showMenu() {
  const answer = readlineSync.question('您要執行什麼?\n1. 任務1\n2. 任務2\n3. 任務3\n4. 離開\n');

  if (answer === '1') {
    module1.task1();
    showMenu();
  } else if (answer === '2') {
    module2.task2();
    showMenu();
  } else if (answer === '3') {
    module3.task3();
    showMenu();
  } else if (answer === '4') {
    process.exit();
  } else {
    showMenu();
  }
}

showMenu();

注意看 require('./task1') 那個 . 是當前檔案路徑的意思,當 require 看到檔案路徑,就會去從檔案路徑匯入模組

如果看起來不是檔案路徑,而是純粹模組名稱 require('readline-sync') 那麼 node 就會從 node_modules 資料夾尋找模組

去終端機輸入

node main.js

很好玩吧!這已經很接近實務上會操作的 CLI 應用程式了!

課後作業

接續前一課的作業,現在來把之前的多個檔案,打包成一個程式吧!

請將之前的多的程式改寫,讓內容能夠匯出

接著建立一個 index.js 檔案,匯入上面提到的所有函式

使用者輸入 node index.js 之後,終端機會詢問

您要執行下列什麼指令?
1. 建立待辦事項
2. 讀取待辦事項
3. 更新待辦事項
4. 刪除待辦事項
5. 離開

使用者可以輸入數字,程式會分別去執行任務,也就是呼叫前面匯入的對應函式

完成以上任務,你就完成這次的課程目標了!


歡迎將作業成果,在下方留言,跟大家分享,讓大家給你一些回饋!

可以將每課學到的觀念、關鍵字,丟到網路上去搜尋、研究一下!

發問請在「討論專區」為主,或者分享學習筆記、寫學習心得!

貼文都會出現在個人檔案頁面,成為學習歷程、部落格紀錄!

未來面試時,分享給面試官看,會讓人知道你的積極程度!


共有 13 則留言

作業

幾個問題:
readlinine-sync還是無法正確輸入中文,只能輸入英文
readline和readlinine-sync同時載入時螢幕不會顯示出輸入的字

按讚的人:

寫得很好,順利完成!

中文顯示問題,之前有人分享
https://codelove.tw/@hung/post/jaljmx
試試看

按讚的人:

readline和readlinine-sync同時載入的問題,看不太懂
可以單獨發一篇發問?
最好附上一小段範例程式碼,大家會更清楚

按讚的人:
const fs = require("fs");
const readlineSync = require("readline-sync");

let todos = JSON.parse(fs.readFileSync("todos.json"));
todosList = todos.map((todo, index) => `#${index} ${todo.title}`).join("\n");

const toUpdateIndex = readlineSync.question(
  `您要更新哪個待辦事項?
${todosList}\n`
);

const readline = require("readline").createInterface({
  input: process.stdin,
  output: process.stdout,
});

readline.question("您想把內容更新成什麼?\n", function (toUpdateContent) {
  todos[toUpdateIndex].title = toUpdateContent;
  console.log("更新事項:" + toUpdateContent);
  fs.writeFileSync("todos.json", JSON.stringify(todos));
  process.exit(0);
});

1.readlineSync無法顯示中文的問題有看前輩的方式解決,不過問題是顯示的出來,輸入的中文又會變成亂碼。
2.同時載入readlineSync和readline時,readlin的載入和呼叫間不能插入readlineSync,不然readline不會停下來等answer直接結束。然後readlineSync會變成輸入時看不到輸入的文字。我是在windows11使用vs code,也許環境的關係導致?

按讚的人:
  1. 實務上,現在應該只有開發者會使用 CLI 程式。開發時,基本上以使用英文為主,所以微軟上的視窗中文問題,可以先不研究了,我也不知答案,反正不太會碰到

  2. 這個問題,學術上有研究價值,但是實務上不會碰到。sync vs async 挑一種寫法,不會有同時這樣寫的情況,可以先不研究了,我也不知答案,反正不太會碰到

真的在學術上好奇:大概是背後跟終端機取得參數時,有某些衝突,要深入研究終端機與程式互動

以上,簡單分享看法

按讚的人:

作業,再麻煩站長了,謝謝!

按讚的人:

寫得很好,順利完成!