node.js是什么
node.js是一個構(gòu)建在chrme的v8引擎上的JavaScript的運(yùn)行環(huán)境(runtime)衙熔。NodeJS使用事件驅(qū)動、非阻塞I/O模型來讓程序變得輕量和方便名段。它的包管理系統(tǒng)叫做npm,是世界上最大的JavaScript包生態(tài)系統(tǒng)泣懊。
運(yùn)行環(huán)境
nodejs是一個js的運(yùn)行環(huán)境伸辟,現(xiàn)在我們有兩個js運(yùn)行環(huán)境:
? HTML配合瀏覽器
? nodejs
nodejs平臺是沒有window、body對象等等對象馍刮。
命令
1.文件夾的名字信夫,可以按tab鍵進(jìn)行補(bǔ)全:
2.node -v
返回當(dāng)前node版本
3.npm -v
返回當(dāng)前npm版本
4.npm help
查看所有命令
5.npm help command
查看某條命令的說明
6.npm list -g
返回所有全局安裝的包
7.按shift加鼠標(biāo)右鍵可以在當(dāng)前路徑打開gitbash
8.node xx.js 運(yùn)行xx.js文件
模式
- 腳本模式
執(zhí)行js文件
node + 文件名稱 - 交互模式
模塊
- 引用內(nèi)置模塊,直接使用require()函數(shù)獲得模塊名字就行了。
引用自定義模塊加路徑 require("./a.js");
入口文件index.js忙迁,可以省略
var yuan = require("./yuan/") //等同于var yuan = require("./yuan/index.js")
var fs = require("fs");
var http = require("http");
- 在nodejs程序中脐彩,require誰就會立即執(zhí)行誰
- nodejs中每個js文件的作用域是隔離的
- 瀏覽器模式下,js文件之間是沒有作用域隔離的姊扔,因?yàn)樗械淖兞慷际莣indow對象的屬性惠奸,而window對象從屬于html文件
- 模塊內(nèi)的值可以作為模塊的對象暴露出去
var a=1; module.exports=a //這種寫法適用于js文件本身是一個類
var a=1; exports.a=a
6.在node_modules文件夾中的所有模塊,可以不寫外部路徑恰梢。
7.在require的時候佛南,如果不是用./開頭的路徑,此時nodejs會自動去node_modules中尋找嵌言。
8.在模塊中輸出變量
方法一:如果要輸出一個函數(shù)或數(shù)組嗅回,必須直接對module.exports對象賦值
function greet(name) {
console.log('hello' + name + ' !')
}
module.exports = greet;
var greet = require('./greet.js');
greet('zhang san');
方法二:如果要輸出一個鍵值對象{},可以利用exports這個已存在的空對象{}摧茴,并繼續(xù)在上面添加新的鍵值
function getTime(){
var d = new Date();
return d.getFullYear() + '-' + (d.getMonth()+1) + '-' + d.getDay()
}
function getTwoLength(str){
if ((str+'').length==1){
return '0'+str
}
}
exports.getTime = getTime;
exports.getTwoLength = getTwoLength;
var util = require('./util.js');
console.log(util.getTime());
console.log(util.getTwoLength(2));
var a = require("./a.js"); //相同文件夾下的a.js文件
var a = require("a.js"); //node_modules文件夾中的a.js文件
var a = require("a"); //node_modules文件夾中的a文件夾中的index.js文件
package.json
npm init 在當(dāng)前項(xiàng)目文件夾下生成 package.json
package.json的dependencies 記錄了項(xiàng)目依賴
npm install 命令一鍵安裝所有的 dependencies 里的內(nèi)容
npm install name 在目前最新node版本,等同于npm install --save name
npm install --save name 安裝并自動記錄到依賴信息
理解異步
var fs=require('fs');
fs.readFile('./temp/test1.txt',function(err,data){
console.log(err,data.toString())
})
console.log('哈哈')
先輸出'哈哈'绵载。因?yàn)閒s.readFile()是異步的,CPU命令磁盤驅(qū)動器去讀取文件了苛白,此時CPU沒有被阻塞娃豹,而是先執(zhí)行后面的語句。
demo
把文件1的內(nèi)容寫入到文件2购裙,注意回掉函數(shù)嵌套懂版,才能保證把讀完之后的內(nèi)容再寫入成功
var fs = require('fs');
var str;
fs.readFile('./temp/test2.txt', function (err, data) {
if (err) { console.log('寫入失敗') } else {
str = data.toString()
console.log(str)
}
fs.writeFile('./temp/test1.txt', str, function (err, data) {
if (err) { console.log('寫入失敗') } else {
console.log('寫入成功')
}
})
})
請求一個包含圖片 css的html文件
var fs = require("fs");
var http = require("http");
var server = http.createServer((req,res) => {
if(req.url == "/1.html"){
//當(dāng)有用戶發(fā)那個吻服務(wù)器的時候羊苟,我們讀取文件
fs.readFile("./public/1.html",(err,data) => {
//我們在res流里面輸出文件內(nèi)容
res.end(data.toString());
});
}else if(req.url == "/mao.jpg"){
fs.readFile("./public/mao.jpg",(err,data) => {
//圖片是二進(jìn)制的残制,所以toString()反而錯誤泳猬!
res.end(data);
});
}else if(req.url == "/css.css"){
fs.readFile("./public/css.css",(err,data) => {
res.end(data.toString());
});
}
else{
res.setHeader("content-type","text/html;charset=UTF-8");
res.end("請檢查網(wǎng)址尤勋!");
}
});
server.listen(3000,(err)=>{
if(err){
console.log("服務(wù)器開啟失敗");
return;
}
console.log("服務(wù)器開啟成功扮碧,3000端口陶缺。");
});
05:45