var str = "Hello World~"; console.log(str);
文件讀寫html
瀏覽器的 js 是不能對磁盤文件進行操做的,但 Node 中的 js 具備文件操做的能力node
在 nodeDemo 下新建 readFile.js 和 book.txt,book純文本里內容只有 「 ABC 」npm
var fs = require('fs'); //使用require方法加載fs核心模塊
fs.readFile('./book.txt',function (error,data) { //點表示當前目錄,點點是上級目錄
if(error) console.log('文件讀取失敗'); else console.log(data); }); /*readFile()參數有兩個,文件路徑和回調函數 回調函數有兩個形參,error和data 讀取成功: data爲數據, error爲null 讀取失敗: data爲undefined, error爲錯誤對象*/
fs 是 file system 的簡寫,文件系統的意思,在 Node 中要進行文件操做就必須引入 fs 這個核心模塊,在這個核心模塊中,提供了全部文件操做相關的 API,如 fs.readFile 就是用來讀取文件的。全部文件操做的API都是異步的編程
ABC對應的ASCII十進制爲 65 66 67,文件都是以二進制進行存儲,這裏輸出了對應的十六進制。調用 toString 方法便可輸出 ABCjson
console.log(data.toString());
文件寫入也一樣簡單瀏覽器
//writeFile()有三個形參:文件路徑,文件內容,回調函數 //寫入成功時error爲null,失敗時爲錯誤對象
var fs = require('fs'); fs.writeFile('./song.txt','街燈晚餐',function (error) { if(error) console.log('文件寫入失敗'); else console.log('文件寫入成功'); });
//使用Node能夠很輕鬆地構建一個Web服務器,在Node中專門提供了一個核心模塊http
var http = require('http'); //加載http核心模塊
var server = http.createServer(); //建立一個Web服務器
/*註冊request請求事件,當客戶端請求時就會觸發此事件執行回調函數 回調函數有兩個形參 request和response,表示請求對象和響應對象 */ server.on('request',function (request,response) { console.log('接收到了來自' + request.url + '的請求'); response.write('Hi~'); response.end(); //response對象的write()方法可屢次使用但最後必定要用end()來結束響應,不然瀏覽器會一直等待
//也可用簡單的方式:response.end('Hi~'); 響應的內容只能是二進制Buffer或字符串string
}); //綁定端口號,啓動服務器
server.listen(5000,function () { console.log('服務器啓動成功'); });
經過 ip 可知道是哪臺電腦,經過端口號知道是電腦裏的哪一個程序,而 ip 127.0.0.1 表明本機,因此在瀏覽器地址欄輸入 http://127.0.0.1:5000 可訪問剛纔建立的服務器緩存
端口號80是網頁服務器默認的訪問端口,若是不寫端口號 http://127.0.0.1 ,瀏覽器會默認加上 http://127.0.0.0:80tomcat
服務器收到請求,並作出了響應。request.url 獲取端口號後面的那一部分路徑,/ 表明根目錄。如請求 http://baidu.com服務器
就算末尾不加 / ,瀏覽器也會默認幫加上網絡
/favicon.icon 是瀏覽器默認會請求的 ico 圖標
服務器響應的內容若是有中文,瀏覽器顯示時會出現亂碼,這是由於服務器以 utf-8 編碼響應數據,而中文瀏覽器默認以 gbk 編碼去解析
解決辦法是設置響應頭信息
var http = require('http'); var server = http.createServer(); server.on('request',function (request,response) { response.setHeader('Content-Type','text/plain;charset=utf-8'); //要放在write()以前
response.write('Hi~你好啊'); response.end(); }); server.listen('3000',function () { console.log('Web Server running'); });
不一樣的資源對應不一樣的 Content-Type ,普通文本是 text/plain,html 是 text/html,更多類型可查看網上的 對照表
通常只有字符數據才指定編碼,圖片不須要指定編碼
response.setHeader('Content-Type','image/jpeg');
核心模塊
Node 爲 js 提供了不少服務器級別的API,這些API絕大多數都被包裝一個具名的核心模塊中
如文件操做的 fs核心模塊、http 服務構建的 http模塊、path路徑操做模塊、os操做系統信息模塊等
用到哪一個模塊都要必需要用 require() 方法來加載
Node支持模塊化編程,模塊分爲 具名核心模塊(Node內置的模塊) 、第三方模塊 和 自定義模塊(用戶本身寫的js文件)
require() 加載只能是執行模塊中的代碼,模塊是徹底封閉的,加載執行多個文件時即使變量重名也不會有污染問題
若是在瀏覽器,b.js 的 str 會覆蓋前面的 str,因此輸出結果應該是 substring,但在這裏因爲模塊做用域,就算 a.js 加載了 b.js,也沒法使用 b.js 裏的變量或函數
exports.n = 123 exports.s = 'Hi' exports.f = function(){ console.log('fun') } exports.o = { str:'Hello' }
導出單個成員,若是一個模塊須要直接導出某個成員而非掛載的方式,這時候必須使用 module.exports
module.exports = 'Hi' module.exports. = { str:'Hello' } //同時寫的話此字面量對象會覆蓋上面的 'Hi' 字符串 //module.exports若是想導出多個成員,可把放成員放一個對象中
console.log(module);
var module = { exports:{} } console.log(module) //本身寫的代碼
return module.exports
var module = {
exports:{} } console.log(module) //本身寫的代碼 module.exports.name = 'Sam' //經過點語法爲exports對象建立name屬性,屬性值爲字符串Sam
return module.exports
var module = { exports:{} } var exports = module.exports console.log(module)
//module.exports.name = 'Sam'
export.name = 'Sam' //二者指向相同,操做的是同一對象
return module.exports
require('art-template')
最終加載的是 index.js 裏的內容, index.js 裏又要加載其餘模塊,而後最後導出 template 這個對象。實際上最終加載的仍是文件,而核心模塊的本質也是文件