Node.js文档学习笔记(1)(含Nodejs关键词版,但原标题已含Node.js,故保持不变)
Node.js文档学习笔记(1)(含Nodejs关键词版,但原标题已含Node.js,故保持不变)
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’)来运行的
附录:包管理
包的依赖关系, 或许是很常见的问题, 回头再详细看.
Node.js 文档学习笔记 (1)
1. 文档来源
文档基于源代码下的 doc/ap
目录下的 .markdown
文件生成。这些文件通常用于生成官方文档,以便开发者能够更好地理解和使用 Node.js。
2. 文档格式
文档有两种格式:HTML 和 JSON。JSON 格式的文档是一种实验性质的文档,目的是为了便于 IDE 调用文档,例如提供代码提示等功能。
3. API 稳定级别
Node.js 的 API 分为多个稳定级别,从 0 到 5:
- 0 级:废弃。API 已知有问题,计划更改,不应依赖该 API。
- 1 级:实验。新添加的 API,可能会被改变或移除。
- 2 级:不稳定。已被确定,但未经过充分测试,会尽量保持向后兼容。
- 3 级:稳定。经过确认可靠,可能有小的更改,但会保证向后兼容。
- 4 级:高稳定性(冻结)。经过广泛生产环境测试,基本不会被更改。
- 5 级:最高稳定性(锁定)。除非有安全问题,否则不会更改。
4. 全局作用域
在 Node.js 中,全局变量并不像浏览器那样容易污染。例如:
var var1 = 10;
在浏览器中 var1
是全局的,但在 Node.js 中它仅限于当前模块的作用域。
5. 常用全局模块
Node.js 提供了一些常用的全局模块:
const process = require('process');
const console = require('console');
const Buffer = require('buffer').Buffer;
const require = require('module').require;
const requireResolve = require('module').require.resolve;
const requireCache = require('module').require.cache;
const filename = require('module').filename;
const dirname = require('module').dirname;
const module = require('module');
const exports = module.exports;
6. STDIO - console
console
的用法与浏览器中的类似:
console.log('Hello, World!');
console.time('timerName');
// ... some code ...
console.timeEnd('timerName'); // 输出时间
7. Timers 计时器
计时器 API 包括 setTimeout
, setInterval
, clearTimeout
, clearInterval
。它们的使用非常简单:
setTimeout(() => {
console.log('This runs after 2 seconds');
}, 2000);
let intervalId = setInterval(() => {
console.log('This runs every second');
}, 1000);
clearInterval(intervalId);
8. Modules 模块
Node.js 的模块系统非常强大,支持多种加载方式:
// 加载普通模块
const myModule = require('./myModule');
// 循环加载
// 需要详细研究源代码以理解其机制
// 核心模块
// 核心模块如 'fs', 'http' 等,优先于自定义模块加载
// 文件模块
// Node.js 会尝试加载对应的文件类型,如 .js, .json, .node
// 加载位置
// 绝对路径、相对路径、node_modules 目录
9. 模块缓存
模块加载后会被缓存,如果需要多次执行相同的代码,可以将代码写成函数形式:
function loadModule() {
const myModule = require('./myModule');
// 使用 myModule
}
10. module 对象
module
对象是每个模块都包含的对象,提供了许多有用的属性和方法:
module.exports = {
someFunction: () => {
console.log('Hello from module');
}
};
通过以上笔记,你可以更好地理解和使用 Node.js 的核心概念和功能。希望这些信息对你有所帮助!
写给自己看, 放在博客上的, 还是抛砖引玉, 希望能帮到一些朋友.
你可以在文档中搜索下Stability, 就知道了, http://nodejs.org/api/all.html
Node.js文档学习笔记(1)
1. 文档生成方式
- 文档来源: 文档基于源代码下的
doc/ap
目录下的.markdown
文件生成。 - 文档格式: 文档提供HTML和JSON两种格式。JSON格式是为了便于IDE调用文档,以便实现代码提示等功能。
2. API的稳定级别
- 0级: 废弃。API有问题,计划更改,不应依赖。
- 1级: 实验。API新加入,可能被改变或移除。
- 2级: 不稳定。API已确定,但未充分测试。
- 3级: 稳定。API可靠,可能会有小改动,保证向后兼容。
- 4级: 高稳定性。API经过生产环境测试,基本不会更改。
- 5级: 最高稳定性。API除非有安全问题,否则不会更改。
3. 全局作用域
- 变量作用域: 在浏览器中声明的变量是全局的,但在Node.js中,声明的变量仅限于当前模块。
var var1 = 10;
4. 常用全局模块
process
,console
,Buffer
,require
,require.resolve()
,require.cache
,__filename
,__dirname
,module
,exports
console.log(require.cache);
5. STDIO - console
- 稳定度: 4级
- 示例:
console.log("Hello World");
console.time('timer');
// ... some code ...
console.timeEnd('timer'); // 输出代码运行时间
6. Timers 计时器
- 稳定度: 5级
- 示例:
setTimeout(() => {
console.log('5秒后输出');
}, 5000);
setInterval(() => {
console.log('每秒输出一次');
}, 1000);
7. Modules 模块
- 稳定度: 5级
- 示例:
const fs = require('fs');
fs.readFile('./test.txt', (err, data) => {
if (err) throw err;
console.log(data.toString());
});
循环加载
- 示例:
// a.js
const b = require('./b');
console.log(b.x);
// b.js
const a = require('./a');
a.x = 20;
module.exports = { x: 10 };
核心模块与文件模块
- 示例:
// 核心模块
const path = require('path');
// 文件模块
const myModule = require('./myModule');
模块缓存
- 示例:
const myModule = require('./myModule');
// ... 代码 ...
myModule.reset(); // 重置模块状态
module对象
- 示例:
console.log(module.id);
console.log(module.filename);
console.log(module.loaded);
module.exports
- 示例:
// myModule.js
module.exports = {
greet: function() {
return "Hello";
}
};
// main.js
const myModule = require('./myModule');
console.log(myModule.greet()); // 输出 "Hello"
这些是Node.js的基本概念和示例代码。建议进一步阅读官方文档以深入理解。