日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

NodeJs(尚硅谷视频学习笔记)

發(fā)布時(shí)間:2023/12/31 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NodeJs(尚硅谷视频学习笔记) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

內(nèi)容來(lái)自尚硅谷Nodejs學(xué)習(xí)課件以及自己添加

課前預(yù)熱:CMD基本知識(shí)

1.命令行窗口(小黑屏)、CMD窗口、終端、shell

- 開(kāi)始菜單 --> 運(yùn)行 --> CMD --> 回車 - Win + R --> CMD --> 回車 - 常用的指令dir 列出當(dāng)前目錄下的所有文件cd 目錄名 進(jìn)入到指定的目錄md 目錄名 創(chuàng)建一個(gè)文件夾rd 目錄名 刪除一個(gè)文件夾 -目錄. 表示當(dāng)前目錄.. 表示上一級(jí)目錄 -環(huán)境變量(window系統(tǒng)中的變量 )PATH 一個(gè)個(gè)的路徑C:\Program Files\Microsoft SQL Server\130\Tools\Binn\- 當(dāng)我們?cè)诿钚写翱诖蜷_(kāi)一個(gè)文件,或調(diào)用一個(gè)程序時(shí),系統(tǒng)會(huì)首先在當(dāng)前目錄下尋找文件程序,如果找到了則直接打開(kāi)如果沒(méi)有找到則會(huì)依次到環(huán)境變量path的路徑中尋找,直到找到為止如果沒(méi)找到則報(bào)錯(cuò)類似于作用域鏈-所以我們可以將一些經(jīng)常需要訪問(wèn)的程序和文件的路徑添加到path中,這樣我們就可以在任意位置來(lái)訪問(wèn)這些文件和程序了

2.進(jìn)程和線程

進(jìn)程- 進(jìn)程負(fù)責(zé)為程序的運(yùn)行提供必備的環(huán)境- 進(jìn)程就相當(dāng)于工廠中的車間線程- 線程是計(jì)算機(jī)中最小的計(jì)算單位,線程負(fù)責(zé)執(zhí)行進(jìn)程中的程序- 線程就相當(dāng)于工廠中的工人 單線程JS是單線程,在執(zhí)行JS代碼的時(shí)候網(wǎng)頁(yè)是停止渲染的。 多線程主流的語(yǔ)言,如Java

Node.js簡(jiǎn)介

? Node.js是一個(gè)能夠在服務(wù)器端運(yùn)行JavaScript的開(kāi)放源代碼、跨平臺(tái)JavaScript運(yùn)行環(huán)境

? Node采用Google開(kāi)發(fā)的V8引擎運(yùn)行js代碼,使用事件驅(qū)動(dòng)非阻塞異步I/O模型等技術(shù)來(lái)提高性能,可優(yōu)化應(yīng)用程序的傳輸量和規(guī)模。

? Node大部分基本模塊都用JavaScript編寫。在Node出現(xiàn)之前,JS通常作為客戶端程序設(shè)計(jì)語(yǔ)言使用,以JS寫出的程序常在用戶的瀏覽器上運(yùn)行。

? 目前,Node已被IBM、Microsoft、Yahoo!、Walmart、Groupon、SAP、 LinkedIn、Rakuten、PayPal、Voxer和GoDaddy等企業(yè)采用。

? Node主要用于編寫像Web服務(wù)器一樣的網(wǎng)絡(luò)應(yīng)用,這和PHP和Python是類似的。

? 但是Node與其他語(yǔ)言最大的不同之處在于,PHP等語(yǔ)言是阻塞的而Node是非阻塞的。

? Node是事件驅(qū)動(dòng)的。開(kāi)發(fā)者可以在不使用線程的情況下開(kāi)發(fā)出一個(gè)能夠承載高并發(fā)的服務(wù)器。其他服務(wù)器端語(yǔ)言難以開(kāi)發(fā)高并發(fā)應(yīng)用,而且即使開(kāi)發(fā)出來(lái),性能也不盡人意。

? Node正是在這個(gè)前提下被創(chuàng)造出來(lái)。

? Node把JS的易學(xué)易用和Unix網(wǎng)絡(luò)編程的強(qiáng)大結(jié)合到了一起。

? Node.js允許通過(guò)JS和一系列模塊來(lái)編寫服務(wù)器端應(yīng)用和網(wǎng)絡(luò)相關(guān)的應(yīng)用。

? 核心模塊包括文件系統(tǒng)I/O、網(wǎng)絡(luò)(HTTP、TCP、UDP、DNS、TLS/SSL等)、二進(jìn)制數(shù)據(jù)流、加密算法、數(shù)據(jù)流等等。Node模塊的API形式簡(jiǎn)單,降低了編程的復(fù)雜度。

? 使用框架可以加速開(kāi)發(fā)。常用的框架有Express.js、Socket.IO和Connect等。Node.js的程序可以在Microsoft Windows、Linux、Unix、Mac OS X等服務(wù)器上運(yùn)行。

? Node.js也可以使用CoffeeScript、TypeScript、Dart語(yǔ)言,以及其他能夠編譯成JavaScript的語(yǔ)言編程。

Node的用途

? Web服務(wù)API,比如REST
? 實(shí)時(shí)多人游戲
? 后端的Web服務(wù),例如跨域、服務(wù)器端的請(qǐng)求
? 基于Web的應(yīng)用
? 多客戶端的通信,如即時(shí)通信

簡(jiǎn)介總結(jié)

I/O (Input/Output)- I/O操作指的是對(duì)磁盤的讀寫操作Node- Node是對(duì)ES標(biāo)準(zhǔn)一個(gè)實(shí)現(xiàn),Node也是一個(gè)JS引擎- 通過(guò)Node可以使js代碼在服務(wù)器端執(zhí)行- Node僅僅對(duì)ES標(biāo)準(zhǔn)進(jìn)行了實(shí)現(xiàn),所以在Node中不包含DOM 和 BOM - Node中可以使用所有的內(nèi)建對(duì)象String Number Boolean Math Date RegExp Function Object Array而B(niǎo)OM和DOM都不能使用但是可以使用 console 也可以使用定時(shí)器(setTimeout() setInterval())- Node可以在后臺(tái)來(lái)編寫服務(wù)器Node編寫服務(wù)器都是單線程的服務(wù)器- 進(jìn)程- 進(jìn)程就是一個(gè)一個(gè)的工作計(jì)劃(工廠中的車間)- 線程- 線程是計(jì)算機(jī)最小的運(yùn)算單位(工廠中的工人)線程是干活的- 傳統(tǒng)的服務(wù)器都是多線程的- 每進(jìn)來(lái)一個(gè)請(qǐng)求,就創(chuàng)建一個(gè)線程去處理請(qǐng)求- Node的服務(wù)器單線程的- Node處理請(qǐng)求時(shí)是單線程,但是在后臺(tái)擁有一個(gè)I/O線程池

在VScode中調(diào)出終端查看node.js代碼執(zhí)行

使用快捷鍵: ctrl + ·

COMMONJS規(guī)范

ECMAScript標(biāo)準(zhǔn)的缺陷

? 沒(méi)有模塊系統(tǒng)
? 標(biāo)準(zhǔn)庫(kù)較少
? 沒(méi)有標(biāo)準(zhǔn)接口
? 缺乏管理系統(tǒng)

模塊化

? 如果程序設(shè)計(jì)的規(guī)模達(dá)到了一定程度,則必須對(duì)其進(jìn)行模塊化。

? 模塊化可以有多種形式,但至少應(yīng)該提供能夠?qū)⒋a分割為多個(gè)源文件的機(jī)制。

? CommonJS 的模塊功能可以幫我們解決該問(wèn)題。

CommonJS規(guī)范

? CommonJS規(guī)范的提出,主要是為了彌補(bǔ)當(dāng)前JavaScript沒(méi)有模塊化標(biāo)準(zhǔn)的缺陷。

? CommonJS規(guī)范為JS指定了一個(gè)美好的愿景,希望JS能夠在任何地方運(yùn)行。

? CommonJS對(duì)模塊的定義十分簡(jiǎn)單:

– 模塊引用
– 模塊定義
– 模塊標(biāo)識(shí)

模塊引用

? 在規(guī)范中,定義了require()方法,這個(gè)方法接手模塊標(biāo)識(shí),以此將一個(gè)模塊引入到當(dāng)前運(yùn)行環(huán)境中。

? 模塊引用的示例代碼:
– var math = require(‘math’);

模塊定義

? 在運(yùn)行環(huán)境中,提供了exports對(duì)象用于導(dǎo)出當(dāng)前模塊的方法或者變量,并且它是唯一的導(dǎo)出的出口。

? 在模塊中還存在一個(gè)module對(duì)象,它代表模塊自身,而exports是module的屬性。

? 在Node中一個(gè)文件就是一個(gè)模塊。

exports.xxx = function() {}; module.exports = {};

模塊標(biāo)識(shí)

? 模塊標(biāo)識(shí)其實(shí)就是模塊的名字,也就是傳遞給require()方法的參數(shù),它必須是符合駝峰命名法的字符串,或者是以.、…開(kāi)頭的相對(duì)路徑、或者絕對(duì)路徑。

? 模塊的定義十分簡(jiǎn)單,接口也十分簡(jiǎn)潔。每個(gè)模塊具有獨(dú)立的空間,它們互不干擾,在引用時(shí)也顯得干凈利落。

模塊化總結(jié)

模塊化- 在Node中,一個(gè)js文件就是一個(gè)模塊- 在Node中,每一個(gè)js文件中的js代碼都是獨(dú)立運(yùn)行在一個(gè)函數(shù)中而不是全局作用域,所以一個(gè)模塊的中的變量和函數(shù)在其他模塊中無(wú)法訪問(wèn)03module.js//引入其他的模塊 /* 在node中,通過(guò)require()函數(shù)來(lái)引入外部的模塊require()可以傳遞一個(gè)文件的路徑作為參數(shù),node將會(huì)自動(dòng)根據(jù)該路徑來(lái)引入外部模塊這里路徑,如果使用相對(duì)路徑,必須以.或..開(kāi)頭使用require()引入模塊以后,該函數(shù)會(huì)返回一個(gè)對(duì)象,這個(gè)對(duì)象代表的是引入的模塊我們使用require()引入外部模塊時(shí),使用的就是模塊標(biāo)識(shí),我們可以通過(guò)模塊標(biāo)識(shí)來(lái)找到指定的模塊 - 模塊分成兩大類核心模塊- 由node引擎提供的模塊- 核心模塊的標(biāo)識(shí)就是,模塊的名字- 示例:var fs = require("fs");文件模塊- 由用戶自己創(chuàng)建的模塊- 文件模塊的標(biāo)識(shí)就是文件的路徑(絕對(duì)路徑,相對(duì)路徑)相對(duì)路徑使用.或..開(kāi)頭*/ //var md = require("./02.module"); var math = require("./math"); var fs = require("fs");//console.log(md); console.log(math.add(123,456)); //console.log(fs);02module.js /* 我們可以通過(guò) exports 來(lái)向外部暴露變量和方法 只需要將需要暴露給外部的變量或方法設(shè)置為exports的屬性即可 */ //向外部暴露屬性或方法 exports.x = "我是02.module.js中的x"; exports.y = "我是y"; exports.fn = function () {};04module.js /* 在node中有一個(gè)全局對(duì)象 global,它的作用和網(wǎng)頁(yè)中window類似在全局中創(chuàng)建的變量都會(huì)作為global的屬性保存在全局中創(chuàng)建的函數(shù)都會(huì)作為global的方法保存當(dāng)node在執(zhí)行模塊中的代碼時(shí),它會(huì)首先在代碼的最頂部,添加如下代碼function (exports, require, module, __filename, __dirname) {在代碼的最底部,添加如下代碼}實(shí)際上模塊中的代碼都是包裝在一個(gè)函數(shù)中執(zhí)行的,并且在函數(shù)執(zhí)行時(shí),同時(shí)傳遞進(jìn)了5個(gè)實(shí)參exports- 該對(duì)象用來(lái)將變量或函數(shù)暴露到外部require- 函數(shù),用來(lái)引入外部的模塊module- module代表的是當(dāng)前模塊本身- exports就是module的屬性- 既可以使用 exports 導(dǎo)出,也可以使用module.exports導(dǎo)出__filenameC:\Users\lilichao\WebstormProjects\class0705\01.node\04.module.js- 當(dāng)前模塊的完整路徑__dirnameC:\Users\lilichao\WebstormProjects\class0705\01.node- 當(dāng)前模塊所在文件夾的完整路徑*/ //console.log(global.a); /*arguments.callee- 這個(gè)屬性保存的是當(dāng)前執(zhí)行的函數(shù)對(duì)象 */ //console.log(arguments.callee + ""); //console.log(arguments.length);//console.log(exports); //console.log(module.exports == exports);console.log(__dirname);05module.js /* exports 和 module.exports- 通過(guò)exports只能使用.的方式來(lái)向外暴露內(nèi)部變量exports.xxx = xxx- 而module.exports既可以通過(guò).的形式,也可以直接賦值module.exports.xxx = xxxxmodule.exports = {}*/

Node的模塊實(shí)現(xiàn)

? Node中雖然使用的是CommonJS規(guī)范,但是其自身也對(duì)規(guī)范做了一些取舍。

? 在Node中引入模塊,需要經(jīng)歷如下3個(gè)步驟:
– 路徑分析
– 文件定位
– 編譯執(zhí)行

? 在Node中,模塊分為三類:一類是底層由C++編寫的內(nèi)建模塊,一類是Node提供的核心模塊;還有一類是用戶編寫的模塊,稱為文件模塊。

包 package

? CommonJS的包規(guī)范允許我們將一組相關(guān)的模塊組合到一起,形成一組完整的工具。

? CommonJS的包規(guī)范由包結(jié)構(gòu)和包描述文件兩個(gè)部分組成。

? 包結(jié)構(gòu)
– 用于組織包中的各種文件

? 包描述文件
– 描述包的相關(guān)信息,以供外部讀取分析

包結(jié)構(gòu)

? 包實(shí)際上就是一個(gè)壓縮文件,解壓以后還原為目錄。符合規(guī)范的目錄,應(yīng)該包含如下文件:

– package.json 描述文件
– bin 可執(zhí)行二進(jìn)制文件
– lib js代碼
– doc 文檔
– test 單元測(cè)試

包描述文件

? 包描述文件用于表達(dá)非代碼相關(guān)的信息,它是一個(gè)JSON格式的文件 – package.json,位于包的根目錄下,是包的重要組成部分。

? package.json中的字段

– name、description、version、keywords、maintainers、contributors、bugs、licenses、repositories、dependencies、homepage、os、cpu、engine、builtin、directories、implements、scripts、author、bin、main、devDependencies。

在JSON文件不能寫注釋

NPM(Node Package Manager)

? CommonJS包規(guī)范是理論,NPM是其中一種實(shí)踐。

? 對(duì)于Node而言,NPM幫助其完成了第三方模塊的發(fā)布、安裝和依賴等。借助NPM,Node與第三方模塊之間形成了很好的一個(gè)生態(tài)系統(tǒng)。

NPM命令

? npm –v
– 查看版本
? npm
– 幫助說(shuō)明
? npm search 包名
– 搜索模塊包
? npm install
–下載當(dāng)前項(xiàng)目所依賴的包
? npm install 包名
– 在當(dāng)前目錄安裝包
? npm install 包名 –g
– 全局模式安裝包(全局安裝的包一般都是一些工具)
? npm remove 包名
– 刪除一個(gè)模塊
? npm install 包名 --save
– 安裝包并添加到依賴中
? npm install 文件路徑
– 從本地安裝
? npm install 包名 –registry=地址
– 從鏡像源安裝
? npm config set registry 地址
– 設(shè)置鏡像源

NPM總結(jié)筆記

/*通過(guò)npm下載的包都放到node_modules文件夾中我們通過(guò)npm下載的包,直接通過(guò)包名引入即可node在使用模塊名字來(lái)引入模塊時(shí),它會(huì)首先在當(dāng)前目錄的node_modules中尋找是否含有該模塊如果有則直接使用,如果沒(méi)有則去上一級(jí)目錄的node_modules中尋找如果有則直接使用,如果沒(méi)有則再去上一級(jí)目錄尋找,直到找到為止直到找到磁盤的根目錄,如果依然沒(méi)有,則報(bào)錯(cuò)*/

Buffer(緩沖區(qū))

? 從結(jié)構(gòu)上看Buffer非常像一個(gè)數(shù)組,它的元素為16進(jìn)制的兩位數(shù)。
JS數(shù)組性能比其他語(yǔ)言的數(shù)組差

? 實(shí)際上一個(gè)元素就表示內(nèi)存中的一個(gè)字節(jié)。

? 實(shí)際上Buffer中的內(nèi)存不是通過(guò)JavaScript分配的,而是在底層通過(guò)C++申請(qǐng)的。

? 也就是我們可以直接通過(guò)Buffer來(lái)創(chuàng)建內(nèi)存中的空間。

Buffer的操作

? 使用Buffer保存字符串

let str = "你好 atguigu"; let buf = Buffer.from(str , "utf-8");

? 創(chuàng)建指定大小的Buffer對(duì)象

let buf3 = Buffer.alloc(1024*8)

Buffer的轉(zhuǎn)換

Buffer與字符串間的轉(zhuǎn)換

– 支持的編碼:
? ASCII、UTF-8、UTF-16LE/UCS-2、Base64、Binary、Hex

– 字符串轉(zhuǎn)Buffer
? Buffer.from(str , [encoding]);

– Buffer轉(zhuǎn)字符串
? buf.toString([encoding] , [start] , [end]);

寫入操作

? 向緩沖區(qū)中寫入字符串
– buf.write(string[, offset[, length]][, encoding])

? 替換指定索引位置的數(shù)據(jù)
– buf[index]

? 將指定值填入到緩沖區(qū)的指定位置
– buf.fill(value[, offset[, end]][, encoding])

讀取操作

? 將緩沖區(qū)中的內(nèi)容,轉(zhuǎn)換為一個(gè)字符串返回
– buf.toString([encoding[, start[, end]]])

? 讀取緩沖區(qū)指定索引的內(nèi)容
– buf[index]

其他操作

? 復(fù)制緩沖區(qū)
– buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])

? 對(duì)緩沖區(qū)切片
– buf.slice([start[, end]])

? 拼接緩沖區(qū)
– Buffer.concat(list[, totalLength])

Buffer總結(jié)筆記

/*Buffer(緩沖區(qū))- Buffer的結(jié)構(gòu)和數(shù)組很像,操作的方法也和數(shù)組類似- 數(shù)組中不能存儲(chǔ)二進(jìn)制的文件,而buffer就是專門用來(lái)存儲(chǔ)二進(jìn)制數(shù)據(jù)- 使用buffer不需要引入模塊,直接使用即可- 在buffer中存儲(chǔ)的都是二進(jìn)制數(shù)據(jù),但是在顯示時(shí)都是以16進(jìn)制的形式顯示buffer中每一個(gè)元素的范圍是從00 - ff 0 - 25500000000 - 11111111計(jì)算機(jī) 一個(gè)0 或一個(gè)1 我們稱為1位(bit)8bit = 1byte(字節(jié))1024byte = 1kb1024kb = 1mb1024mb = 1gb1024gb = 1tbbuffer中的一個(gè)元素,占用內(nèi)存的一個(gè)字節(jié)- Buffer的大小一旦確定,則不能修改,Buffer實(shí)際上是對(duì)底層內(nèi)存的直接操作*/var str = "Hello 尚硅谷";//將一個(gè)字符串保存到buffer中 var buf = Buffer.from(str); //創(chuàng)建一個(gè)指定大小的buffer //buffer構(gòu)造函數(shù)都是不推薦使用的 //var buf2 = new Buffer(10);//10個(gè)字節(jié)的buffer //console.log(buf2.length);//創(chuàng)建一個(gè)10個(gè)字節(jié)的buffer var buf2 = Buffer.alloc(10); //通過(guò)索引,來(lái)操作buf中的元素 buf2[0] = 88; buf2[1] = 255; buf2[2] = 0xaa; buf2[3] = 255;//只要數(shù)字在控制臺(tái)或頁(yè)面中輸出一定是10進(jìn)制 //console.log(buf2[2].toString(16));/*for(var i=0 ; i<buf2.length ; i++){console.log(buf2[i]); }*///Buffer.allocUnsafe(size) 創(chuàng)建一個(gè)指定大小的buffer,但是buffer中可能含有敏感數(shù)據(jù) /*var buf3 = Buffer.allocUnsafe(10); console.log(buf3);*//*Buffer.from(str) 將一個(gè)字符串轉(zhuǎn)換為bufferBuffer.alloc(size) 創(chuàng)建一個(gè)指定大小的BufferBuffer.alloUnsafe(size) 創(chuàng)建一個(gè)指定大小的Buffer,但是可能包含敏感數(shù)據(jù)buf.toString() 將緩沖區(qū)中的數(shù)據(jù)轉(zhuǎn)換為字符串*/var buf4 = Buffer.from("我是一段文本數(shù)據(jù)");console.log(buf4.toString());

fs(文件系統(tǒng))

? 在Node中,與文件系統(tǒng)的交互是非常重要的,服務(wù)器的本質(zhì)就將本地的文件發(fā)送給遠(yuǎn)程的客戶端

? Node通過(guò)fs模塊來(lái)和文件系統(tǒng)進(jìn)行交互

? 該模塊提供了一些標(biāo)準(zhǔn)文件訪問(wèn)API來(lái)打開(kāi)、讀取、寫入文件,以及與其交互。

? 要使用fs模塊,首先需要對(duì)其進(jìn)行加載
– const fs = require("fs");

同步和異步調(diào)用

? fs模塊中所有的操作都有兩種形式可供選擇同步和異步。

? 同步文件系統(tǒng)會(huì)阻塞程序的執(zhí)行,也就是除非操作完畢,否則不會(huì)向下執(zhí)行代碼。

? 異步文件系統(tǒng)不會(huì)阻塞程序的執(zhí)行,而是在操作完成時(shí),通過(guò)回調(diào)函數(shù)將結(jié)果返回。

打開(kāi)和關(guān)閉文件

? 打開(kāi)文件

– fs.open(path, flags[, mode], callback) – fs.openSync(path, flags[, mode])

? 關(guān)閉文件

– fs.close(fd, callback) – fs.closeSync(fd)

打開(kāi)狀態(tài)

寫入文件

? fs中提供了四種不同的方式將數(shù)據(jù)寫入文件
– 簡(jiǎn)單文件寫入
– 同步文件寫入
– 異步文件寫入
– 流式文件寫入

簡(jiǎn)單文件寫入

? fs.writeFile(file, data[, options], callback)
? fs.writeFileSync(file, data[, options])
? 參數(shù):
– file 文件路徑
– data 被寫入的內(nèi)容,可以是String或Buffer
– options 對(duì)象,包含屬性(encoding、mode、flag)
– callback 回調(diào)函數(shù)

同步文件寫入

? fs.writeSync(fd, buffer, offset, length[, position])
? fs.writeSync(fd, data[, position[, encoding]])
? 要完成同步寫入文件,先需要通過(guò)openSync()打開(kāi)文件來(lái)獲取一個(gè)文件描述符,然后在通過(guò)writeSync()寫入文件。
? 參數(shù)
– fd 文件描述符,通過(guò)openSync()獲取
– data 要寫入的數(shù)據(jù)(String 或 Buffer)
– offset buffer寫入的偏移量
– length 寫入的長(zhǎng)度
– position 寫入的起始位置
– encoding 寫入編碼

異步文件寫入

? fs.write(fd, buffer, offset, length[, position], callback)
? fs.write(fd, data[, position[, encoding]], callback)
? 要使用異步寫入文件,先需要通過(guò)open()打開(kāi)文件,然后在回調(diào)函數(shù)中通過(guò)write()寫入。
? 參數(shù):
– fd 文件描述符
– data 要寫入的數(shù)據(jù)(String 或 Buffer)
– offset buffer寫入的偏移量
– length 寫入的長(zhǎng)度
– position 寫入的起始位置
– encoding 寫入編碼

流式文件寫入

? 往一個(gè)文件中寫入大量數(shù)據(jù)時(shí),最好的方法之一是使用流。
? 若要將數(shù)據(jù)異步傳送到文件,首需要使用以下語(yǔ)法創(chuàng)建一個(gè)Writable對(duì)象:
– fs.createWriteStream(path[, options])
? path 文件路徑
? options {encoding:"",mode:"",flag:""}
? 一旦你打開(kāi)了Writable文件流,就可以使用write()方法來(lái)寫入它,寫入完成后,在調(diào)用end()方法來(lái)關(guān)閉流。

讀取文件

? fs中提供了四種讀取文件的方式
– 簡(jiǎn)單文件讀取
– 同步文件讀取
– 異步文件讀取
– 流式文件讀取

簡(jiǎn)單文件讀取

? fs.readFile(file[, options], callback)
? fs.readFileSync(file[, options])
– 參數(shù):
? file 文件路徑或文件描述符

? options <Object> | <String> – encoding <String> | <Null> 默認(rèn) = null – flag <String> 默認(rèn) = 'r' ? callback 回調(diào)函數(shù),有兩個(gè)參數(shù)err 、data

同步文件讀取

? fs.readSync(fd, buffer, offset, length, position)
– 參數(shù):
? fd 文件描述符
? buffer 讀取文件的緩沖區(qū)
? offset buffer的開(kāi)始寫入的位置
? length 要讀取的字節(jié)數(shù)
? position 開(kāi)始讀取文件的位置

異步文件讀取

? fs.read(fd, buffer, offset, length, position, callback)
– 參數(shù):
? fd 文件描述符
? buffer 讀取文件的緩沖區(qū)
? offset buffer的開(kāi)始寫入的位置
? length 要讀取的字節(jié)數(shù)
? position 開(kāi)始讀取文件的位置
? callback 回調(diào)函數(shù) 參數(shù)err , bytesRead , buffer

流式文件讀取

? 從一個(gè)文件中讀取大量的數(shù)據(jù)時(shí),最好的方法之一就是流式讀取,這樣將把一個(gè)文件作為Readable流的形式打開(kāi)。
? 要從異步從文件傳輸數(shù)據(jù),首先需要通過(guò)以下語(yǔ)法創(chuàng)建一個(gè)Readable流對(duì)象:
– fs.createReadStream(path[, options])
? path 文件路徑
? options {encoding:"",mode:"",flag:""}
? 當(dāng)你打開(kāi)Readable文件流以后,可以通過(guò)readable事件和read()請(qǐng)求,或通過(guò)data事件處理程序輕松地從它讀出。

其他操作

? 驗(yàn)證路徑是否存在
– fs.exists(path,callback)
– fs.existsSync(path)
? 獲取文件信息
– fs.stat(path, callback)
– fs.statSync(path)
? 刪除文件
– fs.unlink(path, callback)
– fs.unlinkSync(path)
? 列出文件
– fs.readdir(path[, options], callback)
– fs.readdirSync(path[, options])
? 截?cái)辔募?br /> – fs.truncate(path, len, callback)
– fs.truncateSync(path, len)
? 建立目錄
– fs.mkdir(path[, mode], callback)
– fs.mkdirSync(path[, mode])
? 刪除目錄
– fs.rmdir(path, callback)
– fs.rmdirSync(path)
? 重命名文件和目錄
– fs.rename(oldPath, newPath, callback)
– fs.renameSync(oldPath, newPath)
? 監(jiān)視文件更改寫入
– fs.watchFile(filename[, options], listener)

fs總結(jié)筆記

/*文件系統(tǒng)(File System)- 文件系統(tǒng)簡(jiǎn)單來(lái)說(shuō)就是通過(guò)Node來(lái)操作系統(tǒng)中的文件- 使用文件系統(tǒng),需要先引入fs模塊,fs是核心模塊,直接引入不需要下載同步文件的寫入- 手動(dòng)操作的步驟1.打開(kāi)文件fs.openSync(path, flags[, mode])- path 要打開(kāi)文件的路徑- flags 打開(kāi)文件要做的操作的類型r 只讀的w 可寫的- mode 設(shè)置文件的操作權(quán)限,一般不傳返回值:- 該方法會(huì)返回一個(gè)文件的描述符作為結(jié)果,我們可以通過(guò)該描述符來(lái)對(duì)文件進(jìn)行各種操作2.向文件中寫入內(nèi)容fs.writeSync(fd, string[, position[, encoding]])- fd 文件的描述符,需要傳遞要寫入的文件的描述符- string 要寫入的內(nèi)容- position 寫入的起始位置- encoding 寫入的編碼,默認(rèn)utf-83.保存并關(guān)閉文件fs.closeSync(fd)- fd 要關(guān)閉的文件的描述符*/ var fs = require("fs");//打開(kāi)文件 var fd = fs.openSync("hello.txt" , "w");//向文件中寫入內(nèi)容 fs.writeSync(fd , "今天天氣真不錯(cuò)~~~", 2);//關(guān)閉文件 fs.closeSync(fd);console.log("程序向下執(zhí)行~~~"); /**異步文件寫入fs.open(path, flags[, mode], callback)- 用來(lái)打開(kāi)一個(gè)文件- 異步調(diào)用的方法,結(jié)果都是通過(guò)回調(diào)函數(shù)的參數(shù)返回的- 回調(diào)函數(shù)兩個(gè)參數(shù):err 錯(cuò)誤對(duì)象,如果沒(méi)有錯(cuò)誤則為nullfd 文件的描述符fs.write(fd, string[, position[, encoding]], callback)- 用來(lái)異步寫入一個(gè)文件fs.close(fd, callback)- 用來(lái)關(guān)閉文件*///引入fs模塊 var fs = require("fs");//打開(kāi)文件 fs.open("hello2.txt","w",function (err , fd) {//判斷是否出錯(cuò)if(!err){//如果沒(méi)有出錯(cuò),則對(duì)文件進(jìn)行寫入操作fs.write(fd,"這是異步寫入的內(nèi)容",function (err) {if(!err){console.log("寫入成功~~");}//關(guān)閉文件fs.close(fd , function (err) {if(!err){console.log("文件已關(guān)閉~~~");}});});}else{console.log(err);} });console.log("程序向下執(zhí)行~~~"); /*簡(jiǎn)單文件寫入fs.writeFile(file, data[, options], callback)fs.writeFileSync(file, data[, options])- file 要操作的文件的路徑- data 要寫入的數(shù)據(jù)- options 選項(xiàng),可以對(duì)寫入進(jìn)行一些設(shè)置- callback 當(dāng)寫入完成以后執(zhí)行的函數(shù)- flagr 只讀w 可寫a 追加*/ //引入fs模塊 var fs = require("fs");/*fs.writeFile("hello3.txt","這是通過(guò)writeFile寫入的內(nèi)容",{flag:"r+"} , function (err) {if(!err){console.log("寫入成功~~~");}else{console.log(err);} });*///C:\Users\lilichao\Desktop\hello.txt //C:\\Users\\lilichao\\Desktop\\hello.txtfs.writeFile("C:/Users/lilichao/Desktop/hello.txt","這是通過(guò)writeFile寫入的內(nèi)容",{flag:"w"} , function (err) {if(!err){console.log("寫入成功~~~");}else{console.log(err);} }); /*同步、異步、簡(jiǎn)單文件的寫入都不適合大文件的寫入,性能較差,容易導(dǎo)致內(nèi)存溢出*/ var fs = require("fs");//流式文件寫入 //創(chuàng)建一個(gè)可寫流 /*fs.createWriteStream(path[, options])- 可以用來(lái)創(chuàng)建一個(gè)可寫流- path,文件路徑- options 配置的參數(shù)*/ var ws = fs.createWriteStream("hello3.txt");//可以通過(guò)監(jiān)聽(tīng)流的open和close事件來(lái)監(jiān)聽(tīng)流的打開(kāi)和關(guān)閉 /*on(事件字符串,回調(diào)函數(shù))- 可以為對(duì)象綁定一個(gè)事件once(事件字符串,回調(diào)函數(shù))- 可以為對(duì)象綁定一個(gè)一次性的事件,該事件將會(huì)在觸發(fā)一次以后自動(dòng)失效* */ ws.once("open",function () {console.log("流打開(kāi)了~~~"); });ws.once("close",function () {console.log("流關(guān)閉了~~~"); });//通過(guò)ws向文件中輸出內(nèi)容 ws.write("通過(guò)可寫流寫入文件的內(nèi)容"); ws.write("今天天氣真不錯(cuò)"); ws.write("鋤禾日當(dāng)午"); ws.write("紅掌撥清清"); ws.write("清清真漂亮");//關(guān)閉流,關(guān)閉寫的那個(gè)文件的管口 ws.end(); //關(guān)閉流,關(guān)閉讀的那個(gè)文件的管口 /*1.同步文件讀取2.異步文件讀取3.簡(jiǎn)單文件讀取fs.readFile(path[, options], callback)fs.readFileSync(path[, options])- path 要讀取的文件的路徑- options 讀取的選項(xiàng)- callback回調(diào)函數(shù),通過(guò)回調(diào)函數(shù)將讀取到內(nèi)容返回(err , data)err 錯(cuò)誤對(duì)象data 讀取到的數(shù)據(jù),會(huì)返回一個(gè)Buffer4.流式文件讀取*/var fs = require("fs");var path = "C:/Users/lilichao/Desktop/筆記.mp3";fs.readFile("an.jpg" , function (err , data) {if(!err){//console.log(data);//將data寫入到文件中fs.writeFile("C:/Users/lilichao/Desktop/hello.jpg",data,function(err){if(!err){console.log("文件寫入成功");}} );} }); /*流式文件讀取也適用于一些比較大的文件,可以分多次將文件讀取到內(nèi)存中*/var fs = require("fs");//創(chuàng)建一個(gè)可讀流 var rs = fs.createReadStream("C:/Users/lilichao/Desktop/筆記.mp3"); //創(chuàng)建一個(gè)可寫流 var ws = fs.createWriteStream("a.mp3");//監(jiān)聽(tīng)流的開(kāi)啟和關(guān)閉 rs.once("open",function () {console.log("可讀流打開(kāi)了~~"); });rs.once("close",function () {console.log("可讀流關(guān)閉了~~");//數(shù)據(jù)讀取完畢,關(guān)閉可寫流ws.end(); });ws.once("open",function () {console.log("可寫流打開(kāi)了~~"); });ws.once("close",function () {console.log("可寫流關(guān)閉了~~"); });//如果要讀取一個(gè)可讀流中的數(shù)據(jù),必須要為可讀流綁定一個(gè)data事件,data事件綁定完畢,它會(huì)自動(dòng)開(kāi)始讀取數(shù)據(jù) rs.on("data", function (data) {//console.log(data);//將讀取到的數(shù)據(jù)寫入到可寫流中ws.write(data); }); /*流式文件讀取也適用于一些比較大的文件,可以分多次將文件讀取到內(nèi)存中*/var fs = require("fs");//創(chuàng)建一個(gè)可讀流 var rs = fs.createReadStream("C:/Users/lilichao/Desktop/筆記.mp3"); //創(chuàng)建一個(gè)可寫流 var ws = fs.createWriteStream("b.mp3");//pipe()可以將可讀流中的內(nèi)容,直接輸出到可寫流中 rs.pipe(ws); node- 包(package)- 將多個(gè)模塊組合為一個(gè)完整的功能,就是一個(gè)包- 包結(jié)構(gòu)bin- 二進(jìn)制的可執(zhí)行文件,一般都是一些工具包中才有l(wèi)ib- js文件doc- 文檔test- 測(cè)試代碼package.json- 包的描述文件- package.json - 它是一個(gè)json格式的文件,在它里面保存了包各種相關(guān)的信息name 包名version 版本dependencies 依賴main 包的主要的文件bin 可執(zhí)行文件- npm(Node Package Manager node的包管理器)- 通過(guò)npm可以對(duì)node中的包進(jìn)行上傳、下載、搜索等操作- npm會(huì)在安裝完node以后,自動(dòng)安裝- npm的常用指令npm -v 查看npm的版本npm version 查看所有模塊的版本npm init 初始化項(xiàng)目(創(chuàng)建package.json)npm i/install 包名 安裝指定的包npm i/install 包名 --save 安裝指定的包并添加依賴npm i/install 包名 -g 全局安裝(一般都是一些工具)npm i/install 安裝當(dāng)前項(xiàng)目所依賴的包npm s/search 包名 搜索包 npm r/remove 包名 刪除一個(gè)包文件系統(tǒng)(File System)- Buffer(緩沖區(qū))- Buffer和數(shù)組的結(jié)構(gòu)的非常類似,Buffer是用來(lái)存儲(chǔ)二進(jìn)制數(shù)據(jù)的- Buffer的方法- Buffer.from(字符串)- 將一個(gè)字符串中內(nèi)容保存到一個(gè)buffer中- buf.toString()- 將buffer轉(zhuǎn)換為一個(gè)字符串- Buffer.alloc(size)- 創(chuàng)建一個(gè)指定大小的buffer對(duì)象- Buffer.allocUnsafe(size)- 創(chuàng)建一個(gè)指定大小的buffer對(duì)象,可以包含敏感數(shù)據(jù)- fs模塊- 在Node通過(guò)fs模塊來(lái)對(duì)系統(tǒng)中的文件進(jìn)行操作,fs模塊是node中已經(jīng)繼承好了,不需要在使用npm下載,直接引入即可- 引入fsvar fs = require("fs");- fs模塊中的大部分操作都提供了兩種方法,同步方法和異步方法同步方法帶sync異步方法沒(méi)有sync,都需要回調(diào)函數(shù)- 寫入文件1.同步寫入2.異步寫入3.簡(jiǎn)單寫入4.流式寫入- 讀取文件1.同步讀取2.異步讀取3.簡(jiǎn)單讀取4.流式讀取- 方法- 打開(kāi)文件fs.open(path, flags[, mode], callback)fs.openSync(path, flags[, mode])- 讀寫文件fs.write(fd, string[, position[, encoding]], callback)fs.writeSync(fd, string[, position[, encoding]])fs.read(fd, buffer, offset, length, position, callback)fs.readSync(fd, buffer, offset, length, position)- 關(guān)閉文件fs.close(fd,callback)fs.closeSync(fd);- 簡(jiǎn)單文件讀取和寫入fs.writeFile(file, data[, options], callback)fs.writeFileSync(file, data[, options])fs.readFile(path[, options], callback)fs.readFileSync(path[, options])- 流式文件讀取和寫入- 流式讀取和寫入適用于一些比較大的文件fs.createWriteStream(path[, options])fs.createReadStream(path[, options])

總結(jié)

以上是生活随笔為你收集整理的NodeJs(尚硅谷视频学习笔记)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。