---
# System prepended metadata

title: Day03 【牙起來】 ng與node_modules包的關係

---

# Day03 【牙起來】 ng與node_modules包的關係

昨天安裝完Angular了，但可能你會有疑問
我明明安裝的是`Angular Cli`，Cli指的是[**命令列介面**](https://zh.wikipedia.org/wiki/%E5%91%BD%E4%BB%A4%E8%A1%8C%E7%95%8C%E9%9D%A2)，這應該不是**Angular**吧，那這兩者是什麼關係？

對於這個問題，我們先繼續往下就知道了

## 產生Angular專案

我們先用`ng new`產生一個全新的Angular專案

    > ng new project01


![](https://i.imgur.com/ZXbEJnn.png)

此步驟 `Would you like to add Angular routing?` 問是否添加`routing`模組
不用緊張，這項問題選`y或N`差異只在於多一個檔案而已，我們之後都能手動新增或刪除

在這步驟我先選擇 `y`


![](https://i.imgur.com/FcyyDzL.png)

接下來此步驟 `Which stylesheet format would you like to use?` 問要使用哪種檔案格式做為預設樣式，有CSS、SCSS、Sass、Less可選擇
在這步驟我先選 `CSS`

（不同版本的Angular可能會出會不同的問題及偏好選項）

之後就開始執行對於Angular專案來說必要的安裝

![](https://i.imgur.com/B8D9KZB.png)


執行`ng new`時，安裝需要一段時間（任何事第一次都會比較久...）


完成後，在Windows上可能會出現一堆`warning`
提醒系統自動針對作業系統而調整**換行符號**的格式，這可以不用理會

![](https://i.imgur.com/ziyO9xN.png)


## Angular專案內部結構

打開剛產生出來的資料夾來看

![](https://i.imgur.com/pNMDgOD.png)

點進**node_modules**資料夾底下一探究竟

![](https://i.imgur.com/3ojj3vy.png)

發現這裡有一包叫作`@angular`的資料夾，對你想的沒錯，這一包才是 **Angular主體**，Angular本位，Angular框架所用到的東西都在這底下。沒有他，就沒有Angular專案

所以我們是透過`ng-cli`來創建一個Angular專案的

---

## node_modules的優先順序

當程式尋找一個套件時
會先看有沒有 `./node_modules` 資料夾，若有，則看裡面看有沒有這個套件名稱
當沒有時再往外層查找 `../node_modules`
若還是沒有再往外一層 `../../node_modules` 
...
以此類推

所以當有多個`node_modules`包時
同層資料夾的`node_modules`包的優先度最高，會先被讀取到


## Angular 全域(global) vs 區域(loacl)

由於上述優先順序的原因，
只要**進了`project01`專案資料夾**內，用到的就是該`node_modules`內的Angular版本，俗稱**Local版**

只要在**專案資料夾以外**的地方，吃到的就是**Global版** Angular Cli
（精確來說是再往外層都沒有`node_modules`，或`node_modules`都沒有Angular資料夾時）

所以下次遇到`global angular cli version is greater than your local version` **global與local版本不一致時**，就知道是什麼問題囉

把Local升到最新版本、或者將Local升級到與Global版本相同、或者將Global移除重新裝舊版本，都能夠解決問題～

    把Local升到最新版本
    > npm install --save-dev @angular/cli@latest
    
    把Local升級到指定版本
    > npm install --save-dev @angular/cli@14.0.7
    
    把Global降版（移除後重裝舊版本）
    > npm uninstall -g @angular/cli
    > npm cache clean --force
    > npm cache verify
    > npm install -g @angular/cli@12.0.0

---

### 額外補充，但不是很重要

透過`where`指令，來尋找目前使用到的指令路徑在哪裡

    > where ng

在**查找`ng`指另位置**時發現
不管在哪個目錄底下使用`where ng`，都是顯示目前用到的是**Global版**的位置

![](https://i.imgur.com/mduwktl.png)
    
    C:\Users\GJLMoTea\AppData\Roaming\npm\ng
    C:\Users\GJLMoTea\AppData\Roaming\npm\ng.cmd

這就讓人納悶啦，那是如何才使用到node_modules的**Local版**的呢？
關鍵就在於`ng.cmd`裡面

![](https://i.imgur.com/uceQfwK.png)

所以實際上是先運行**Global版的CMD**，才導向到**Loacl版**去
否則，除非是在 `node_modules\.bin` 底下呼叫，才會真正顯示**Local版**的位置

![](https://i.imgur.com/YLrucoy.png)

