extra practice

使用oh-my-zsh

安装步骤

  • 先安装zsh
  • 安装oh-my-zsh

以后环境变量在~/.zshrc里

alias

俗称别名,是一个linux命令

举例:在git里面我们最常用的命令是查看状态,可以又太长

于是

  1. vi ~/.zshrc

增加如下别名定义

  1. alias gs='git status'

source使环境变量生效(如果不想重启电脑的话)

  1. source ~/.zshrc

如果不理解环境变量,自己去闭门思过去

它的作用是让长命令变短

有个经典说法:“演进就应该像女生的裙子”

杀死所有nodejs相关进程

天天写nodejs的都有这个痛苦,起了太多实例,分不清哪个是哪个

索性都干掉吧

  1. ps -ef|grep node|awk '{print $2}'|xargs kill -9

这是非常经典的一条命令

说明

  • ps -ef查看进程
  • grep node是过滤进程里的和node相关的所有进程
  • awk ‘{print $2}’ 取出进程号
  • xargs kill -9 杀掉该进程

|是pipe,即管道的意思:上一个的输出,是下一个的输入

nodejs里stream和pipe是一样的概念

如此理解变掌握了shell的精髓

“上一个的输出,是下一个的输入,组合着用”

每一个命令把它写到极致

这是unix的哲学

命令行查找代码

ack是一个perl脚本,是grep的一个可选替换品。其可以对匹配字符有高亮显示。是为程序员专门设计的,默认递归搜索,省提供多种文件类型供选。

http://beyondgrep.com/install/

Ubuntu

  • Package “ack-grep”

Mac

  • brew install ack

mac下面直接用,linux记得自己alias一下

检索文本内的key是非常高效的

  1. vsc-doc git:(master) ack i5ting
  2. extra.md
  3. 72:https://github.com/i5ting/awesome-mac-practice2/blob/master/app/Dash.zip?raw=true
  4. preview/index.html
  5. 434:<li><a href="http://i5ting.github.io/nodejs-video/node-inspector.mov">node-inspector视频</a></li>
  6. 435:<li><a href="http://i5ting.github.io/nodejs-video/node-debug.mov">node-debug视频</a></li>
  7. 525:<p>这其实和<a href="http://i5ting.github.io/How-to-write-jQuery-plugin/build/jquery.plugin.html#10501">jquery插件里的配置项</a>原理是类似的</p>
  8. 1307:<p>详见 http://i5ting.github.io/vsc-course/ </p>
  9. preview/README.html
  10. 434:<li><a href="http://i5ting.github.io/nodejs-video/node-inspector.mov">node-inspector视频</a></li>
  11. 435:<li><a href="http://i5ting.github.io/nodejs-video/node-debug.mov">node-debug视频</a></li>
  12. 525:<p>这其实和<a href="http://i5ting.github.io/How-to-write-jQuery-plugin/build/jquery.plugin.html#10501">jquery插件里的配置项</a>原理是类似的</p>
  13. 1307:<p>详见 http://i5ting.github.io/vsc-course/ </p>
  14. preview/toc/js/ztree_toc.js
  15. 2:* https://github.com/i5ting/jQuery.zTree_Toc.js
  16. README.md
  17. 313:- [node-inspector视频](http://i5ting.github.io/nodejs-video/node-inspector.mov)
  18. 314:- [node-debug视频](http://i5ting.github.io/nodejs-video/node-debug.mov)
  19. 427:这其实和[jquery插件里的配置项](http://i5ting.github.io/How-to-write-jQuery-plugin/build/jquery.plugin.html#10501)原理是类似的
  20. 1266:详见 http://i5ting.github.io/vsc-course/

这其实就是全文检索

其实go写的fzf也很棒

这个命令非常非常常用,尤其是阅读源码,或者特别复杂的项目里

查询文档神器

有很多doc在dash(mac)里默认是没有的;

see here : http://kapeli.com/docset_links

如果是下载到本地的docset,放到zealdocs目录下面,需要重启zeal

  • linux 叫zeal
  • mac 叫dash

都是基于docset的神器

本地文档的好处是,尽量少依赖网络,没有网也能干活,这是本事

培养自己的独立思考能力,而不是acv的庸才

目录切换神器

autojump是一个命令行工具,它允许你可以直接跳转到你喜爱的目录,而不用管你现在身在何处。

https://github.com/wting/autojump

Linux

  1. sudo apt-get install autojump

Mac os

  1. brew install autojump

需要修改~/.zshrc里的plugin,修改为

  1. plugins=(git autojump)

然后

  1. source ~/.zshrc

至此,已经完成了安装。

此后cd到任意目录,以后就可以使用j这个直达到某个目录了,下面是示例:

  1. nodejs-newbie git:(master) cd ~/workspace/github/nodejs-newbie
  2. nodejs-newbie git:(master) cd ~
  3. ~ j nodejs-n
  4. /Users/sang/workspace/github/nodejs-newbie
  5. nodejs-newbie git:(master)

这样就会跳到上一次cd进去的目录,是不是非常方便?

我本地有非常多的github上的项目,彼此依赖,就采用这种方式切换,省了不少脑细胞

如果想玩的更high,可以参见https://github.com/clvv/fasd

根据端口号查看进程

nodejs写web程序,都要起一个端口,反复打开,关闭,就难免有僵尸进程,怎么也杀不掉

只知道端口如何查看进程呢?

lsof是系统管理/安全的工具,列出打开文件(lists openfiles)

  1. $ lsof -i:3005
  2. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  3. node 30438 sang 26u IPv6 0xd9428cd06d17f6af 0t0 TCP *:geniuslm (LISTEN

3005是端口号

于是衍生一下,根据端口杀进程,比如express默认是3000端口,难免有时有僵尸进程,如果直接根据端口杀死,是不是很爽?

  1. lsof -i:3005|xargs killall

全干掉,想不死都不行

再衍生一下,能不能封装成一个nodejs模块,端口号作为参数,完成上述功能呢?

于是有了kp

kp is a tool for kill process by server port

我写的一个模块,上面就是原理,下面说一下用法

  1. [sudo]npm install -g kp
  2. kp 3002

https://github.com/i5ting/kp

是不是简单实用呢?

mongodb客户端

推荐 www.robomongo.org

  • 支持win
  • 支持linux
  • 支持mac(mac10.10下中文乱码,需要robomongo v0.8.5+)

这个是最好用的,但是每次启动都比较麻烦

  • mac下面使用quicksilver或spotlit
  • linux使用alias rogo=’robomongo’

别名alias,有用吧,得学会偷懒

使用node-inspector调试Node代码

上面讲了vsc调试nodejs,可是如果你想了解更深的原理

看我写的三法三例调试教程

https://cnodejs.org/topic/5463f6e872f405c829029f7e

使用mongoose-cli数据库建模

随时随地,测试model,融合bluebird等promise库,让业务处理更简单

https://cnodejs.org/topic/55c44f0db98f51142b367b54

mongo here

如果你同时有多个项目,它们有不同的mongodb,你会哭的,而且又是启动有特别容易出问题

mongo here就是解决这个问题的

当前目录启动mongodb

在新建目录执行

  1. mh

它会创建tmp目录,然后日志,数据都放到tmp里。

全局启动mongodb

  1. mhg

它会创建~/mongo/目录,当前用户下起mongo服务,即用户下全局共享

https://github.com/i5ting/mongo-here

核心原理很简单,写个shell脚本,执行命令mh的时候执行它就好了

  1. #! /bin/bash
  2. mkdir -p tmp/db
  3. mkdir -p tmp/pids
  4. mkdir -p tmp/logs
  5. # remove lock file
  6. [ -f tmp/db/mongod.lock ] && rm -rf tmp/db/mongod.lock
  7. touch tmp/pids/mongodb.pid
  8. # mongod --bind_ip 192.168.1.100 --port 27017 --dbpath tmp/db --logpath tmp/logs/mongodb.log --pidfilepath tmp/pids/mongodb.pid
  9. nohup mongod --bind_ip 127.0.0.1 --port 27017 --dbpath tmp/db --logpath tmp/logs/mongodb.log --pidfilepath tmp/pids/mongodb.pid >mongod.log 2>&1 &

此处是在当前目录下面建立tmp目录,所以保证了权限等问题

mhg其实更简单,就是在用户主目录~下建

懂shell就是好,可以干很多坏事儿,是不是?

json editor

我平常经常api,大部分api都是返回json字符串,结构看起来特别恶心

那能不能可视化呢?

  1. [sudo] npm install -g je
  2. je

详见https://github.com/i5ting/je

nodejs里的csv处理

  1. [sudo] npm install -g j2csv
  2. json2csv

详见https://github.com/i5ting/json2csv

上面给出的方案适合3000条以内的数据,受限于浏览器

更大量的数据,需要

  1. [sudo] npm install -g ej
  2. ej input.json output.csv

https://github.com/i5ting/ej

很多时候,实现导入导出,见

https://github.com/i5ting/i-csv

upload-cli

服务器上有些上传、删除的工作,ssh进去之后,操作太麻烦了

于是写了upload-cli :a node cli tools for uploads ui

https://github.com/i5ting/upload-cli

  • 目前已经支持通过命令行uci上传,可指定host

编写markdown文档

大部分人都有的需求

  • 生成markdown模块
  • markdown编译成html
  • 支持table of content
  • 能够push到git pages上

为了markdown toc,我写了https://github.com/i5ting/i5ting_ztree_toc

然后写了一个nodejs模块https://github.com/i5ting/tocmd.npm,用于编译markdown,按照toc模板编译

当然,每次发布到gitpages,我很不爽,于是使用gulp里的gulp-gh-pages直接自动化

最后我想更懒点

于是就有了https://github.com/i5ting/docto

一条命令全部搞定

如何编写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

!/usr/bin/env node

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账户的

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和基本常用的库

还有私有模块

如何快速阅读源码?

学习5阶段

  • getting start 入门
  • guide 指南
  • doc 查api
  • 阅读源码
  • 向开源贡献代码

你该阅读源码?

上面已经说了,第四个阶段才是读源码

原因是,必须熟练才有用,不然读了也白扯

  • 熟练使用该模块
  • 熟练掌握npm
  • 熟练掌握nodejs语法

有了这个前提你就可以阅读了。

当然事情也不能绝对,没这些,你也可以看,从中找出有用的写法或者学习代码规范也是好的。

看目录结构(express框架)

  1. express git:(master) tree . -L 2
  2. .
  3. ├── History.md
  4. ├── LICENSE
  5. ├── Readme.md
  6. ├── index.js
  7. ├── lib
  8. ├── application.js
  9. ├── express.js
  10. ├── middleware
  11. ├── request.js
  12. ├── response.js
  13. ├── router
  14. ├── utils.js
  15. └── view.js
  16. ├── node_modules
  17. ├── accepts
  18. ├── array-flatten
  19. ├── content-disposition
  20. ├── content-type
  21. ├── cookie
  22. ├── cookie-signature
  23. ├── debug
  24. ├── depd
  25. ├── escape-html
  26. ├── etag
  27. ├── finalhandler
  28. ├── fresh
  29. ├── merge-descriptors
  30. ├── methods
  31. ├── on-finished
  32. ├── parseurl
  33. ├── path-to-regexp
  34. ├── proxy-addr
  35. ├── qs
  36. ├── range-parser
  37. ├── send
  38. ├── serve-static
  39. ├── type-is
  40. ├── utils-merge
  41. └── vary
  42. └── package.json
  43. 29 directories, 11 files

package.json

这是一个npm模块

  • dependencies
  • devDependencies
  • scripts
  • bin
  • main
  • repository
  • license
  • homepage

体会细节的差异

node_modules

放的是当前模块依赖的其他模块

index.js

npm有一个约定,如果你的项目主文件是index.js可以不在package.json里写明,如果是其他文件就必须写清楚

比如shelljs里的

  1. "main": "./shell.js",

好了,我们继续看express的package.json,他没有定义main文件,那我们就找index.js

程序入口

  1. /*!
  2. * express
  3. * Copyright(c) 2009-2013 TJ Holowaychuk
  4. * Copyright(c) 2013 Roman Shtylman
  5. * Copyright(c) 2014-2015 Douglas Christopher Wilson
  6. * MIT Licensed
  7. */
  8. 'use strict';
  9. module.exports = require('./lib/express');

lib

从index.js可知,里面的功能都写在了lib里,也就是说,这里才是最重要的战场

其他

  1. ├── Readme.md 最重要的文档
  2. ├── History.md 一般是更新历史
  3. ├── LICENSE 授权协议

类似的文件写的都比较清楚,需要的时候再看不急

建立大局观

大局观有2种

  • 目录结构,npm,约定等,属于常识类
  • 代码大局观

先大致看一遍,花个个把小时,一定要都看了,不求看懂,但求不放过每一个文件

这就好比买书一样,如果头一周么有看完,这辈子这边书看完的可能性就很渺小了

模块阅读

  • 根据头3步骤(入门,指南,文档)的理解,大致可以猜出一些,比如(req,res,router,view,middleware)
  • 根据文件结构,index指向lib/express,那这就是入口,看看里面组装关系,又明白一层
  • 每个文件去读,里面多少有点熟悉的东西

源码阅读

package.json里的files

.npmignore

  • 先看test、benchmark、examples
  • 其他步骤同上

带着问题去探索

比如我想获得访问此网页人的ip

扒出来的都是自己的

从代码里学,才是最常久的,开源的东西已经足够多了

每天打开github,看一下

https://github.com/trending

最近比较火的项目都有了,挑喜欢的扒一扒,肯定是有你不会的

贡献源码,回馈社区

开源是一种精神,从中受益,也要记得反馈社区,这是做程序员最基本的道德。

作业

express调试

快捷键练习

自定义snippet

extra练习

编写一个node命令行模块

阅读一个github上开源项目,写源码分析笔记

下周一前提交给我,sang@aircos.com,我会review,过时不候

致谢

最后感谢大家来学习,讲的主要是思路,具体做不做不是讲师能管的了的

我希望课程能够对大家有用,在本周内学会里面的所有内容(随时可以提问)

  • vsc快捷键会了,sublime也是通用的
  • extra里都是比较好的实践