Node.js(day1)

1、什麼是Node.js

Node.js Everywhere 咱們能夠從官網的介紹來分析:node中文網 | node引文網javascript

Node.js® 是一個基於 Chrome V8 引擎 的 JavaScript 運行時。html

  • 瀏覽器引擎能夠解析並執行js,google的v8引擎速度很快,因此node.js能夠在脫離瀏覽器的狀況下解析並執行js代碼。
  • 咱們日常所用的js爲瀏覽器中的js,而node.js能夠看作服務端的js,因此node.js不是一門新語言也非新框架,而是js運行時。
  • 能夠簡單的將node.js理解爲使用js語言進行web服務器開發。(爲了實現這些功能,node.js提供了一些特別的api)

node.js使用事件驅動、非阻塞I/O模型使得其輕量、高效。前端

node.js的包生態系統,npm是世界上最大的開源庫生態系統。java

  • 絕大多數javascript包都存放在了npm上,以方便開發者安裝使用。

2、Node.js能作什麼

  • Web服務器後臺
  • 命令行工具(如npm、git等都屬於命令行工具,對於前端開發來講使用最多的也是node.js提供的命令行工具)

3、使用命令行解析js文件

寫一個簡單的js文件,node

var str = 'hello node';
conole.log(str);

隨意命名,好比hello.js。(注意,不能使用node.js命名,不然會打開文本而不會解析執行) 而後在文件存放處打開命令行,使用node指令執行便可:git

4、使用Node構建web服務器

咱們已經知道Node能夠解析js文件了,而js也能夠進行web服務器搭建,因此咱們只須要使用Node.js提供的相關api來搭建服務器,再用命令行去解析執行便可。web

//相似咱們須要使用某些對象同樣,須要使用關鍵字進行New,在Node.js中咱們使用require()方法進行模塊加載(Node中的模塊就至關於具備特殊功能的對象)
//要構建一個web服務器須要使用http模塊
var http = require('http');

//使用http模塊建立webServer
var server = http.createServer();

//設置端口號
server.listen(8888,function(){
	console.log("端口號啓用成功!");
});

//服務器request事件:請求時觸發
server.on('request',function(request,response){
	console.log("已經收到請求!"+'請求路徑爲:'+request.url);//一些請求信息
	response.write("雷好,我係~渣渣輝!");//響應
	response.end("該幹嗎幹嗎去");//告知瀏覽器響應結束,沒必要等待
});

console.log("webServer at localhost://88888");

而後咱們打開瀏覽器輸入:localhost://8888或127.0.0.1://8888就能夠訪問了。 總結一下:npm

  • Node.js的一些特殊功能,好比建立服務器,是普通js沒有的,咱們把這些具備特殊功能的對象稱做模塊,要使用這些模塊,須要使用require()方法進行裁入。
  • http模塊能夠建立服務器。使用createServer([options][, requestListener])方法能夠建立並返回一個服務器對象,而後咱們就能夠進行相應設置。
  • 服務器的listen()方法爲服務器設置端口號。
  • 服務器對象有不少事件,好比request事件在瀏覽器請求該服務器時觸發,利用回調函數能夠進行request處理和response響應。
  • response.end()方法告知瀏覽器響應結束,不然瀏覽器會一直等待響應。
  • 響應數據只能是二進制數據或字符串。

5、Node.js中的JavaScript

  • EcmaScript(不包含BOM、DOM)
  • 核心模塊
  • 第三方模塊
  • 自定義模塊

1.核心模塊

Node.js爲JavaScript提供了不少服務器級別的api,這些api絕大多數都被包裝到了一個具名的核心模塊中,好比: 文件操做的fs(File System)模塊、http服務建立的http模塊、路勁操做的path模塊、操做系統信息的os模塊等。 而咱們須要使用這些核心模塊就須要使用require()方法進行獲取。api

2.自定義模塊

Node.js中的模塊有三種:瀏覽器

  • 具名的核心模塊
  • 第三方模塊
  • 自定義模塊 其中用戶自定義的模塊又叫文件模塊,也就是那些js文件。 咱們知道,在命令行中node指令只能編譯執行一個js文件,可是咱們的項目不可能只有一個js文件,一樣的,js文件也是模塊,因此咱們須要在某個文件中使用require()方法解析執行文件模塊。 好比我如今有如下三個js文件:
//a.js文件
console.log('a start');
require('./b.js');//解析執行b.js
console.log('a end');
//b.js文件
console.log('b start');
require('./c.js');//解析執行c.js
console.log('b end');
//c.js文件
console.log('CCCCCC');

執行結果以下:

值得注意的點:

  • 在Node.js中沒有全局做用域,只有文件做用域。也就是說每一個js文件的做用域都是分離的,互不影響。
  • 相對路勁必須寫./;文件後綴能夠省略。

既然每一個文件中的變量互不影響,那麼若是咱們須要使用到某個文件內部的變量時又該如何獲取呢?其實require()方法除了解析執行文件模塊以外還能返回文件模塊自帶的exports對象,該對象默認爲空{}。 因此咱們只須要在文件模塊中將須要處處的值傳入exports對象中便可:

var b = require('./b');//加載b文件
console.log(b);//輸出b模塊導出的對象
var str = '雷好,我係渣渣輝';
function add(x,y){
  return x+y;
}
exports.str = str;
exports.add = add;

執行:

6、響應內容的類型Content-Type

上文中咱們響應的中文可能在瀏覽器中顯示是亂碼,這是由於Node.js默認的響應類型是utf-8,而瀏覽器不知道,若是瀏覽器默認編碼不是utf-8就會產生亂碼。 response對象在響應的時候能夠設置相關參數,好比響應頭,響應內容的類型,而編碼方式的信息就由Content-Type來設置。

//設置響應頭參數。響應類型爲普通文本,編碼方式爲utf-8
response.setHeader('Content-Type','text/plain;charset=utf-8');

示例:

var http = require('http');
var server = http.createServer();
server.listen(8888);

//服務器request事件:請求時觸發
server.on('request',function(request,response){
	var url = request.url;
	var str = '<h1>若是你看得清我,說明我沒有亂碼!</h1>'
	if(url == '/plain'){
		response.setHeader('Content-Type','text/plain;charset=utf-8');//返回普通文本
	}else if(url == '/html'){
		response.setHeader('Content-Type','text/html;charset=utf-8');//返回html文本
	}else{
		str = 'please use url /plain or /html and get the response!'
	}
	response.end(str);
});

console.log("webServer running at localhost://88888");

7、fs核心文件

fs全稱File System,用於操做文件,基本的兩個功能爲爲讀文件和寫文件。

1.使用fs讀文件:readFile()

//使用require方法加載fs模塊
var fs = require('fs');
fs.readFile('hello.js',function(error,data){
	if(error){
		console.log('文件讀取失敗!');
		return;
	}
	console.log(data.toString());
});
  • 使用fs的readFile()方法,第一個參數爲文件地址,第二個參數爲回調函數。
  • 回調函數有兩個參數,error和data,當文件讀取成功時,error返回null,data返回文件的二進制數據;當文件讀取失敗時,error返回包含錯誤信息的對象,data返回undefined。
  • 使用data.toString()方法能夠講二進制數據轉化爲utf-8編碼字符串。

2.使用fs寫文件:writeFile()

var fs = require('fs');
fs.writeFile('hello.txt','大噶好,I\'m 渣渣輝',function(error){
	if(!error){
		console.log("文件寫入成功!");
	}else{
		console.log("文件寫入失敗!");
	}
});
  • 使用fs.writeFile()方法寫入文件。第一個參數爲文件地址及文件名,第二個參數爲文件的文本信息,能夠是字符串,也能夠是二進制數據,第三個參數爲回調函數。

3.案例:利用fs文件的讀寫操做實現文件複製

邏輯很簡單,將讀取的文件數據寫入新的文件中便可

var fs = require('fs');

fs.readFile('jinx.jpeg',function(error,data){
	if(error){
		console.log('文件讀取失敗!');
	}else{
		//將讀取的數據寫入新的文件中
		fs.writeFile('jinx(copy).jpeg',data,function(error){
			if(!error){
				console.log("文件寫入成功!");
			}else{
				console.log("文件寫入失敗!");
			}
		});
	}	
});

8、案例:使用Node加載index.html並實現簡單頁面跳轉

因爲文件過多這裏再也不展現,假設這是一個本地項目,

咱們但願使用Node.js來搭建服務器,並在服務器上運行咱們的項目。 你們服務器很簡單,關鍵點在於咱們須要根據請求路勁來加載相應的資源文件,這些上面的案例都能實現。相似這樣:

咱們根據request.url使用fs核心模塊來加載文件,並設置相應的Content-Type在瀏覽器中正確裁入文件類型。

  • openfile()是我自定義的一個方法。
  • 能夠發現,這種加載資源的方式並不明智,咱們每發起一次資源請求,例如一張圖片,咱們就須要配置依次資源路徑,這是很繁瑣且易錯的。但目前爲止上文所涉及的知識只能這樣解決。因此須要繼續升入,出門左轉。
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息