# 編寫Nodejs模塊?
nodejs的出現,可以算是前端里程碑式的一個事件,它讓前端攻城獅們擺脫了瀏覽器的束縛,踏上了一個更加寬廣的舞臺。前端的可能性,從此更加具有想象空間。
隨著一系列基于nodes的應用/工具的出現,工作中與nodejs打交道的機會越來越多。無論在node應用的開發,還是使用中,包管理都扮演著一個很重要的作用。NPM(node package manager),作為node的包管理工具,極大地便利了我們的開發工作,很有必要了解一下。
## 什么是Npm?
[https://www.npmjs.com/](https://www.npmjs.com/)
npm is the package manager for
* browsers
* javascript
* nodejs
* io.js
* mobile
* bower
* docpad
* test
簡單理解:NPM(node package manager),通常稱為node包管理器。顧名思義,它的主要功能就是管理node包,包括:安裝、卸載、更新、查看、搜索、發布等。
它可不只是nodejs package manager,可見其定位是很廣的,這從側面也佐證了大前端和node全棧的機會。
以前nodejs吹牛都是那異步說事兒,現在都是拿生態說事兒
這話不錯,在09年談異步,很多語言都很弱,但事情要以發展的眼光看,現在很多語言都支持了,而且性能還不錯,所以才顯得nodejs性能沒那么突出
但是,nodejs的性能依然是很棒的
現在來說npm這事兒,它確實很牛逼

* 共計230,792個包
* 昨日下載量46,065,663
* 上周下載量761,014,696
* 上月下載量2,729,222,496
是不是看著挺可觀的?
npm官網:?[https://npmjs.org/](https://npmjs.org/)
npm官方文檔:?[https://npmjs.org/doc/README.html](https://npmjs.org/doc/README.html)
我們需要了解什么
* npm的安裝、卸載、升級、配置
* npm的使用:package的安裝、卸載、升級、查看、搜索、發布
* npm包的安裝模式:本地 vs 全局
* package.json:包描述信息
* package版本:常見版本聲明形式
* 如何編寫nodejs模塊
## npm上面都有哪些包
下面我們再看看它上面都有哪些包
* browserify browser-side require() the node way 10.2.6 published 7 months ago by substack
* grunt-cli The grunt command line interface. 0.1.13 published 2 years ago by tkellen
* bower The browser package manager 1.4.1 published 10 months ago by sheerun
* gulp The streaming build system 3.9.0 published 8 months ago by phated
* grunt The JavaScript Task Runner 0.4.5 published 2 years ago by cowboy
* express Fast, unopinionated, minimalist web framework 4.13.1 published 7 months ago by dougwilson
* npm a package manager for JavaScript 2.13.0 published 7 months ago by zkat
* cordova Cordova command line interface tool 5.1.1 published 8 months ago by stevegill
* forever A simple CLI tool for ensuring that a given node script runs continuously (i.e. forever) 0.14.2 published 7 months ago by indexzero
* less Leaner CSS 2.5.1 published 8 months ago by agatronic
* pm2 Production process manager for Node.JS applications with a built-in load balancer. 0.14.3 published 7 months ago by jshkurti
* karma Spectacular Test Runner for JavaScript. 0.13.1 published 6 months ago by dignifiedquire
* coffee-script Unfancy JavaScript 1.9.3 published 8 months ago by jashkenas
* statsd A simple, lightweight network daemon to collect metrics over UDP 0.7.2 published a year ago by pkhzzrd
* yo CLI tool for running Yeoman generators 1.4.7 published 8 months ago by sindresorhus
可以說nodejs能做的所有的事兒基本上都有體現,所有著名的項目也都是以npm形式發布的。所以很大程度上講,nodejs里的node module 和npm是一樣的。
這就是生態,你想要什么,就去npmjs上搜一下,基本都會有,如果沒有也沒關系,js這么簡單,自己寫一個npm也是分分鐘的事兒。(后面會講哦)
不管你是做后臺開發,還是開發前端工具,npm都是非常重要的。甚至作為sa(system admin)都需要會npm。
總結一下為啥必須學npm
* 開發簡單
* 模塊豐富
* 與c、c++等語言集成方便
* 干啥都用的到
我講nodejs課的時候,總結安裝nodejs的3m安裝大法
* nvm (Node version manager)
* npm (package manager for node, react, bower, angualr, ...)
* nrm (NPM registry manager)
其中npm和nrm都是關于npm的,可見其重要程度。
## nrm
下面內容在coding.com上演示
~~~
npm install -g nrm
~~~
~~~
nrm test
~~~
~~~
nrm use
~~~
~~~
nrm ls
~~~
## 當心npm版本
npm2和3是不一樣的
3是扁平化管理,和2不是完全兼容,會有莫名其妙的一些問題
再有就是npm2.9之后才支持私有模塊
再有就是使用nrm切換到其他源上,導致npm無法發布
# 如何編寫Nodejs命令行模塊?
腳手架的原理和生成代碼都已經有了,可是如何在命令行工具里
上面給出的很多都是nodejs寫的小工具模塊,nodejs和npm的種種好處,使得nodejs開發命令行模塊異常簡單
先說一下node module的作用
* 封裝常見類庫
* 命令行工具
nodejs這幾年之所以如此快的崛起,就是因為模塊編寫簡單,npm無比強大
npm是nodejs最好的東西,常用分類
* 1)命令行工具
* 比如express-generator
* 比如gulp 和grunt
* 2)shell相關
* 比如kp:根據端口殺死進程
* 比如mongo-here:啟動mongodb的簡化寫法
* 3)本地服務器
* 比如je
* 比如hade
用起來非常方便,雖然有在線的,但網絡是一個障礙 尤其沒網的時候就不能用,非常郁悶
具體做法
無論如何,它都值得你一學的
下面看一下如何編寫nodejs命令行模塊
## 創建git repo
github上創建即可
## git clone到本地
~~~
git clone git@github.com:i5ting/node-cli-demo.git
~~~
## 切換到項目目錄
~~~
cd node-cli-demo
~~~
## 初始化npm
使用npm命令,初始化npm的配置文件package.json
執行
~~~
npm init
~~~
一直回車,除非你真的有東西想改動,具體如下
~~~
? node-cli-demo git:(master) npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sane defaults.
See `npm help json` for definitive documentation on these fields
and exactly what they do.
Use `npm install <pkg> --save` afterwards to install a package and
save it as a dependency in the package.json file.
Press ^C at any time to quit.
name: (node-cli-demo)
version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository: (https://github.com/i5ting/node-cli-demo.git)
keywords:
author:
license: (ISC)
About to write to /Users/sang/workspace/github/node-cli-demo/package.json:
{
"name": "node-cli-demo",
"version": "1.0.0",
"description": "node-cli-demo =============",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "https://github.com/i5ting/node-cli-demo.git"
},
"author": "",
"license": "ISC",
"bugs": {
"url": "https://github.com/i5ting/node-cli-demo/issues"
},
"homepage": "https://github.com/i5ting/node-cli-demo"
}
Is this ok? (yes)
? node-cli-demo git:(master) ?
~~~
## 創建文件
~~~
mkdir bin
mkdir test
touch bin/node-cli-demo.js
touch test/node-cli-demo.js
touch index.js
touch gulpfile.js
~~~
bin是可執行文件
test是放測試文件的目錄
lib是模塊的核心代碼目錄,一般是index.js找lib/xxx.js
~~~
#!/usr/bin/env node
console.log('hello node module')
~~~
## 修改package.json
### 命令配置(至關重要)
~~~
"preferGlobal": "true",
"bin": {
"badge": "bin/badge.js"
},
~~~
此處是關鍵
`preferGlobal`確定你的這個命令是不是全局的,一定要設置為true,不然不放到path里,不能全局用的。
`bin`是配置你的cli名稱和具體哪個文件來執行這個的
### scripts
~~~
"scripts": {
"start": "npm publish .",
"test": " node bin/badge.js -t js -n q "
},
~~~
這里定義了2個命令
* `npm start`
這里我用它發布當前npm到npmjs.org上
* `npm test`
這里我用它作為測試代碼,避免每次都重復輸入
## 發布
發布之前要注冊npmjs賬戶的
~~~
npm login(只需要一次,以后就不用了)
npm start
~~~
當然更多的時候,我們看到的命令是這樣
~~~
? vsc-doc git:(master) ? cp --help
cp: illegal option -- -
usage: cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file target_file
cp [-R [-H | -L | -P]] [
~~~
## 更多
推薦幾個解析命令行args的庫
* commander是tj寫的,一個不錯的庫,目前用的最多的庫
* yargs也不錯,更強大,簡潔,官方推薦
* ccli是我寫的,封裝了yargs和基本常用的庫(還不完善,湊合用)
還有私有模塊
- 前言
- 1 skill
- 1.1 Coding WebIDE
- 1.2 git
- 1.3 extra practice
- 1.4 預習
- 2 nodejs入門
- 2.1 入門
- 2.2 安裝
- 2.3 helloworld
- 2.4 commonJS規范
- 2.5 模塊導出
- 2.6 Nodejs代碼調試
- 2.7 編寫Nodejs模塊
- 2.8 最小化問題
- 2.9 隨堂練習
- 3 異步流程控制
- 3.1 什么時候會用到異步流程控制
- 3.2 簡單做法async模塊
- 3.3 Promise/a+規范
- 3.4 Node.js Promise/a+實現
- 3.5 生成器Generators/yield
- 3.6 Async函數/Await
- 3.7 神奇的co
- 3.8 5種 yieldable
- 3.9 學習重點
- 3.10 隨堂練習
- 4 express和微信開發入門
- 4.1 入門
- 4.2 connect
- 4.3 靜態Http服務器
- 4.4 那些預處理器
- 4.5 路由
- 4.6 視圖與模塊引擎
- 4.7 中間件
- 4.8 更多實踐
- 4.9 微信入門
- 4.10 隨堂練習:完成登錄、注冊功能
- 5 微信實例與H5實踐
- 5.1 微信基礎和sandbox
- 5.2 公眾號菜單和自動回復
- 5.3 微信OAuth用戶授權
- 5.4 微信分享
- 5.5 wechat-api
- 5.6 H5-上篇
- 5.7 H5-下篇
- 5.8 隨堂練習
- 6 weui實戰
- 6.1 使用bower
- 6.2 移動端抽象
- 6.3 優化滑動列表
- 6.4 weui
- 6.5 讓weui和iscroll結婚
- 6.6 優化事件
- 6.7 how-to-write-h5
- 6.8 優化無止境
- 6.9 隨堂練習
- 7 微信支付
- 7.1 吹個牛
- 7.2 支付概述
- 7.3 科普幾個概念
- 7.4 準備
- 7.5 調試
- 7.6 公眾號支付(JSAPI)
- 7.7 對賬單
- 7.8 數據處理
- 7.9 隨堂練習
- 8 項目實戰《付費課程系統MVP》
- 8.1 需求分析
- 8.2 ui/ue
- 8.3 技術棧
- 8.4 模型
- 8.5 靜態api
- 8.6 開發
- 8.7 部署
- 8.8 監控
- 8.9 數據統計
- 8.10 demo
- 9 高級篇
- 9.1 前后端分離實踐?
- 9.2 如何展望未來的大前端
- 9.3 容器和微服務
- 10 答疑問題收集