---
# System prepended metadata

title: 第 32 節： Exploring Modules & The NPM Universe
tags: [The Web Developer Bootcamp 2021, JavaScript, Udemy]

---

Udemy課程：[The Web Developer Bootcamp 2021（Colt Steele）](https://www.udemy.com/course/the-web-developer-bootcamp/)
# 第 32 節： Exploring Modules & The NPM Universe
###### tags: `JavaScript` `Udemy` `The Web Developer Bootcamp 2021`
2021.11.01（Mon.）~2022.02.17（Thu.）
## ● 上課筆記
## 1.  module.exports
> 參考網站：[《Chris 技術筆記》Node.js 的 module.exports 和 require](https://dwatow.github.io/2018/02-13-js-module-require-exports/)
> 參考網站：[關於 module.exports 的兩三事](https://ithelp.ithome.com.tw/articles/10185083)
> 參考網站：[官方文件](https://nodejs.org/docs/latest-v15.x/api/modules.html#modules_module_exports)

要載入模組，需要利用`require()`。
若要載入的模組是自創的，require的括號裡面要寫清楚檔案的路徑！
****
==範例1==
* math.js
```javascript=
module.exports.add = (x, y) => x + y;
module.exports.PI = 3.1415926;
module.exports.square = x => x * x;
```
* app.js
```javascript=
const math = require("./math");
console.log(math.PI);
console.log(math.square(9));
```
* 執行 / 結果
```
> node app.js
3.1415926
81
```
****
==範例2==
* math.js
```javascript=
module.exports.add = (x, y) => x + y;
module.exports.PI = 3.1415926;
module.exports.square = x => x * x;
```
* app.js
```javascript=
const {PI, square} = require("./math");
console.log(PI);
console.log(square(9));
```
* 執行 / 結果
```
> node app.js
3.1415926
81
```
****
==範例3==
* math.js
```javascript=
module.exports.add = (x, y) => x + y;
module.exports.PI = 3.1415926;
module.exports.square = x => x * x;
```
* app.js
```javascript=
const {PI, square} = require("./math");
console.log(PI);
console.log(square(9));
```
* 執行 / 結果
```
> node app.js
3.1415926
81
```
****
==範例4==
* math.js
```javascript=
const add = (x, y) => x + y;
const PI = 3.1415926;
const square = x => x * x;

const math = {
    add: add,
    PI: PI,
    square: square
}

module.exports = math;
```
* app.js
```javascript=
const {PI, square} = require("./math");
console.log(PI);
console.log(square(9));
```
* 執行 / 結果
```
> node app.js
3.1415926
81
```

## 2.  Requiring A Directory
要如何在目錄外載入目錄內的模組。

****
==範例==

先來看看目錄與檔案的關係：
```
shelter
﹂blue.js
﹂janet.js
﹂sadie.js
﹂index.js
app.js
```
* blue.js
```javascript=
module.exports = {
  name: "blue",
  color: "grey"
}
```
* janet.js
```javascript=
module.exports = {
  name: "janet",
  color: "orange"
}
```
* sadie.js
```javascript=
module.exports = {
  name: "sadie",
  color: "black"
}
```
* index.js
```javascript=
const blue = require("./blue");
const janet = require("./janet");
const sadie = require("./sadie");

const allCats = [blue, janet, sadie];
module.exports = allCats;
```
* app.js
```javascript=
const cats = require("./shelter")

console.log("Require an entire directory!", cats)
```
* 執行 / 結果
執行app.js，會連結到shelter這個資料夾，接著程式會去尋找shelter資料夾中是否有對應的module.exports。
```
> node app.js
Require an entire directory! [
  { name: 'blue', color: 'grey' },
  { name: 'janet', color: 'orange' },
  { name: 'sadie', color: 'black' }
]
```

## 3. NPM：Installing Packages - Jokes & Rainbow
> [npm 不同可下載之package](https://www.npmjs.com/)

****
==問題==
npm install後，資料夾是空的。
==解決==
先打npm init即可。
![](https://i.imgur.com/nugA4DC.jpg)

* 用到的模組：
    1. [give me a joke](https://www.npmjs.com/package/give-me-a-joke)
    2. [colors](https://www.npmjs.com/package/colors)

## 4. Adding global package
==問題==
當使用npm install -g `<package>`時，會看到error
==解決==
> 參考網址：
> 1. [NPM - 解決套件全域安裝錯誤 Missing write access（Mac ）](https://dotblogs.com.tw/explooosion/2020/07/18/105744)
> 2. [How to fix the "Missing write access" error when using npm](https://flaviocopes.com/npm-fix-missing-write-access-error/)

==問題==
不過還是出現錯誤
![](https://i.imgur.com/jpvpvh2.png)


==解決==
解決方法是npm install -g `<package>`前方加上sudo：

```
sudo npm install -g <package>
```
![](https://i.imgur.com/m0Nd5ND.png)

## 5. The all important package json
首先可以先打以下指令：
```
npm init
```
在打入 NPM init 後，會被要求輸入幾個欄位，結束後，你可以看到這個資料夾底下，新增了一個 Package.json。
> 參考網址：[史上最強套件管理 - NPM ， npm init 與 npm install (Day11)](https://ithelp.ithome.com.tw/articles/10191682)

## 6. Installing All Dependencies For A Project
==問題==
假如要從別人的github上下載專案下來，你可以先發現他裡面的package.json是有載入其他模組的，但裡面卻沒有附加node_module這檔案。

> 這裡以此檔案為例：[node-group-chat](https://github.com/dkhd/node-group-chat)
> 
==解決==
當然可以看著他的package.json裡有載入什麼模組，一個一個去npm install下來，不過不只很麻煩之外，還可能載到不同版本的模組。

所以其實只要在terminal中輸入以下指令：
```
npm install
```
他就會自動把package.json中有的模組全部一次下載下來。

## 7. Language Guesser Challenge
> 模組：
> 1. [franc](https://github.com/wooorm/franc)
> 2. [langs](https://github.com/adlawson/nodejs-langs)

==問題==
nodejs版本太舊，以至於無法使用刻意下載的模組
==解決==
> 參考網址：[Linux作業系統如何安裝最新或是指定版本的Node.js？](https://magiclen.org/linux-install-nodejs/)

利用n-install

==問題==
執行import {franc, francAll} from 'franc'時，node.js出了以下問題：
![](https://i.imgur.com/Z050TS4.png)
SyntaxError：Cannot use import statement outside a module
==解決==
> 參考網址：[Node.js SyntaxError：Cannot use import statement outside a module](https://blog.twtnn.com/2021/05/nodejs-syntaxerrorcannot-use-import.html)

修改package.json，增加語法：
```javascript=
"type": "module"
```
![](https://i.imgur.com/cYBQEUX.png)

==問題==
什麼是process.argv?
==解決==
用於在命令行中運行時獲取傳遞給node.js流程的參數
> 參考網址：[node.js process.argv用法及代碼示例](https://vimsky.com/zh-tw/examples/usage/node-js-process-argv-property.html)