七天学会NodeJs学习笔记

前言

昨天第一次逛CNode社区,发现了这么个教程,就刷了半天刷了个大概,其中一些东西对我这种对Node认知几乎为0的小白来说还是有用的吧,API之类的就不记录了,就记一下方法论上的东西,大概都跟Node没什么关系吧(雾)。

关于工程目录

  • 以编写一个命令行程序为例,一般我们会同时提供命令行模式和API模式两种使用方式,并且我们会借助三方包来编写代码。除了代码外,一个完整的程序也应该有自己的文档和测试用例。因此,一个标准的工程目录都看起来像下边这样。
- /home/user/workspace/node-echo/   # 工程目录
    - bin/                          # 存放命令行相关代码
        node-echo
    + doc/                          # 存放文档
    - lib/                          # 存放API相关代码
        echo.js
    - node_modules/                 # 存放三方包
        + argv/
    + tests/                        # 存放测试用例
    package.json                    # 元数据文件
    README.md                       # 说明文件</code></pre>

关于Node异步捕获异常的一些坑

  • 异步函数执行过程中以及执行之后产生的异常冒泡到执行路径被打断的位置时,如果一直没有遇到try语句,就作为一个全局异常抛出
  • 那么我们除了可以在回调函数里用try捕获住然后由回调函数传递被捕获的异常,还可以用process捕获全局异常,亦或是建立domain子域监听异常
  • 那么这里有一个坑是无论是通过process对象的uncaughtException事件捕获到全局异常,还是通过子域对象的error事件捕获到了子域异常,在NodeJS官方文档里都强烈建议处理完异常后立即重启程序,而不是让程序继续运行。按照官方文档的说法,发生异常后的程序处于一个不确定的运行状态,如果不立即退出的话,程序可能会发生严重内存泄漏,也可能表现得很奇怪。
  • JS本身的throw..try..catch异常处理机制并不会导致内存泄漏,也不会让程序的执行结果出乎意料,但NodeJS并不是存粹的JS。NodeJS里大量的API内部是用C/C++实现的,因此NodeJS程序的运行过程中,代码执行路径穿梭于JS引擎内部和外部,而JS的异常抛出机制可能会打断正常的代码执行流程,导致C/C++部分的代码表现异常,进而导致内存泄漏等问题。

关于项目开发

  • 有需求后先设计规划一下具体模块以及工程目录然后考虑快速开发出第一版可以用的程序。
  • 写了一部分代码会发现有些忽略的细节,就可以更新自己之前的设计并二次迭代中完善更新。
  • 关于服务端开发其实有很多可以考虑的点..?比如守护进程,Node里可以用一个主进程控制子进程来实现,亦或是提供日志来统计访问量,如何充分利用多核CPU,这都是可以考虑的问题,需要在实践中落地思考。

如何整一个真正的命令行程序

  • 假设我们写了这么一个弱智程序(node-echo.js):
function main(argv) {
  console.log(argv);
}

main(process.argv);
  • 我们要执行肯定是在终端输入node node-echo.js xxx,但这明显不是我们要的命令行程序。
  • 我们肯定更希望是 node-echo xxx这样执行我们的程序,那么我们可以执行下面的操作来达到这样的效果(以下操作只针对linux):
    • 在shell脚本中,可以通过#!注释来指定当前脚本使用的解析器。所以我们可以在node-echo.js脚本头部添加 #! /usr/bin/env node这么一行代码,表明当前脚本用Node.js解析。
    • 然后我们用chmod +x /home/user/bin/node-echo.js给node-echo.js添加执行权限。
    • 最后我们把这个文件软链到/usr/local/bin或其他PATH环境变量中指定的某个目录下即可:sudo ln -s /home/user/bin/node-echo.js /usr/local/bin/node-echo

发表评论

电子邮件地址不会被公开。 必填项已用*标注