Node.js 笔记 (II)

为了加速学习,并且经朋友推荐,还是先换了一本中文教材《Node.js开发指南》继续学习 Node.js。以期减少沟通成本尽快上手。

下面继续以 Tip 形式记录相关要点:

1. Node.js 的 npm

Frankly speaking, 我还没懂 npm 是什么东西(可见我真的太弱了)。但是 Node.js 安装之后,“这个命令”就已经安装上了,在 Windows 下,npm 这个命令也加到环境变量中去了,可以直接使用。目前,我的所知是它可以安装某些包。

2. Supervisor 调试模式

Ok, 有没有觉得在 PHP 下面一改源码就生效,但是到了 Node 上面,每次都要重启 Node 很烦,还怎么做开发?(当然 Node.js 这样做提高了效率,生产状态下绝对是有利的)是吧,不担心,有解法。 用 npm 安装包: 直接在命令行中运行这个(windows 下亲测可用),然后 supervisor 就装上了。

npm install -g supervisor

然后原本运行一个脚本是 node xxx.js,现在 用supervisor xxx.js就 ok 了,这种方式打开的调试模式下面,就可以有修改源码重新载入的效果了。

3. Node.js 事件

由于 Node.js 普遍性的异步调用,事件处理循环是一个核心的问题,下面抄写书中的一个例程说明问题。 //event.js var EventEmitter = require('events').EventEmitter; var event = new EventEmitter(); event.on('some_event', function() { console.log('some_event occured.'); }); setTimeout(function() { event.emit('some_event'); }, 1000); 可以看到,EventEmitter 是一个 event 库中的事件处理对象,用 new 创建它的一个对象 event。(也就是说,上例的 event 是一个 EventEmitter 对象) 通过 event.on 可以将一个处理函数绑定到一个事件’some_event’(实质上是一个字符串)。然后通过 event.emit(‘some_event’) 就可以触发这个事件。

4. 模块 (Module) 和包 (Package)

且用傻瓜的方式来理解,教材作者说两者之间没有本质的区别。 Node.js 的模块和包没有完全遵循 commonJS 的标准,但差不多,但如果要跨平台(非Node)使用时则要留意,在 Node 上可用的包拿到别的 js 平台未必能用。 简单地说,reqire(…) 里面的东西,诸如 http, fs, event 等等就是一个模块。 同样抄一个例子: //module.js var name; exports.setName = function(thyName) { name = thyName; }; exports.sayHello = function() { console.log('Hello ' + name); }; // 在同一目录下创建 getmodule.js,内容是: //getmodule.js var myModule = require('./module'); myModule.setName('BYVoid'); myModule.sayHello(); 那首先,定义模块,require 的模块名对应的是文件名(可能需要包含目录),然后模块定义文件中,对 exports 对象赋值,就可以在 reqire 之后去调用它的值。看起来有点拗口,反正就是 require 之后得到一个对象,这个对象就相当于模块定义中的 exports 对象一样。

5. 模块加载的单一性

如果多次 require 一个相同的模块,那么会得到同一个对象(而不是多个副本),如果 var mod1 = require(‘mymodule’); var mod2 = require(‘mymodule’); 他们得到同一个对象,也共用同一个模块中的命名空间。

6. 覆盖 exports

上面已经知道,require 会返回一个对象,这个对象就是 exports,如果不想通过 exports.XXX = XXX 的方式来只定义一个方法,也可以整个替换掉 exports,如果在模块中声明了一个对象(MyObject),那么可以直接用

module.exports = MyObject;

来替换掉 exports,同样的道理,require 之后得到的对象就是这一个 MyObject 本身。 而事实上,在一个模块中,module.exports 只是一个用于“参数传递”的接口,它默认是 {},如果要变更其引用,就需要对 module.exports 赋值。

7. How about PACKAGE(包)?

书中原话:Node.js 的包是一个目录,其中包含一个 JSON 格式的包说明文件 package.json。 commonJS 的包遵循如下规范,但 Node 没那么严格,但还是建议遵循:

  • package.json 必须在包的顶层目录下;
  • 二进制文件应该在 bin 目录下;
  • JavaScript 代码应该在 lib 目录下;
  • 文档应该在 doc 目录下;
  • 单元测试应该在 test 目录下。

8. 包的格式与结构 About package.json

具体格式这里不列出了,重要设置的定义包括这些。 main: 包的接口模块,缺省的话会试图用 index.js 或者 index.node 访问。 name: 包名称 其他若干设置其实一般来说不是太重要,包括一些版本、描述等等的信息,如果真的要正式公开发布一个包的时候在研究不迟。

9. More about npm

终于知道 npm 是啥了,就是 Node Package Manager,用来管理 node 的各种包。 在 Shell 中执行以下 npm 命令: 安装包:

npm install [package_name] npm i [package_name]

上面两句任选其一都可以,install 可简写为 i。 npm 在默认情况下会从 http://npmjs.org 搜索或下载包,将包安装到当前目录的 node_modules 子目录下。 然后呢,用上述命令安装的包(放在当前目录的 node_modules 下)的方式是“本地模式”的安装方式。事实上当我们去 require 一个包的时候,Node 会首先从当前目录的 node_modules 下面去找。 如果加上 -g 选项:

npm i -g [package_name]

这样的话就以“全局模式”安装了一个包(就装在有环境 PATH 的系统文件夹的 node_modules 下),但是直接 require 是加载不到的。 如果需要使用一个全局包,可以使用 Shell 的 npm link 命令:

npm link [package_name]

这样相当于把全局包在当前目录创建了一个“快捷方式”,然后就可以 require 到了。

10. 自动创建符合格式规范的包

执行 npm init 命令可以创建一个包,会提示输入相关的信息,然后在目录里面生成相应的 package.json 配置文件。

11. 包的发布

像我这种菜鸟看起来离我比较远,也就是说可以方便地发布自己制作的 Node 包,通过 npm addUser 来创建账号,然后通过 npm publish/unpublish 来将自己的包发布到 npmjs.org

12. 调试模式

Node 支持调试模式(单步调试等)使用:

node debug debug.js

来启动程序就会进入调试模式。 具体调试模式的使用以及命令还是等需要的时候查阅好了。 另外还可以远程调试,使用以下命令:

node –debug[=port] script.js node –debug-brk[=port] script.js

然后教材还介绍了如何使用 eclipse 进行调试,还可以用 node-inspector 包来用浏览器程序进行调试。

npm install -g node-inspector

好,这一节先到这里,已经学完本书的第三章了。


【转载请附】愿以此功德,回向 >>

原文链接:http://www.huangwenchao.com.cn/2014/01/node02.html【Node.js 笔记 (II)】

《Node.js 笔记 (II)》有107个想法

发表评论

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