nodejs是JavaScript的一個在後端的運行環境,關於nodejs的認識,咱們能夠看上一篇文章<<初識nodejs>>,咱們要使用nodejs,首先要安裝nodejs,安裝的東西你可理解爲java中的運行環境同樣,至於怎麼安裝,咱們最好安裝nvm(nodejs version manage),安裝的過程也寫在了另外一篇博客<>(那時懵懂期,回頭再修改的詳細一點)php
那麼nodejs做爲一個後臺的平臺,他能夠爲咱們提供的不少,咱們能夠用JavaScript語言進行文件的獲取,刪除等等文件操做,咱們能夠用JavaScript開一個本地服務器,咱們能夠和mongoDB配合來搭建後臺,他給咱們前端帶來了太多的驚喜,讓咱們深深的迷戀上了它,但正所謂學一個新知識時,咱們都須要從簡,從基礎學起,那麼在nodejs環境下,咱們的基本語法又是怎樣的呢?前端
nodejs是支持ES6的,因此在這裏你能夠盡情的去寫,不用考慮瀏覽器不兼容了(這裏是後端,哈哈),安裝好了nodejs後,咱們在終端輸入node,就會進入到nodejs環境,這裏咱們能夠輸入:java
console.log("hello world!");
能夠看到咱們控制檯輸出了hello world,我第一次寫的時候還覺得這是chrome的開發者模式呢,這或許就是chrom v8引擎的做用吧,咱們這些簡單的指令能夠直接在終端中輸出,那麼若是是運行一大段代碼呢?咱們能夠寫個js文件裏邊,node
在hello.js中 var hello = function(){ console.log("hello function"); } hello();
而後node hello.js,這樣咱們文件中寫的程序就能運行出來了,nodejsshi是基於commonJS的,因此當咱們的程序變大的時候,就可使用模塊了,nodejs是模塊化的,什麼是模塊,每一個模塊就是nodejs的每一個功能,咱們有http模塊來提供服務器,有fs模塊來提供對文件操做的各類功能,咱們寫的代碼能夠分紅一個一個的模塊,這樣能夠提升咱們代碼的複用性,以及減小代碼之間的耦合性,能夠避免函數名和變量名的衝突.python
java和python使用import來導入其餘函數庫,而php和ruby是經過require,上邊也說過,nodejs是基於CommonJS的,在node中咱們可使用require這個關鍵字來導入模塊.例如:c++
var http = require('http'); var fs = require('fs');
首先,咱們可使用原生的和外部的模塊,這些模塊都是別人寫好的或者nodejs自帶的,他們都給咱們提供各類各樣的功能,咱們只須要直接require它們就能使用了,
其次,咱們也能夠本身編寫模塊,好比你講一個輸出hello的函數單獨封裝成一個模塊,ajax
//這裏是hello模塊 (function(){ var hello = function(){ console.log("hello"); } export.hello = hello; })()
這裏咱們使用exports導出hello函數,而後再另外一文件中經過require導入另外一個模塊,這時再另外一個模塊中,chrome
var hello = require('hello.js');//而後運行hello hello.hello();//這時輸出hello
咱們還有另外一種導出方法,在hello.js中npm
module.exports=hello;//經過這種導出方法,咱們在使用它的時候的用法爲: --- var hello = require('hello.js'); hello();//這時輸出hello
這時咱們就出現了不一樣的地方後端
在講他們的區別以前,咱們先來看一個例子,這個例子以及他們區別的理解我是在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,只不過它是模塊化開發,更有利咱們去管理代碼,他的異步調用時他的一大利器,這不一樣於其餘多線程的語言,咱們只是經過回調函數來實現這一功能,因此它對服務器的壓力也不大!