首頁 >web前端 >js教程 >nodejs中模組以及方法的詳細介紹

nodejs中模組以及方法的詳細介紹

不言
不言原創
2018-08-14 16:48:442142瀏覽

這篇文章帶給大家的內容是關於nodejs中模組以及方法的詳細介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

1,模組載入規格

        ES6之前已經出現了js模組載入的方案,最主要的是CommonJS和AMD規格。 commonjs主要應用於伺服器,實作同步加載,如nodejs。 AMD規範應用於瀏覽器,如requirejs,為非同步載入。同時還有CMD規範,為同步載入方案如seaJS。

        Nodejs 有一個簡單的模組載入系統。在 Nodejs 中,檔案和模組是一一對應的(每個檔案被視為一個獨立的模組)。

        require方能看到的只有module.exports這個對象,它是看不到exports對象的,而我們在編寫模組時用到的exports對象實際上只是對module.exports的引用。

2,module.exports和exports

        Nodejs 中的每一個模組都會自動建立一個module 對象,同時module 物件下有一個叫exports 的屬性,可以將某個類別的實例賦值給module.exports,從而導出這個類別的實例。

        在模組執行前,Nodejs 會將 module.exports 的值賦於全域變數 exports ,以便 module.exports.f = ... 可以更簡潔的寫成 exports.f = ... 。注意:就像所有變數一樣,如果重新賦予exports 賦值,它就不再綁定到module.exports 了,也不會匯出指定模組

## 3,require的機制

假設Y是路徑,X是檔名或目錄名,當Nodejs 遇到require(Y X) 時,按照下面的順序處理:

  1、如果X是核心模組)內建模區塊之間從記憶體載入

           a.返回此模組(例如:require("http")

#      #     b. 2.如果Y是以「./」、「/」或「../」開頭(相對路徑和絕對路徑則被認為是檔案模組)

           a.將X當成文件,從指定路徑開始,依序查找下面文件:X、X.js、X.json、X.node,只要其中一個存在,就返回該文件,不再繼續執行

         b.把X當成目錄,從指定路徑開始,依序查找下面文件:X/package.json(main欄位)、X/index.js、X/index.json、X/index.node,只要其中一個存在,就返回該文件,不再繼續執行

  3、npm安裝的第三方模組,一個套件

               如果X 不是核心模組,也沒有以「./」、「/」或「../」開頭,則以Nodejs會從目前模組的父目錄開始,試著從它的/node_module 目錄裡載入模組,如果還是沒有找到,則移到再上一層父目錄,直到檔案系統的根目錄

  4.拋出「not found」

4,import和require的差別

        ES6標準發布後,module成為標準,標準的使用是以export指令(對外輸出本模組)導出接口,以import引入模組,但是在我們一貫的node模組中,我們採用的是CommonJS規範,使用require引入模組,使用module.exports導出介面。

        ES6在語言規格的層面上,實現了模組功能,而且實現得相當簡單,完全可以取代現有的CommonJS和AMD規範,成為瀏覽器和伺服器通用的模組解決方案。

        import的語法跟require不同,而且import必須放在檔案的最開始,且前面不允許有其他邏輯程式碼

import $ from 'jquery';
import * as _ from '_';
import {a,b,c} from './a';
import {default as alias, a as a_a, b, c} from './a';

        require的使用非常簡單,它相當於module.exports的傳送門,module.exports後面的內容是什麼,require的結果就是什麼,物件、數字、字串、函數…再把require的結果賦值給某個變量,相當於把require和module.exports進行平行空間的位置重疊。使用時,完全可以忽略模組化這個概念來使用require,僅僅把它當做一個node內建的全域函數,它的參數甚至可以是表達式

require('./a')(); // a模块是一个函数,立即执行a模块函数
var data = require('./a').data; // a模块导出的是一个对象
var a = require('./a')[0]; // a模块导出的是一个数组

5,node非同步程式設計I/0和事件循環

        Node.js 非同步程式設計的直接體現就是回呼。回調函數在完成任務後就會被調用,Node 使用了大量的回調函數,Node 所有 API 都支援回調函數。

        我們可以一邊讀取文件,一邊執行其他指令,在檔案讀取完成後,我們將檔案內容傳回作為回呼函數的參數。這樣在執行程式碼時就沒有阻塞或等待檔案 I/O 操作。這大大提高了 Node.js 的效能,可以處理大量的並發請求。

        Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

        Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.

6,nodejs事件系统 Node.js EventEmitter

        Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。EventEmitter 对象如果在实例化时发生错误,会触发 error 事件。当添加新的监听器时,newListener 事件会触发,当监听器被移除时,removeListener 事件被触发。

// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

方法:

       1,addListener(event, listener) 为指定事件添加一个监听器到监听器数组的尾部。

       2,on(event, listener) 为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。

       3,removeListener(event, listener) 移除指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。它接受两个参数,第一个是事件名称,第二个是回调函数名称。

        4,removeAllListeners([event]) 移除所有事件的所有监听器, 如果指定事件,则移除指定事件的所有监听器

        5, listeners(event) 返回指定事件的监听器数组。

        6,emit(event, [arg1], [arg2], [...]) 按参数的顺序执行每个监听器,如果事件有注册监听返回 true,否则返回 false。

7,nodejs文件系统

        异步和同步:Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。

方法:

       1、打开文件 fs.open(path, flags[, mode], callback)

       2、获取文件信息 fs.stat(path, callback)

        3、写入文件 fs.writeFile(file, data[, options], callback)

        4、读取文件 fs.read(fd, buffer, offset, length, position, callback)

             参数使用说明如下:

                     fd - 通过 fs.open() 方法返回的文件描述符。

                     buffer - 数据写入的缓冲区。

                     offset - 缓冲区写入的写入偏移量。

                     length - 要从文件中读取的字节数。

                     position - 文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取。

                    callback - 回调函数,有三个参数err, bytesRead, buffer,err 为错误信息, bytesRead 表示读取的字节数,buffer 为缓冲区对象。

        5、关闭文件 fs.close(fd, callback)

        6、截取文件 fs.ftruncate(fd, len, callback)

        7、删除文件 fs.unlink(path, callback)

        8、创建目录 fs.mkdir(path[, mode], callback)

        9、读取目录 fs.readdir(path, callback)

        10、删除目录 fs.rmdir(path, callback)

8、Node.js Stream(流)

        Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)。

        所有的 Stream 对象都是 EventEmitter 的实例。常用的事件有:

               data - 当有数据可读时触发。

               end - 没有更多的数据可读时触发。

               error - 在接收和写入过程中发生错误时触发。

               finish - 所有資料已寫入到底層系統時觸發。

1、建立可讀流

               var readerStream = fs.createReadStream('input.txt');

2、建立一個可以寫入的流,寫入到檔案output.txt 中

               var writerStream = fs.createWriteStream('output.txt');

#3、管道讀取和寫入操作,讀取input.txt 檔案內容,並將內容寫入到output.txt 文件中

               readerStream.pipe(writerStream);

4、壓縮input.txt 文件為input.txt.gz,鍊式流

fs.createReadStream('input.txt').pipe(zlib.createGzip()).pipe(fs.createWriteStream('input.txt.gz'));

5、解壓縮input.txt.gz檔案為input.txt

               fs.createReadStream('input.txt.gz').pipe(zlib.createGunzip()).pipe(fs.createWriteStream('input.txt'));#fs.

 

9、Node.js 全域物件

       JavaScript 中有一個特殊的對象,稱為全域物件(Global Object),它及其所有屬性都可以在程式的任何地方訪問,即全域變數。

          1、__filename __filename 表示目前正在執行的腳本的檔案名稱。它將輸出檔案所在位置的絕對路徑,且和命令列參數所指定的檔案名稱不一定相同。如果在模組中,傳回的值是模組檔案的路徑。

           2、__dirname __dirname 表示目前執行腳本所在的目錄。

          3、setTimeout(cb, ms) setTimeout(cb, ms) 全域函數在指定的毫秒(ms)數後執行指定函數(cb)。 :setTimeout() 只執行一次指定函數。傳回一個代表定時器的句柄值。

        4、clearTimeout(t) clearTimeout( t ) 全域函數用來停止一個先前透過 setTimeout() 建立的計時器。參數 t 是透過 setTimeout() 函數建立的定時器。

           5、setInterval(cb, ms) setInterval(cb, ms) 全域函數在指定的毫秒(ms)數後執行指定函數(cb)。

傳回一個代表定時器的句柄值。可以使用 clearInterval(t) 函數來清除定時器。 setInterval() 方法會不停地呼叫函數,直到 clearInterval() 被呼叫或視窗關閉。

           6、console console 用來提供控制台標準輸出,它是由 Internet Explorer 的 JScript 引擎提供的偵錯工具,後來逐漸成為瀏覽器的實作標準。

           7、process process 是一個全域變量,即 global 物件的屬性。它用於描述當前Node.js 進程狀態的對象,提供了一個與作業系統的簡單介面。重要屬性包括標準輸入輸出流stdin和stdout

 相關推薦:

#reac如何t實現更換皮膚顏色的功能

js實作頁間資料傳遞的程式碼

以上是nodejs中模組以及方法的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn