继续学习 Node.js html
== 文件操做 == 前端
NodeJS 对比浏览器中的 js 重点(进步)是能操做文件... 经过内模块 `fs' (文档...) node
实验一下, 进入 node 交互命令行: web
> var fs = require('fs'); // 引入 fs 模块 undefined // node 响应 > fs // 显示一下 fs 这个对象 ... ... ... 大量内容, 对象被显示出来... > var temp = fs.readFileSync('hell.txt'); > temp; // 显示读入的是什么 <Buffer 12 34 56 ... 一大堆二进制表示的字节吧... > (至少能快速实验一下) 后面又实验了一下, fs 彷佛初始就有此变量, 不须要 require ...?
API 蜻蜓点水 shell
能够看官方文档(估计须要再去查), 如 https://nodejs.org/api/buffer.html 编程
彷佛(缺省?)可用对象: assert, buffer, child_process, cluster, console, ... (内建?) 设计模式
NodeJS 带一个内建的调试器: api
$ node debug hello.js < Debugger listening on port xxxx debug> . ok ... debug>help Commands: run (r), cont (c), next (n), step (s), out (o), backtrace (bt), setBreakpoint (sb), clearBreakpoint (cb), watch, unwatch, watchers, repl, restart, kill, list, scripts, breakOnException, breakpoints, version debug>
虽然有点简陋, 但总比没有强... 数组
NodeJS 最精华的异步 IO 模型在 fs 模块中有体现: 浏览器
fs.readFile(filename, function(err, data) { if (err) deal-with-error; else deal-with-data; });
示例: 经过 同步读取目录/文件 => 递归 => 回调 实现 travel(dir, callback) -- 目录遍历函数.
也有异步版本, 要是没有必要, 仍是暂时不学异步版了.
== 网络操做 ==
NodeJS 能够编写一些服务器端程序来协助前端开发和测试. (例如作 WebSocket 服务器)
实现 hello-world 的 web-server 例子(略).
对应模块有 http, https, url, querystring, net, socket 等.
这里不少须要 socket, http协议知识. (知识太多,学不过来...)
zlib 模块可能也须要, 对于那些带压缩的 http 数据.
== 进程管理 ==
经过产生新进程, nodejs 可以调用(别的)终端命令(或程序) 来作事情(像 shell,批处理)
(这是一种强大的思想和能力, 本身花时间作不如用别人现成的, 现成没有或不足用再本身干...)
var worker = require('child_process'); worker.exec('copy x y', callback() { print('Work complete~'); });
注: 子进程是异步运行的(应该说是本身独立运行的), 经过回调函数返回执行结果.
进程间通讯: 若是父子进程都是 nodejs 进程, 则可经过 IPC 双向传递数据.
process.on('message', callback(msg) { ... }); 收到(父进程传递来的)该消息时作处理... (这里像 websocket)
msg 在发送端用 JSON.stringify 序列化, 接收端用 JSON.parse 反序列化.
== 异步编程 ==
NodeJS 最大的卖点 --- 事件机制,异步IO.
直接体现是回调. (前面见到不少了)
异步编程有特有的代码设计模式.
同步下: 异步下:
函数返回值 --> 回调函数
遍历数组 --> 串行处理(若是可并行处理, 需更多特定标志)
异常处理 --> 回调中额外带 err (catch 住的异常)参数.
异常增长了编程复杂度. (若是没有效益, 仍是少用为好...)
== 域 ==
NodeJS 提供 domian 模块, 能够简化异步代码的异常处理. 简而言之, 一个域是一个 JS 运行环境.
NodeJS 的大量 API 使用 C/C++ 实现的, 若是运行过程当中出现异常可能会打断正常代码执行流程,
致使 C/C++ 部分有异常, 进而致使xxx. 最好处理完异常后重启程序...
== 一个大的示例 ==
经过屡次迭代开发(演示)一个简单静态文件合并 server. (略)
原做者建议:
1. 要熟悉官方 API 文档.
2. 要先设计再实现.
3. 要实现后再设计. (意思是要迭代)
4. 要充分利用三方包.
5. 不要迷信三方包.
(END)