# 包
* 包(Package)是 Node.js 最重要的支柱。
* Node.js 根據 CommonJS 規范實現了包機制,但不完全遵循。
* 包是在模塊基礎上更深一步的抽象,Node.js 的包類似于 C/C++ 的函數庫或者 Java/.Net 的類庫。它將某個獨立的功能封裝起來,用于發布、更新、依賴管理和版本控制。
* 開發中使用 npm 來解決包的發布和獲取需求。Node.js package manager
# 包規范
## CommonJS 包規范和 Node.js 包實現
CommonJS 規范的包應該具備以下特征:
* package.json 必須在包的頂層目錄下;
* 二進制文件應該在 bin 目錄下;
* JavaScript 代碼應該在 lib 目錄下;
* 文檔應該在 doc 目錄下;
* 單元測試應該在 test 目錄下。
Node.js 對包的要求并沒有這么嚴格,要求如下:
* 包是一個目錄,其中包含一個 JSON 格式的包說明文件 package.json;
* 但為了提高兼容性,建議在制作包的時候,嚴格遵守 CommonJS 規范。
Node.js 在調用某個包時,會首先檢查包中 package.json 文件的 main 字段,將其作為包的接口模塊,如果 package.json 或 main 字段不存在,會嘗試尋找 index.js 或 index.node 作為包的接口。
## package.json
package.json 是 CommonJS 規定的用來描述包的文件,完全符合規范的 package.json 文件應該含有以下字段。
* name :包的名稱,必須是唯一的,由小寫英文字母、數字和下劃線組成,不能包含空格。
* description :包的簡要說明。
* version :符合語義化版本識別規范的版本字符串。
* keywords :關鍵字數組,通常用于搜索。
* maintainers :維護者數組,每個元素要包含 name、email(可選)、web (可選)字段。
* contributors :貢獻者數組,格式與 maintainers 相同。包的作者應該是貢獻者數組的第一個元素。
* bugs :提交 bug 的地址,可以是網址或者電子郵件地址。
* licenses :許可證數組,每個元素要包含 type(許可證的名稱)和 url(鏈接到許可證文本的地址)字段。
* repositories : 倉庫托管地址數組,每個元素要包含 type(倉庫的類型,如 git )
* url(倉庫的地址)和 path(相對于倉庫的路徑,可選)字段。
* dependencies :生成環境包的依賴,一個關聯數組,由包名稱和版本號組成。
* devDependencies:開發環境包的依賴,一個關聯數組,由包的名稱和版本號組成。
# npm
npm 是 Node.js 官方提供的包管理工具,它已經成了 Node.js 包的標準發布平臺。用于 Node.js 包的發布、傳播、依賴控制。npm 提供了命令行工具,使你可以方便地下載、安裝、升級、刪除包,也可以讓你作為開發者發布并維護包。常用的引用場景:
* 開發者從 npm 服務器下載別人編寫的第三方包到本地使用。
* 開發者從 npm 服務器下載并安裝別人編寫的命令行程序到本地使用。
* 開發者將自己編寫的包或命令行程序上傳到 npm 服務器供別人使用。
在安裝 Node.js 的時候已一并安裝了,不需要額外安裝。
## 使用 nmp 被墻問題
使用 npm 安裝包時候,其會到 [npm 包網站](https://www.npmjs.com/)下載依賴,但有這個網站是國外,在下載依賴的時候會很慢或是下載失敗。
* 配置淘寶鏡像,淘寶 NPM 鏡像,與官方 npm 的同步頻率目前為 10 分鐘一次。[官方網站](http://npm.taobao.org/)
~~~
npm config set registry=https://registry.npm.taobao.org
~~~
* 安裝 cnpm,安裝完之后使用 cnpm 來操作。
~~~
npm install -g cnpm –registry=https://registry.npm.taobao.org
~~~
## 包的相關命令
* 安裝包命令:`npm install [-g] 包名[@版本號] [-D]`
* 帶有 -g,表示全局安裝,安裝到 Node.js 根據目錄 node\_modules 文件夾中,用于命令行下使用,不帶有 -g 表示本地安裝,安裝到當前項目中 node\_modules 文件夾中,并修改 package.json 中包依賴配置,用于當前項目用開發使用。
* 沒有帶版本號的話安裝的是最新版本,帶了版本號安裝指定版本。
* 不帶 -D 表示生產環境的包依賴,帶了 -D 表示開發環境的包依賴。
* 查看包命令:`npm list [-g] [包名]`
* 帶有 -g,表示全局查看,不帶有 -g 表示本地查看。
* 帶有包名表示查看特定包,不帶有包名表示查看所有包。
* 更新包命令:`npm update [-g] [包名][@版本號]`
* 帶有 -g,表示全局更新,不帶有 -g 表示本地更新。
* 帶有包名表示更新特定包,不帶有包名表示更新所有包。
* 沒有帶版本號的話更新到最新版本,帶了版本好更新到指定的版本。
* 卸載包命令:`npm uninstall [-g] 包名`
* 帶有 -g,表示全局卸載,不帶有 -g 表示本地卸載。
## 全局包操作
~~~
npm install -g es-checker ? // 安裝檢測 Node.js 對 ES6 工具
es-checker ? ? ? ? ? ? ? ? // 在命令行輸入這命令就可以查看
?
npm list -g es-checker ? ? // 查看 es-checker 包
npm list -g ? ? ? ? ? ? ? ? // 查看所有的包
npm update -g es-checker ? // 更新 es-checker 包
npm uninstall -g es-checker // 卸載 es-checker 包
~~~
## 本地包操作
### 創建包
* 首先建一個文件夾,例如 somepackage。
* 在這目錄里打開 Windows 命令行(終端)
* 輸入命令 `npm init` 即可,根據提示輸入,作為 package.json 文件的內容。
* 若想生成 package.json 內容都使用默認值,那么輸入命令 `npm init -y` 按回車即可。
* 命令執行完之后,在 somepackage 目錄出現 package.json 文件。
* 自己手動在 somepackage 中新建一個 index.js 文件。
* 運行此包:
* `node .` 執行當前項目 packjson 中 main 指向的 JavaScript 文件。
* `npm run test` 執行的是 scripts 中 test 字段對應命令。
### 安裝包,更新包,卸載包
~~~
npm install ejs
npm update ejs
npm list ejs
npm uninstall ejs
~~~
### 使用包
參考官方文檔,在當前項目中,新建兩個文件寫好下面的代碼,之后在命令行運行 node index.js 就可以看到效果。
```
// index.js
const ejs = require('ejs');
people = ['geddy', 'neil', 'alex'];
html = ejs.render('<%= people.join(", "); %>', {people: people});
console.log(html);
```
- NodeJs
- 01-萬維網
- 02-CS 架構 VS BS 架構
- 03-Web 服務器訪問流程
- 04-url
- 05-網絡傳輸協議
- 06-HTTP 協議
- 07-報文
- 08-命令行界面
- 09-什么是 Node.js
- 10-環境安裝及配置
- 11-JavaScript 代碼運行環境
- 12-全局對象
- 13-Buffer
- 14-模塊化
- 15-EventEmitter
- 16-path模塊
- 17-流式操作
- 18-包
- 19-模板技術
- 20-ejs入門
- 21-express
- 01-什么是express
- 02-Hellow Express
- 03-靜態資源服務
- 04-路由
- 05-模塊化路由處理程序
- 06-中間件
- 07-手動實現中間件
- 08-常用內置中間件和第三方中間件
- 09-響應
- 10-獲取請求參數
- 11-Express 中使用模板引擎
- 22-web存儲與安全
- 01-cookie
- 02-sessionStorage
- 03-localStorage
- 04-base64
- 05-https
- 06-同源策略