初識nodejs-基本語法
nodejs是JavaScript的一個在后端的運行環境,關於nodejs的認識,我們可以看上一篇文章<<初識nodejs>>,我們要使用nodejs,首先要安裝nodejs,安裝的東西你可理解為java中的運行環境一樣,至於怎么安裝,我們最好安裝nvm(nodejs version manage),安裝的過程也寫在了另一篇博客<>(那時懵懂期,回頭再修改的詳細一點)
那么nodejs作為一個后台的平台,他可以為我們提供的很多,我們可以用JavaScript語言進行文件的獲取,刪除等等文件操作,我們可以用JavaScript開一個本地服務器,我們可以和mongoDB配合來搭建后台,他給我們前端帶來了太多的驚喜,讓我們深深的迷戀上了它,但正所謂學一個新知識時,我們都需要從簡,從基礎學起,那么在nodejs環境下,我們的基本語法又是怎樣的呢?
模塊
nodejs是支持ES6的,所以在這里你可以盡情的去寫,不用考慮瀏覽器不兼容了(這里是后端,哈哈),安裝好了nodejs后,我們在終端輸入node,就會進入到nodejs環境,這里我們可以輸入:
-
console.log("hello world!");
可以看到我們控制台輸出了hello world,我第一次寫的時候還以為這是chrome的開發者模式呢,這或許就是chrom v8引擎的作用吧,我們這些簡單的指令可以直接在終端中輸出,那么如果是運行一大段代碼呢?我們可以寫個js文件里邊,
-
在hello.js中 var hello = function(){ console.log("hello function"); } hello();
然后node hello.js,這樣我們文件中寫的程序就能運行出來了,nodejsshi是基於commonJS的,所以當我們的程序變大的時候,就可以使用模塊了,nodejs是模塊化的,什么是模塊,每個模塊就是nodejs的每個功能,我們有http模塊來提供服務器,有fs模塊來提供對文件操作的各種功能,我們寫的代碼可以分成一個一個的模塊,這樣可以提高我們代碼的復用性,以及減少代碼之間的耦合性,可以避免函數名和變量名的沖突.
java和python使用import來導入其他函數庫,而php和ruby是通過require,上邊也說過,nodejs是基於CommonJS的,在node中我們可以使用require這個關鍵字來導入模塊.例如:
-
var http = require('http'); var fs = require('fs');
首先,我們可以使用原生的和外部的模塊,這些模塊都是別人寫好的或者nodejs自帶的,他們都給我們提供各種各樣的功能,我們只需要直接require它們就能使用了,
其次,我們也可以自己編寫模塊,比如你講一個輸出hello的函數單獨封裝成一個模塊,
-
//這里是hello模塊 (function(){ var hello = function(){ console.log("hello"); } export.hello = hello; })()
這里我們使用exports導出hello函數,然后再另一文件中通過require導入另一個模塊,這時再另一個模塊中,
-
var hello = require('hello.js');//然后運行hello hello.hello();//這時輸出hello
我們還有另一種導出方法,在hello.js中
-
module.exports=hello;//通過這種導出方法,我們在使用它的時候的用法為: --- var hello = require('hello.js'); hello();//這時輸出hello
這時我們就出現了不同的地方
exports和module.exports的區別
在講他們的區別之前,我們先來看一個例子,這個例子以及他們區別的理解我是在node中文社區學習的.
-
var a ={name:"小明"}; var b =a; console.log(a.name); console.log(b.name); //輸出 小明 小明 b.name="小李"; console.log(a.name); console.log(b.name); //輸出 小李 小李
這里,由於a直接賦給b,這是b相當於a的引用,a和b指向同一塊存儲區域,這是改變了b的name,相應的a的name也發生了改變.那么這就引出了我們要講的:
- module.exports原本就是一個空對象
- exprots是這個對象的一個引用變量
- 平時我們require進來的就是module.exports對象
上邊這三大法則就是module.exports和exports的主要區別,我們可以這樣來看:
1 exports = module.exports; 2 所以現在exports.hello = hello; 3 就相當於module.exports.hello = hello; 4 當另一文件導入var hello = require('hello.js');時 5 因為是導入了module.exports這個對象,所以使用hello的時候,是:hello.hello();
所以我們導出模塊的時候,直接使用module.exports=hello;就行了.
據說nodejs可以使用c/c++編寫二進制模塊,但因為前端出身的我雖然學過c/c++但研究不深,我還是好好的用JavaScript吧!
當我們需要使用一些線上的模塊時,只需要去nodejs.org里邊去搜索,然后使用npm install就可以了,npm是和nodejs捆綁在一起的,
回調函數
回調函數是什么呢?我們對於JavaScript中的函數應該不陌生了吧,回到函數就是JavaScript中的函數.當在nodejs中,回調函數是來實現異步調用的,回調函數被稱為要去完成的任務,nodejs中很頻繁的使用回調函數,nodejs中的所有的API模塊都是由回調函數所實現的.由回調函數來實現異步調用,其實就是給你造成一種假象,讓你像使用ajax一樣讓你感覺很順暢,不堵不堵不堵(嘿嘿嘿)!
我們先提前看一下nodejs在讀取文件的時候的一個操作
-
1 //這里有一個input.txt文件,里邊的內容為:"這是一個測試文件" 2 var fs = require('fs'); 3 var data = fs.readFileSync('input.txt');//同步操作 4 console.log(data.toString()); 5 console.log("程序結束");
運行這個文件后顯示
-
1 這是一個測試文件 2 程序結束 3 //這是我們很容易理解的程序流程,程序從上往下一次執行,
那我們再來看一個
-
//input.txt文件中的內容不變, var fs = require('fs'); fs.readFile('input.txt',function(err,data){ if(err){return console.eror(err)} console.log(data.toString()); }); console.log("程序結束");
這時我們再運行這個程序,就會發現輸出的內容為:
-
程序結束 這是一個測試文件 //這是我們會發現先輸出的是"程序結束"
我們先不用去糾結上邊那個函數是什么意思,我們應該能看得出來,第二次的函數是一個回調函數,這就是我們的阻塞和非阻塞IO的區別,當程序執行到異步的讀文件時,會先將這個相對耗時多的步驟存入一個事件循環(looping)中,轉而去執行下邊的程序,等到下邊的程序執行完了之后再回去執行回調函數這個它存起來的任務,而在程序執行的時候就給我造成一個感覺,好快!這就是我們異步調用,至少目前我感覺,這個異步調用時nodejs的利器.
總結
nodejs的基本語句還是JavaScript,只不過它是模塊化開發,更有利我們去管理代碼,他的異步調用時他的一大利器,這不同於其他多線程的語言,我們只是通過回調函數來實現這一功能,所以它對服務器的壓力也不大!