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)》有1个想法

  1. A match of violence and blood, the combo of fun and a slightly macabre feeling. Happy Wheels 2 https://happywheels2.club/ is a game in which you choose extravagant vehicles, from a bike to a wheel chair and ship the through a comfy trail where the awkward driver will make an effort to urgently escape mutilation, decapitation and death, you can also detach the character out of the motor vehicle.

发表评论

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