zoukankan      html  css  js  c++  java
  • Nodejs学习笔记(1)

    1 Node.js
    • 简单的说 Node.js 就是运行在服务端的 JavaScript。
    • 基于Chrome V8引擎的JavaScript运行环境。
    • 使用 Node.js 时,我们不仅仅 在实现一个应用,同时还实现了整个 HTTP 服务器。事实上,我们的 Web 应用以及对应的 Web 服务器基本上是一样的。
    特点
    • 单线程
    • 非阻塞异步I/O
    • 事件驱动
    工具
    • nodemon(npm install nodemon -g): 监听代码文件的变动,当代码改变之后,自动重启(报错: 管理员身份打开powerShell, 输入set-ExecutionPolicy RemoteSigned
     

    2 Node.js REPL(交互式解释器)

    Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境,类似 Window 系统的终端或 Unix/Linux shell,我们可以在终端中输入命令,并接收系统的响应。
    Node 自带了交互式解释器,可以执行以下任务:
    读取 - 读取用户输入,解析输入了Javascript 数据结构并存储在内存中。
    执行 - 执行输入的数据结构
    打印 - 输出结果
    循环 - 循环操作以上步骤直到用户两次按下 ctrl-c 按钮退出。
    Node 的交互式解释器可以很好的调试 Javascript 代码。
    开始学习 REPL
    我们可以输入以下命令来启动 Node 的终端:
    $ node
    

      这时我们就可以在 > 后输入简单的表达式,并按下回车键来计算结果。

     

    3 REPL 命令

    ctrl + c - 退出当前终端。
    ctrl + c 按下两次 - 退出 Node REPL。
    ctrl + d - 退出 Node REPL.
    向上/向下 键 - 查看输入的历史命令
    tab 键 - 列出当前命令
    .help - 列出使用命令
    .break - 退出多行表达式
    .clear - 退出多行表达式
    .save filename - 保存当前的 Node REPL 会话到指定文件
             .load filename - 载入当前 Node REPL 会话的文件内容。
     

    4 Node.js 回调函数

    Node.js 异步编程的直接体现就是回调。

    阻塞代码实例

    创建一个文件 input.txt ,内容如下:
    www.baidu.com
    

    创建 main.js 文件, 代码如下:

    var fs = require("fs");
    
    var data = fs.readFileSync('input.txt');
    
    console.log(data.toString());
    console.log("程序执行结束!");
    
    以上代码执行结果如下:
    $ node main.js
    www.baidu.com
    程序执行结束!

    非阻塞代码实例

    创建一个文件 input.txt ,内容如下:
    www.baidu.com
    

    创建 main.js 文件, 代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
    if (err) return console.error(err);
    console.log(data.toString());});
    
    console.log("程序执行结束!");
    
    以上代码执行结果如下:
    $ node main.js
    程序执行结束!
    www.baidu.com
    以上两个实例我们了解了阻塞与非阻塞调用的不同。第一个实例在文件读取完后才执行程序。 第二个实例我们不需要等待文件读取完,这样就可以在读取文件时同时执行接下来的代码,大大提高了程序的性能。
    因此,阻塞是按顺序执行的,而非阻塞是不需要按顺序的,所以如果需要处理回调函数的参数,我们就需要写在回调函数内。
     

    5 Node.js 事件循环

    Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。
    Node.js 几乎每一个 API 都是支持回调函数的。
    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。
    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.

    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。
    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。
    这个模型非常高效可扩展性非常强,因为 webserver 一直接受请求而不等待任何读写操作。(这也称之为非阻塞式IO或者事件驱动IO)
    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。
    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:
    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);
    

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');
    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
     
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
     
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
     
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    console.log("程序执行完毕。");
    
    接下来让我们执行以上代码:
    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。
     
    Node.js 函数
    function say(word) {
    console.log(word);
    }
     
    function execute(someFunction, value) {
    someFunction(value);
    }
     
    execute(say, "Hello");
    以上代码中,我们把 say 函数作为execute函数的第一个变量进行了传递。这里传递的不是 say 的返回值,而是 say 本身!
    这样一来, say 就变成了execute 中的本地变量 someFunction ,execute可以通过调用 someFunction() (带括号的形式)来使用 say 函数。

    当然,因为 say 有一个变量, execute 在调用 someFunction 时可以传递这样一个变量。

    匿名函数

    我们可以把一个函数作为变量传递。但是我们不一定要绕这个"先定义,再传递"的圈子,我们可以直接在另一个函数的括号中定义和传递这个函数:
    function execute(someFunction, value) {
    someFunction(value);
    }
     
    execute(function(word){ console.log(word) }, "Hello");
    我们在 execute 接受第一个参数的地方直接定义了我们准备传递给 execute 的函数。
    用这种方式,我们甚至不用给这个函数起名字,这也是为什么它被叫做匿名函数 。
    Node.js 全局对象
    JavaScript 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量。
    在浏览器 JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是 global 对象的属性。
    在 Node.js 我们可以直接访问到 global 的属性,而不需要在应用中包含它。

    全局对象与全局变量

    global 最根本的作用是作为全局变量的宿主。按照 ECMAScript 的定义,满足以下条件的变量是全局变量:
    • 在最外层定义的变量;
    • 全局对象的属性;
    • 隐式定义的变量(未定义直接赋值的变量)。
    当你定义一个全局变量时,这个变量同时也会成为全局对象的属性,反之亦然。需要注意的是,在 Node.js 中你不可能在最外层定义变量,因为所有用户代码都是属于当前模块的, 而模块本身不是最外层上下文。
    注意: 最好不要使用 var 定义变量以避免引入全局变量,因为全局变量会污染命名空间,提高代码的耦合风险。
     

    __filename

    __filename 表示当前正在执行的脚本的文件名。它将输出文件所在位置的绝对路径,且和命令行参数所指定的文件名不一定相同。 如果在模块中,返回的值是模块文件的路径。
     

    __dirname

    __dirname 表示当前执行脚本所在的目录。
     

    setTimeout(cb, ms)

    setTimeout(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。setTimeout() 只执行一次指定函数。
    返回一个代表定时器的句柄值。
     

    clearTimeout(t)

    clearTimeout( t ) 全局函数用于停止一个之前通过 setTimeout() 创建的定时器。 参数 t 是通过 setTimeout() 函数创建的定时器。
     

    setInterval(cb, ms)

    setInterval(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。
    返回一个代表定时器的句柄值。可以使用 clearInterval(t) 函数来清除定时器。
    setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。
     

    console

    console 用于提供控制台标准输出,它是由 Internet Explorer 的 JScript 引擎提供的调试工具,后来逐渐成为浏览器的实施标准。
    Node.js 沿用了这个标准,提供与习惯行为一致的 console 对象,用于向标准输出流(stdout)或标准错误流(stderr)输出字符。
     
    Node.js 模块系统
    为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。
    模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。
     

    创建模块

    在 Node.js 中,创建一个模块非常简单,如下我们创建一个 main.js 文件,代码如下:
    var hello = require('./hello');
    hello.world();
    以上实例中,代码 require('./hello') 引入了当前目录下的 hello.js 文件(./ 为当前目录,node.js 默认后缀为 js)。
    Node.js 提供了 exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象。
    接下来我们就来创建 hello.js 文件,代码如下:
    exports.world = function() {
    console.log('Hello World');
    }
    在以上示例中,hello.js 通过 exports 对象把 world 作为模块的访问接口,在 main.js 中通过 require('./hello') 加载这个模块,然后就可以直接访 问 hello.js 中 exports 对象的成员函数了。
    有时候我们只是想把一个对象封装到模块中,格式如下:
    module.exports = function() {
    // ...
    }
    例如:
    //hello.js
    function Hello() {
    var name;
    this.setName = function(thyName) {
    name = thyName;
    };
    this.sayHello = function() {
    console.log('Hello ' + name);
    };
    };
    module.exports = Hello;
    这样就可以直接获得这个对象了:
    //main.js
    var Hello = require('./hello');
    hello = new Hello();
    hello.setName('BYVoid');
    hello.sayHello();
    模块接口的唯一变化是使用 module.exports = Hello 代替了exports.world = function(){}。 在外部引用该模块时,其接口对象就是要输出的 Hello 对象本身,而不是原先的 exports。

    服务端的模块放在哪里

    Node.js 的 require 方法中的文件查找策略如下:
    由于 Node.js 中存在 4 类模块(原生模块和3种文件模块),尽管 require 方法极其简单,但是内部的加载却是十分复杂的,其加载优先级也各自不同。
     

    从文件模块缓存中加载

    尽管原生模块与文件模块的优先级不同,但是都会优先从文件模块的缓存中加载已经存在的模块。

    从原生模块加载

    原生模块的优先级仅次于文件模块缓存的优先级。require 方法在解析文件名之后,优先检查模块是否在原生模块列表中。以http模块为例,尽管在目录下存在一个 http/http.js/http.node/http.json 文件,require("http") 都不会从这些文件中加载,而是从原生模块中加载。
    原生模块也有一个缓存区,同样也是优先从缓存区加载。如果缓存区没有被加载过,则调用原生模块的加载方式进行加载和执行。

    从文件加载

    当文件模块缓存中不存在,而且不是原生模块的时候,Node.js 会解析 require 方法传入的参数,并从文件系统中加载实际的文件,加载过程中的包装和编译细节在前一节中已经介绍过,这里我们将详细描述查找文件模块的过程,其中,也有一些细节值得知晓。
    require方法接受以下几种参数的传递:
    • http、fs、path等,原生模块。
    • ./mod或../mod,相对路径的文件模块。
    • /pathtomodule/mod,绝对路径的文件模块。
    • mod,非原生模块的文件模块。
    1 Node.js
    • 简单的说 Node.js 就是运行在服务端的 JavaScript。
    • 基于Chrome V8引擎的JavaScript运行环境。
    • 使用 Node.js 时,我们不仅仅 在实现一个应用,同时还实现了整个 HTTP 服务器。事实上,我们的 Web 应用以及对应的 Web 服务器基本上是一样的。
    特点
    • 单线程
    • 非阻塞异步I/O
    • 事件驱动
    工具
    • nodemon(npm install nodemon -g): 监听代码文件的变动,当代码改变之后,自动重启(报错: 管理员身份打开powerShell, 输入set-ExecutionPolicy RemoteSigned
     

    2 Node.js REPL(交互式解释器)

    Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境,类似 Window 系统的终端或 Unix/Linux shell,我们可以在终端中输入命令,并接收系统的响应。
    Node 自带了交互式解释器,可以执行以下任务:
    读取 - 读取用户输入,解析输入了Javascript 数据结构并存储在内存中。
    执行 - 执行输入的数据结构
    打印 - 输出结果
    循环 - 循环操作以上步骤直到用户两次按下 ctrl-c 按钮退出。
    Node 的交互式解释器可以很好的调试 Javascript 代码。
    开始学习 REPL
    我们可以输入以下命令来启动 Node 的终端:
    $ node
    >
    这时我们就可以在 > 后输入简单的表达式,并按下回车键来计算结果。
     

    3 REPL 命令

    ctrl + c - 退出当前终端。
    ctrl + c 按下两次 - 退出 Node REPL。
    ctrl + d - 退出 Node REPL.
    向上/向下 键 - 查看输入的历史命令
    tab 键 - 列出当前命令
    .help - 列出使用命令
    .break - 退出多行表达式
    .clear - 退出多行表达式
    .save filename - 保存当前的 Node REPL 会话到指定文件
             .load filename - 载入当前 Node REPL 会话的文件内容。
     

    4 Node.js 回调函数

    Node.js 异步编程的直接体现就是回调。

    阻塞代码实例

    创建一个文件 input.txt ,内容如下:
    菜鸟教程官网地址:www.runoob.com
    创建 main.js 文件, 代码如下:
    var fs = require("fs");
     
    var data = fs.readFileSync('input.txt');
     
    console.log(data.toString());
    console.log("程序执行结束!");
    以上代码执行结果如下:
    $ node main.js
    菜鸟教程官网地址:www.runoob.com
    程序执行结束!

    非阻塞代码实例

    创建一个文件 input.txt ,内容如下:
    菜鸟教程官网地址:www.runoob.com
    创建 main.js 文件, 代码如下:
    var fs = require("fs");
     
    fs.readFile('input.txt', function (err, data) {
    if (err) return console.error(err);
    console.log(data.toString());});
     
    console.log("程序执行结束!");
    以上代码执行结果如下:
    $ node main.js
    程序执行结束!菜鸟教程官网地址:www.runoob.com
    以上两个实例我们了解了阻塞与非阻塞调用的不同。第一个实例在文件读取完后才执行程序。 第二个实例我们不需要等待文件读取完,这样就可以在读取文件时同时执行接下来的代码,大大提高了程序的性能。
    因此,阻塞是按顺序执行的,而非阻塞是不需要按顺序的,所以如果需要处理回调函数的参数,我们就需要写在回调函数内。
     

    5 Node.js 事件循环

    Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。
    Node.js 几乎每一个 API 都是支持回调函数的。
    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。
    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.

    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。
    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。
    这个模型非常高效可扩展性非常强,因为 webserver 一直接受请求而不等待任何读写操作。(这也称之为非阻塞式IO或者事件驱动IO)
    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。
    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:
    // 引入 events 模块var events = require('events');// 创建 eventEmitter 对象var eventEmitter = new events.EventEmitter();
    以下程序绑定事件处理程序:
    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);
    我们可以通过程序触发事件:
    // 触发事件
    eventEmitter.emit('eventName');
    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
     
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
     
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection'connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received'function(){
       console.log('数据接收成功。');
    });
     
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    console.log("程序执行完毕。");
    接下来让我们执行以上代码:
    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。
     
    Node.js 函数
    function say(word) {
    console.log(word);
    }
     
    function execute(someFunction, value) {
    someFunction(value);
    }
     
    execute(say, "Hello");
    以上代码中,我们把 say 函数作为execute函数的第一个变量进行了传递。这里传递的不是 say 的返回值,而是 say 本身!
    这样一来, say 就变成了execute 中的本地变量 someFunction ,execute可以通过调用 someFunction() (带括号的形式)来使用 say 函数。

    当然,因为 say 有一个变量, execute 在调用 someFunction 时可以传递这样一个变量。

    匿名函数

    我们可以把一个函数作为变量传递。但是我们不一定要绕这个"先定义,再传递"的圈子,我们可以直接在另一个函数的括号中定义和传递这个函数:
    function execute(someFunction, value) {
    someFunction(value);
    }
     
    execute(function(word){ console.log(word) }, "Hello");
    我们在 execute 接受第一个参数的地方直接定义了我们准备传递给 execute 的函数。
    用这种方式,我们甚至不用给这个函数起名字,这也是为什么它被叫做匿名函数 。
    Node.js 全局对象
    JavaScript 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量。
    在浏览器 JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是 global 对象的属性。
    在 Node.js 我们可以直接访问到 global 的属性,而不需要在应用中包含它。

    全局对象与全局变量

    global 最根本的作用是作为全局变量的宿主。按照 ECMAScript 的定义,满足以下条件的变量是全局变量:
    • 在最外层定义的变量;
    • 全局对象的属性;
    • 隐式定义的变量(未定义直接赋值的变量)。
    当你定义一个全局变量时,这个变量同时也会成为全局对象的属性,反之亦然。需要注意的是,在 Node.js 中你不可能在最外层定义变量,因为所有用户代码都是属于当前模块的, 而模块本身不是最外层上下文。
    注意: 最好不要使用 var 定义变量以避免引入全局变量,因为全局变量会污染命名空间,提高代码的耦合风险。
     

    __filename

    __filename 表示当前正在执行的脚本的文件名。它将输出文件所在位置的绝对路径,且和命令行参数所指定的文件名不一定相同。 如果在模块中,返回的值是模块文件的路径。
     

    __dirname

    __dirname 表示当前执行脚本所在的目录。
     

    setTimeout(cb, ms)

    setTimeout(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。setTimeout() 只执行一次指定函数。
    返回一个代表定时器的句柄值。
     

    clearTimeout(t)

    clearTimeout( t ) 全局函数用于停止一个之前通过 setTimeout() 创建的定时器。 参数 t 是通过 setTimeout() 函数创建的定时器。
     

    setInterval(cb, ms)

    setInterval(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。
    返回一个代表定时器的句柄值。可以使用 clearInterval(t) 函数来清除定时器。
    setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。
     

    console

    console 用于提供控制台标准输出,它是由 Internet Explorer 的 JScript 引擎提供的调试工具,后来逐渐成为浏览器的实施标准。
    Node.js 沿用了这个标准,提供与习惯行为一致的 console 对象,用于向标准输出流(stdout)或标准错误流(stderr)输出字符。
     
    Node.js 模块系统
    为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。
    模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。
     

    创建模块

    在 Node.js 中,创建一个模块非常简单,如下我们创建一个 main.js 文件,代码如下:
    var hello = require('./hello');
    hello.world();
    以上实例中,代码 require('./hello') 引入了当前目录下的 hello.js 文件(./ 为当前目录,node.js 默认后缀为 js)。
    Node.js 提供了 exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象。
    接下来我们就来创建 hello.js 文件,代码如下:
    exports.world = function() {
    console.log('Hello World');
    }
    在以上示例中,hello.js 通过 exports 对象把 world 作为模块的访问接口,在 main.js 中通过 require('./hello') 加载这个模块,然后就可以直接访 问 hello.js 中 exports 对象的成员函数了。
    有时候我们只是想把一个对象封装到模块中,格式如下:
    module.exports = function() {
    // ...
    }
    例如:
    //hello.js
    function Hello() {
    var name;
    this.setName = function(thyName) {
    name = thyName;
    };
    this.sayHello = function() {
    console.log('Hello ' + name);
    };
    };
    module.exports = Hello;
    这样就可以直接获得这个对象了:
    //main.js
    var Hello = require('./hello');
    hello = new Hello();
    hello.setName('BYVoid');
    hello.sayHello();
    模块接口的唯一变化是使用 module.exports = Hello 代替了exports.world = function(){}。 在外部引用该模块时,其接口对象就是要输出的 Hello 对象本身,而不是原先的 exports。

    服务端的模块放在哪里

    Node.js 的 require 方法中的文件查找策略如下:
    由于 Node.js 中存在 4 类模块(原生模块和3种文件模块),尽管 require 方法极其简单,但是内部的加载却是十分复杂的,其加载优先级也各自不同。
     

    从文件模块缓存中加载

    尽管原生模块与文件模块的优先级不同,但是都会优先从文件模块的缓存中加载已经存在的模块。

    从原生模块加载

    原生模块的优先级仅次于文件模块缓存的优先级。require 方法在解析文件名之后,优先检查模块是否在原生模块列表中。以http模块为例,尽管在目录下存在一个 http/http.js/http.node/http.json 文件,require("http") 都不会从这些文件中加载,而是从原生模块中加载。
    原生模块也有一个缓存区,同样也是优先从缓存区加载。如果缓存区没有被加载过,则调用原生模块的加载方式进行加载和执行。

    从文件加载

    当文件模块缓存中不存在,而且不是原生模块的时候,Node.js 会解析 require 方法传入的参数,并从文件系统中加载实际的文件,加载过程中的包装和编译细节在前一节中已经介绍过,这里我们将详细描述查找文件模块的过程,其中,也有一些细节值得知晓。
    require方法接受以下几种参数的传递:
    • http、fs、path等,原生模块。
    • ./mod或../mod,相对路径的文件模块。
    • /pathtomodule/mod,绝对路径的文件模块。
    • mod,非原生模块的文件模块。
     
     
     
     
     
     

     

     

     

     

     
     
     
     
     
     
     
     
     
  • 相关阅读:
    生成器
    装饰器
    类的特殊方法
    获取对象的信息之反射
    获取对象信息之内置函数dir()
    获取对象的信息之内置函数type()
    获取对象的信息之内置函数issubclass() 和 isinstance()
    生成可下载图片
    js数组常用方法
    sql存储过程基本语法
  • 原文地址:https://www.cnblogs.com/yuwenxiang/p/13177426.html
Copyright © 2011-2022 走看看