---
# System prepended metadata

title: NodeJS(Max)第 4 節： Improved Development Workflow and Debugging
tags: [Node.js, Udemy]

---

# NodeJS(Max)第 4 節： Improved Development Workflow and Debugging

> Udemy課程：[NodeJS - The Complete Guide (MVC, REST APIs, GraphQL, Deno)
](https://www.udemy.com/course/nodejs-the-complete-guide/)

`20231203Sun.~20231204Mon.`

## 4-42. Understanding NPM Scripts
先用npm init去初始化設定。
```javascript!
npm init
```
他會問你一連串的問題，如果直接按enter跳過，npm會給你預設值，預設的值他都寫在後方括號中。
![image](https://hackmd.io/_uploads/HkjXEk5Ha.png)

之後設定完，輸入yes後便會幫你建立一個package.json檔案
![image](https://hackmd.io/_uploads/Skkv9kcrT.png)

其中，script的區塊，我們可以自行新增自己的語法。例如說我們先前需要打上`node app.js`去執行我們的檔案（以這裡為例，就是去執行名為app.js的檔案）。

而現在我們要在script的區塊加入新語法（如下所示），這讓其他人下載你的檔案之後，不必去猜測他需要執行哪個檔，取而代之的是只需要打上`npm start`即可，不須再附上檔名。
```javascript!
"start": "node app.js"
```
![image](https://hackmd.io/_uploads/Hk5zAyqBa.png)

上方所設置的key name start，是可以自行修改的，我們可以任意命名，重點在於value的部份，是我們要去執行的內容，因此不能出錯（當然也不能隨意修改），不過！若任意命名且想執行該script時，必須以「`npm run`」作為前綴詞。

（前面可以直接`npm start`，而非`npm run start`，那是在npm中的special case。）

**▊ 錯誤的寫法**

若想執行script，直接用npm會報錯
![image](https://hackmd.io/_uploads/rkW4lxcSa.png)

**▊ 正確的寫法**

```javascript!
npm run start-server
```
![image](https://hackmd.io/_uploads/B1-wxg5ST.png)

****

## 4-43. Installing 3rd Party Packages
目前若我們修改程式碼後，先是ctrl+S儲存修正後的程式碼，然後都必須先按下ctrl+C停止server之後再次執行程式碼，才能看到修正後的成果，這有點cumbersome。（我們更希望每次ctrl+S儲存後，server都能自動的去重新啟動）

為了達成這樣的目的，我們可以去下載一個第三方的套件，那要如何下載第三方套件呢？

先前我們利用了run的命令(command)，去執行package.json中的各種客製scripts，現在就要利用install這個命令來下載第三方套件：

```javascript!
npm install 套件名稱
```

而這裡我們希望讓server在每次我們修正並儲存程式檔時都能自動的restart，用到的套件名稱叫做「[nodemon](https://www.npmjs.com/package/nodemon)」。

![image](https://hackmd.io/_uploads/SJLe4g9H6.png)

而在下載之前，可以先了解一些npm的語法：

**▊ --save**

以下兩種是同樣的作用，目前的預設即為`--save`。他便是一般的下載套件，而下載後的套件會被寫入"dependencies"裡面，也就是說這個套件也會作用在我們發布的project上。

舉例來說，若專案中使用到jQuery套件，那麼我們專案發布至線上環境後，專案仍然需要jQuery的運作，因此jQuery套件應該使用`--save`，將套件寫入"dependencies"裡面。
```javascript!
npm install nodemon
npm install nodemon --save
```
![image](https://hackmd.io/_uploads/BJrZclcHa.png)

**▊ --save-dev**

相反地，若我們只有在開發時才會使用到該套件，那麼我們可以`--save-dev`下載套件，如此一來套件將寫入"devDependencies"裡面。

舉例來說，此處的nodemon作用，在於當我們開發時修正了程式碼，儲存該程式檔後，nodemon可以幫助我們自動地restart server，但是當這個專案被發布至線上後，我們並不會在線上動到他的程式碼，也就不會有需要restart server的清況發生，因此nodemon套件很適合寫入"devDependencies"裡面。
```javascript!
npm install nodemon --save-dev
```
![image](https://hackmd.io/_uploads/BkeM5gcHp.png)

:::success
**Global Features vs Core Modules vs Third-Party Modules**

![2023-12-03 20-58-52 的螢幕擷圖](https://hackmd.io/_uploads/HkYisxqB6.png)
:::

****

## 4-45. Using Nodemon for Autorestarts
上一章節知道如何安裝套件，也安裝完成nodemon了，接著便要開始使用，使用方式則是用nodemon來取代我們先前的`node app.js`。

```javascript!
"start": "nodemon app.js"
```
![image](https://hackmd.io/_uploads/HkjfRgcrT.png)

此時，我們試著在app.js中做更動並儲存，可以發現terminal會出現以下內容，他已幫助我們restart整隻程式碼了。

![2023-12-03 21-11-34 的螢幕擷圖](https://hackmd.io/_uploads/r1OiAlqBp.png)

****

## 4-50. Logical Errors
一些logic error較難找出錯誤的地方在哪裡，因為logic error不會出現error的警示給我們，因此可以善用VScode中的debuger。

可以在覺得有問題的行數設置breakpoint，當我們滑鼠hover至程式碼之上，可以看見當下的變數被賦予什麼樣的內容（下圖為老師的範例做截圖）

（覺得使用概念跟goole devtool相似）

![2023-12-03 22-22-27 的螢幕擷圖](https://hackmd.io/_uploads/ryQvkzcB6.png)

**在VS code中可以從view中找到debug console**
![2023-12-03 22-37-37 的螢幕擷圖](https://hackmd.io/_uploads/SkxJQM5rp.png)

**或者按下F5快捷鍵，**
![2023-12-03 22-33-46 的螢幕擷圖](https://hackmd.io/_uploads/Hkb-XzcHa.png)

**再選擇nodejs**
![2023-12-03 22-43-44 的螢幕擷圖](https://hackmd.io/_uploads/ByaE4McSa.png)

記得！要先停掉nodemon，不要同時開啟nodemon又同時開啟debug，這會讓debug無法正常執行。

老師提供的延伸資料：[Node.js debugging in VS Code](https://code.visualstudio.com/docs/nodejs/nodejs-debugging)

****

## 4-52. Restarting the Debugger Automatically After Editing our App
在vscode中，debug的部份也可以自動更新。

**Run > Add Configuration**
![image](https://hackmd.io/_uploads/S1gmImjHT.png)

**Node.js**
![image](https://hackmd.io/_uploads/r1IIImjST.png)

**會新增一個launch.json檔案**
![image](https://hackmd.io/_uploads/SyqdLmjS6.png)

**額外加上三行指令，即完成設置**
```javascript!
"restart": true,
"runtimeExecutable": "nodemon",
"console": "integratedTerminal"
```
![image](https://hackmd.io/_uploads/rkVsI7jBa.png)

:::success
其他更多關於VS code debug的內容：

* More on debugging Node.js: https://nodejs.org/en/docs/guides/debugging-getting-started/
* Debugging Node in Visual Studio Code: https://code.visualstudio.com/docs/nodejs/nodejs-debugging
:::