# 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 :::