Node.js文档学习笔记(1)
1.文档基于源代码下doc/ap目录下的.markdown文件生成的.
2.文档有html和json两种格式, json格式是一种实验性质的文档, 目的是便于类似于IDE调用文档, 可以做些诸如代码提示等工作.
3.API的稳定级别.
0级, 废弃. 该API已知有问题, 计划更改, 不应该依赖该API, 应该不会向后兼容.
1级, 实验. 该API是新加的, 可能会被改变或者移除.
2级, 不稳定. 该API已经被确定, 但没有经过足够的测试, 会尽量做向后兼容.
3级, 稳定. 该API已经确认可靠, 可能会有小的更改, 会保证向后兼容.
4级, 高稳定性(冻结). 该API经过广泛在生产环境下测试, 基本上不会被更改.
5级, 最高稳定性(锁定). 该API除非有安全问题, 否则代码都不会该, 你也不要要求更改此API, 你的要求会被拒绝的.
4.全局作用域
可以用console.log(global)来打印出来全局的类.
var var1 = 10; 在浏览器中var1是全局的. 在node中这个var1的作用域只是在当前模块(module), 所以不要担心var声明变量会污染全局.
常用的全局模块
process, console, Buffer, require, require.resolve(), require.cache, __filename,
__dirname, module, exports,
需要指出的是:
require(), 并不是真正意义的全局类(函数??), 但每个module都包含(可以直接调用该类)
require.resolve()
只分析并返回模块的路径, 并不加载该模块.查找模块的方法, 和require是一致的.
require.cache
模块加载后会被缓存到这个对象, 如果删除了一个key value(模块?), 再次require的时候, 会重新加载该模块.
__filename, __dirname
返回当前脚本的文件, 目录路径, 同样这两个也不是真正意义的全局变量
5.STDIO--console
稳定度:4级
console的用法和浏览器中类似
console.time 和 console.timeEnd可以联合使用可以方便地测量代码运行的时间.
6.Timers计时器
稳定度:5级
这个没啥好说的, setTimeout, setInterval, clearTimeout, clearInterval
7.Modules模块
稳定度:5级
这一块非常重要, 文档也非常长, 值得细读.
普通的加载就不说了, 一个require完事.
循环加载:
这个例子需要详细看下, 相关的机制, 要详细研究下源代码, 看英语看不太确切.
核心模块:
有几个核心模块(源代码lib/目录)被编译进了node, 如果你有一个自定义的文件和核心文件重名, 那么将加载核心模块而不是你自己的文件.所以文件名不要和核心文件重名.挺多的, 最好到node的代码里面看下.
文件模块:
如果你提供的名称(如hello)没有被精确匹配, node会尝试hello.js, hello.json, hello.node, js会被当成javascript文件, json会被当成json文件来解析, .node会被当成编译过的二进制文件使用dlopen来被加载.
加载位置, ‘/a.js’是绝对路径, ‘./b.js’ 是相对路径, 如果什么都不加, 并且不是核心模块, 那么会在node_modules来加载. 查找node_modules的规则是, 先在启动目录下查找, 如果查找不到那么依次寻找启动目录的父目录, 直到根目录. node采用这种模式来保证不同的模块能调用不同版本的一个模块, 而不产生冲突.
文件夹当做模块
如果require(‘./folder’); 那么node会试图查找package.json文件, 可以在package.json中定义一个main入口文件, node会加载他.
如果package.json不存在, 那么node会试图加载index.js, index.node.
模块缓存
模块加载后会被缓存, 如果需要一段代码多次执行, 那么将其写成函数,
还是没有理解循环依赖的时候的机制,
小心缓存
因为上面提到的加载位置和加载顺序的问题, 那么同样的代码可能加载到的时候不同模块, 具体加载什么模块, 取决于require解析到的文件的路径
module对象
再次强调了下module对象不是一个全局对象,而是每个模块都包含的.
module.exports对象
关于module.exports是一个实例的这段没有看懂
不过module.exports赋值需要在模块加载的时候完成, 不能在回调函数中赋值. 否则就是undefined
module.require(id)
这段没有看懂
module还有其他一些属性, id, filename, loaded, parent, children
这里有段伪代码解释require.resolve()加载过程
全局模块加载:
这段主要是讲基于历史原因的全局模块的加载, 推荐将依赖放在node_modules目录下.
访问main module:
可以用require.main===module来判断当前模块是否是主模块, 既是采用node foo.js运行的还是 require(‘./foo.js’)来运行的
附录:包管理
包的依赖关系, 或许是很常见的问题, 回头再详细看.