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’)来运行的

附录:包管理 包的依赖关系, 或许是很常见的问题, 回头再详细看.


4 回复

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的基本概念和示例代码。建议进一步阅读官方文档以深入理解。

回到顶部