编写Nodejs模块?

nodejs的出现,可以算是前端里程碑式的一个事件,它让前端攻城狮们摆脱了浏览器的束缚,踏上了一个更加宽广的舞台。前端的可能性,从此更加具有想象空间。

随着一系列基于nodes的应用/工具的出现,工作中与nodejs打交道的机会越来越多。无论在node应用的开发,还是使用中,包管理都扮演着一个很重要的作用。NPM(node package manager),作为node的包管理工具,极大地便利了我们的开发工作,很有必要了解一下。

什么是Npm?

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这事儿,它确实很牛逼

编写Node.js模块 - 图1

  • 共计230,792个包
  • 昨日下载量46,065,663
  • 上周下载量761,014,696
  • 上月下载量2,729,222,496

是不是看着挺可观的?

npm官网: https://npmjs.org/

npm官方文档: 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上演示

  1. npm install -g nrm
  1. nrm test
  1. nrm use
  1. 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到本地

  1. git clone git@github.com:i5ting/node-cli-demo.git

切换到项目目录

  1. cd node-cli-demo

初始化npm

使用npm命令,初始化npm的配置文件package.json

执行

  1. npm init

一直回车,除非你真的有东西想改动,具体如下

  1. node-cli-demo git:(master) npm init
  2. This utility will walk you through creating a package.json file.
  3. It only covers the most common items, and tries to guess sane defaults.
  4. See `npm help json` for definitive documentation on these fields
  5. and exactly what they do.
  6. Use `npm install <pkg> --save` afterwards to install a package and
  7. save it as a dependency in the package.json file.
  8. Press ^C at any time to quit.
  9. name: (node-cli-demo)
  10. version: (1.0.0)
  11. description:
  12. entry point: (index.js)
  13. test command:
  14. git repository: (https://github.com/i5ting/node-cli-demo.git)
  15. keywords:
  16. author:
  17. license: (ISC)
  18. About to write to /Users/sang/workspace/github/node-cli-demo/package.json:
  19. {
  20. "name": "node-cli-demo",
  21. "version": "1.0.0",
  22. "description": "node-cli-demo =============",
  23. "main": "index.js",
  24. "scripts": {
  25. "test": "echo \"Error: no test specified\" && exit 1"
  26. },
  27. "repository": {
  28. "type": "git",
  29. "url": "https://github.com/i5ting/node-cli-demo.git"
  30. },
  31. "author": "",
  32. "license": "ISC",
  33. "bugs": {
  34. "url": "https://github.com/i5ting/node-cli-demo/issues"
  35. },
  36. "homepage": "https://github.com/i5ting/node-cli-demo"
  37. }
  38. Is this ok? (yes)
  39. node-cli-demo git:(master)

创建文件

  1. mkdir bin
  2. mkdir test
  3. touch bin/node-cli-demo.js
  4. touch test/node-cli-demo.js
  5. touch index.js
  6. touch gulpfile.js

bin是可执行文件

test是放测试文件的目录

lib是模块的核心代码目录,一般是index.js找lib/xxx.js

  1. #!/usr/bin/env node
  2. console.log('hello node module')

修改package.json

命令配置(至关重要)

  1. "preferGlobal": "true",
  2. "bin": {
  3. "badge": "bin/badge.js"
  4. },

此处是关键

preferGlobal确定你的这个命令是不是全局的,一定要设置为true,不然不放到path里,不能全局用的。

bin是配置你的cli名称和具体哪个文件来执行这个的

scripts

  1. "scripts": {
  2. "start": "npm publish .",
  3. "test": " node bin/badge.js -t js -n q "
  4. },

这里定义了2个命令

  • npm start

这里我用它发布当前npm到npmjs.org上

  • npm test

这里我用它作为测试代码,避免每次都重复输入

发布

发布之前要注册npmjs账户的

  1. npm login(只需要一次,以后就不用了)
  2. npm start

当然更多的时候,我们看到的命令是这样

  1. vsc-doc git:(master) cp --help
  2. cp: illegal option -- -
  3. usage: cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file target_file
  4. cp [-R [-H | -L | -P]] [

更多

推荐几个解析命令行args的库

  • commander是tj写的,一个不错的库,目前用的最多的库
  • yargs也不错,更强大,简洁,官方推荐
  • ccli是我写的,封装了yargs和基本常用的库(还不完善,凑合用)

还有私有模块