不知不覺,現在已經習慣學一點東西,就寫博客記錄一下。這次學習Nodejs主要是在B站上看的視頻教程,感覺講的很是不錯,所以我想把在看視頻學習過程中的一些重要知識點記錄下來方便以后自己快速查閱。
-----注:這系列博客記錄的知識點主要來源於黑馬程序員的Nodejs視頻教程,博主只是簡單手動進行了代碼復現和知識點記錄,侵刪
一.Node是什么?
1.Node.js是一個JavaScript運行時環境(可以解析和執行JavaScript代碼)
2.現在的JavaScript可以完全脫離瀏覽器來運行,一切都歸功於Node.js
3.瀏覽器中的JavaScript包括EcmaScript、BOM、DOM
4.Node.js中的JavaScript :沒有BOM、DOM,用EcmaScript進行編碼,主要是在Node這個JavaScript執行環境中為JavaScript提供一些服務器級別的API操作(例如文件讀寫、網絡服務的構建、網絡通信、http服務器等處理)
5.Node.js特性是 使用事件驅動、非阻塞IO模型(異步),使得其輕量和高效
6.npm是基於Node.js開發出來的包管理工具,npm是世界上最大的開源庫生態系統,絕大多數js相關的包都存放在npm上,方便開發人員下載使用
7.Google Chrome的V8引擎是目前公認的解析執行JavaScript代碼最快的,Node.js構建在Google Chrome的V8引擎之上,是一個獨立的JavaScript運行時環境
8.Node.js能做的事:Web服務器后台、命令行工具(npm、git、hexo)
二.使用Node執行js腳本文件
1.創建編寫JavaScript腳本文件
2.打開終端,定位到腳本文件所屬目錄
3.輸入 node 文件名
來執行對應的腳本文件
注:①命令dir是用來顯示文件或目錄的命令 ②文件名不要用 node.js
來命名,最好也不要使用中文命名 ③瀏覽器端口默認為80
//在 Node 中專門提供了一個核心模塊:http,可以非常輕松的構建一個web服務器 //1.加載http核心模塊 var http = require('http') //2.使用http.createServer()方法創建一個Web服務器,返回一個Server實例 var server = http.createServer() //3.接收請求、處理請求、給個反饋(發送相應) //當客戶端請求過來,就會自動觸發服務器的request請求事件,然后執行第二個參數:回調處理 server.on('request',function(){ console.log('收到客戶端的請求了') }) // 4.綁定端口號,啟動服務器 server.listen(3000,function(){ console.log('服務器啟動成功了,可以通過 http://127.0.0.1:3000/ 來進行訪問') })
打開終端,定位到腳本文件所屬目錄,輸入命令 node 文件名 ,顯示如下:
瀏覽器輸入 http://127.0.0.1:3000/ 后,命令行界面顯示如下:
注: Node.js構建在Google Chrome的V8引擎之上,是一個獨立的JavaScript運行時環境,可以脫離瀏覽器運行
響應內容類型Content-type
var http = require('http') var server = http.createServer() server.on('request',function(req,res){ //在服務端默認發送的數據其實是utf-8編碼的內容 //但是瀏覽器不知道你是utf-8編碼的內容,在瀏覽器不知道服務器響應內容的編碼的情況下會按照當前操作系統的默認編碼去解析 //中文操作系統默認是gbk //要讓瀏覽器顯示的數據不是亂碼的,就需要告訴瀏覽器服務器發給它的內容是什么編碼的,下面這行代碼就可以解決這個問題 var url = req.url if(url === '/plain'){ // text/plain 就是普通文本 text/plain的意思是將文件設置為純文本的形式,瀏覽器在獲取到這種文件時並不會對其進行處理 res.setHeader('Content-Type','text/plain; charset=utf-8') res.end('hello 世界') }else if(url === '/html'){ // text/html的意思是將文件的content-type設置為text/html的形式,瀏覽器在獲取到這種文件時會自動調用html的解析器對文件進行相應的處理 // 如果你發送的是 html 格式的字符串,則也要告訴瀏覽器我給你發送的是 text/html 格式的內容 res.setHeader('Content-Type','text/html; charset=utf-8') res.end('<p>hello html <a href="">點我</a></p>') } }) server.listen(3000,function(){ console.log('Server is running.....,可以通過 http://127.0.0.1:3000/ 來進行訪問') })
五.通過hhtp網絡發送文件
-
發送的並不是文件,本質上發送的是文件的內容
-
當瀏覽器收到服務器響應內容之后,就會根據你的 Content-Type 進行對應的解析處理
-
服務器最好把每次響應的數據是什么內容類型都告訴客戶端,而且要正確的告訴
-
不同資源對應的 Content-Type 是不一樣的,具體參照:
-
對於文本類型的數據,最好都加上編碼,目的是為了防止中文解析亂碼問題
//1.結合fs發送文件中的數據 //2.Content-Type 不同的資源對應的 Content-Type 是不一樣的,圖片不需要指定編碼,一般只為字符數據指定編碼 var http = require('http') var fs = require('fs') var server = http.createServer() server.on('request',function(req,res){ var url = req.url if(url === '/'){ //發送的是在文件中的內容 fs.readFile('./resource/index.html',function(err,data){ if(err){ //告訴客戶端,讀取失敗 res.setHeader('Content-Type','text/plain; charset=utf-8') res.end('文件讀取失敗,請稍后重試!') }else{ //data默認是二進制數據,可以通過 .toString 轉為咱們能識別的字符串 //res.end()支持兩種數據類型,一種是二進制,一種是字符串 res.setHeader('Conten-Type','text/html; charset=utf-8') res.end(data) } }) }else if(url==='/baby'){ //url:統一資源定位符 //一個 url 最終其實是要對應到一個資源的 fs.readFile('./resource/ab2.jpg',function(err,data){ if(err){ //告訴客戶端,讀取失敗 res.setHeader('Content-Type','text/plain; charset=utf-8') res.end('文件讀取失敗,請稍后重試!') }else{ //data默認是二進制數據,可以通過 .toString 轉為咱們能識別的字符串(因為res.end也支持二進制的數據類型,所以這里也可以不用轉) //res.end()支持兩種數據類型,一種是二進制,一種是字符串 //圖片就不需要指定編碼了,因為我們常說的編碼指的是字符編碼 res.setHeader('Conten-Type','image/jpeg') res.end(data) } }) } }) server.listen(3000,function(){ console.log('Server is running......') })
六.ip地址和端口號
1.所有聯網的程序都需要進行網絡通信。一台計算機只有一個物理網卡,而且同一個局域網中,網卡的ip地址必須是唯一的(網卡是通過唯一的ip地址來進行定位的)。
2.DNS: 域名系統(英文:Domain Name System,縮寫:DNS)是互聯網的一項服務,是萬維網上作為域名和IP地址相互映射的一個分布式數據庫,能夠使用戶更方便的訪問互聯網,而不用去記住能夠被機器直接讀取的IP數串。
3.①ip地址用來定位計算機 ②端口號用來定位具體的應用程序(所有需要聯網通信的應用程序都必須占用一個端口號)
4.端口號的范圍從0~65536之間
5.在計算機中有一些默認端口號,最好不要去使用(例如http服務的80)
6.在開發過程中使用一些簡單好記的就可以了,例如3000、5000等沒什么含義
7.瀏覽器默認使用的端口號是80,若要請求其他端口號,則一定要在ip地址后面給出來
七.一些知識點補充
1.hhtp服務的響應內容(res.end())只能是二進制數據或者字符串(注意:數字、對象、數組、布爾值都是不可以的)
Node為JavaScript提供了很多服務器級別的API,這些API絕大多數都被包裝到了一個具名的核心模塊中。例如文件操作的fs
核心模塊,http服務構建的http
模塊,path
路徑操作模塊、os
操作系統信息模塊。以后如果說一個模塊是核心模塊,就要想到如果要使用它,就必須require,例如:
var fs = require('fs')
var http = require('http')
4.require 是一個方法,它的作用是用來加載模塊的。在Node中,模塊有兩種:一是具名的核心模塊,例如 fs、http;二是用戶自己編寫的文件模塊(說白了就是js文件)。require加載用戶自定義的模塊時,require中的相對路徑的 ./ 不能省略,否則會報錯。補:后綴名也可以省略,require默認找的就是 .js 結尾的文件
5.在Node中,沒有全局作用域,只有模塊作用域(外部訪問不到內部,內部也訪問不到外部)
6.require 方法有兩個作用:①加載文件模塊並執行里面的代碼②拿到被加載文件模塊導出的接口對象(每個文件模塊中都提供了一個對象---export,export默認是一個空對象,所有需要被外部訪問的成員都需要掛載到exports這個對象中!)
例如:
a.js如下:
var ret = require('./b') console.log(ret.foo) console.log(ret.add(10,30))
b.js如下:
var foo = 'bbb' exports.foo = "hello" exports.add = function(x,y){ return x+y }
命令行輸入 node a.js 后,結果如下: