1.模塊化開(kāi)發(fā)思想:一個(gè)模塊實(shí)現(xiàn)一個(gè)功能
- 模塊化開(kāi)發(fā)的好處
- 避免變量污染,命令沖突
- 提高代碼復(fù)用率
- 提供代碼可維護(hù)性
- 依賴關(guān)系的管理更方便
2.模塊化規(guī)范
| commonJS | ESModule | AMD | EMD |
|---|---|---|---|
| node.js | es6module | requirejs | sea.js |
AMD -> CMD -> ESMoudule(2015)
3.nodejs是一個(gè)基于 Chrome V8 引擎的javascript運(yùn)行環(huán)境(后臺(tái)語(yǔ)言,跟javascript很像)
node運(yùn)行:通過(guò)node命令,打開(kāi)命令提示符(cmd),進(jìn)入到要運(yùn)行的文件的目錄下,通過(guò)node fileName
nodejs出現(xiàn)于2009年,流行于2013 15年
nodejs安裝完成,打開(kāi)cmd運(yùn)行node -v能夠輸出版本號(hào),說(shuō)明安裝成功(npm -v)
nodejs中模塊化的概念:
nodejs中的模塊化實(shí)現(xiàn)是基于commonjs規(guī)范,一個(gè)文件就是一個(gè)模塊,提供了特定的功能點(diǎn)。
- 如何使用這個(gè)模塊
- 1.核心模塊 require('模塊名字')
- 2.第三方模塊 npm安裝第三方模塊 require('模塊名字')
- 3.直接寫(xiě)的模塊 require('相對(duì)路徑')
4.nodejs中的核心模塊
- http
- url
- fs
- path
4.1
- url
- url.parse方法(解析url字符串為url對(duì)象)
- 如果將第二個(gè)參數(shù)傳遞為true,那么得到的url對(duì)象中query屬性會(huì)被解析為對(duì)象的形式
- url.format 將對(duì)象轉(zhuǎn)字符串
const urlObj = url.parse(str,true);
console.log(urlObj.query.name);
console.log(urlObj.query.age);
//http://localhost:3100?name=張三
//引入需要用到的模塊
const http = require('http');
const url = require('url');
const server = http.createServer((req,res) => {
let params = url.parse(req.url,true).query;
//設(shè)置http頭部 狀態(tài)碼200 文件類型html 字符集utf8
res.writeHead(200,{'Content-type':'text/html;charset=utf-8'});
//響應(yīng)數(shù)據(jù)
res.write(params.name + '是個(gè)人才');
//結(jié)束請(qǐng)求
res.end();
});
server.listen(3100,'127.0.0.1',function(){
console.log('已經(jīng)啟動(dòng),訪問(wèn):http://127.0.0.1:3100');
});
解碼decodeURIComponent 、加碼encodeURIComponent
res.write (decodeURIComponent(params.name + '是個(gè)人才'));
4.2
- fs模塊提供的方法是操作文件的
- fs.readFile
- fs.writeFile
- fa.readFilesync (同步)
- fs.writeFilesync (同步)
讀文件:fs.readFile(file,[options],callback)
參數(shù)1:要讀取的文件路徑,必填
參數(shù)2:讀取文件時(shí)的選項(xiàng),比如:文件編碼utf8,選填
參數(shù)3:文件讀取完畢后的回調(diào)函數(shù),必填
- 讀文件注意:
該操作采用異步執(zhí)行(有回調(diào)函數(shù))
回調(diào)函數(shù)有兩個(gè)參數(shù),err和data(err表示在讀取文件的操作過(guò)程中是否出錯(cuò),data為數(shù)據(jù))
如果讀取文件時(shí)沒(méi)有指定編碼,返回二進(jìn)制數(shù)據(jù)(如指定編碼utf8,返回指定編碼數(shù)據(jù))
只要異步操作,回調(diào)函數(shù)第一個(gè)都是錯(cuò)誤對(duì)象err優(yōu)先
// 讀文件
fs.readFile("./test.txt", (err, data) => {
if (err) {
console.log("讀取失敗");
console.log(err);
} else {
console.log(data.toString());
}
});
寫(xiě)文件:fs.writeFile(file,data,[options],callback);
參數(shù)1:要寫(xiě)入的文件路徑,必填
參數(shù)2:要寫(xiě)入的數(shù)據(jù),必填
參數(shù)3:寫(xiě)入文件時(shí)的選項(xiàng),如文件編碼
參數(shù)4:文件寫(xiě)入完畢后的回調(diào)參數(shù),必填
*寫(xiě)文件注意:
該操作采用異步執(zhí)行
如果文件存在則替換原內(nèi)容
默認(rèn)寫(xiě)入的文件編碼為utf8
回調(diào)函數(shù)有1個(gè)參數(shù):err表示在寫(xiě)入文件的操作過(guò)程中是否出錯(cuò)(出錯(cuò)err!=null,成功err===null)
- writeFile寫(xiě)入文件是先把文件內(nèi)容清空在寫(xiě)入,若要追加寫(xiě)入可使用appendFile函數(shù)
const fs = require("fs");
// 寫(xiě)文件
fs.writeFile("./test.txt", "hello world", err => {
console.log("寫(xiě)文件開(kāi)始");
if (err) {
console.log("寫(xiě)入文件失敗");
console.log(err);
} else {
console.log("寫(xiě)入文件成功");
}
});
// 同步的讀取文件,如果成功,會(huì)直接return 出來(lái)
let data = fs.readFileSync("./test.txt");
console.log(data.toString());//將數(shù)據(jù)轉(zhuǎn)字符串輸出
// fs.writeFileSync("./test.txt", "hello nodejs");
// console.log("寫(xiě)文件結(jié)束");
4.3
- path 模塊 處理文件路徑相關(guān)的問(wèn)題
- path.resolve();
- path.join();
相同點(diǎn):都能夠接受多個(gè)參數(shù),每個(gè)參數(shù)都是一個(gè)路徑
不同點(diǎn):
1.resolve方法,返回的一定是一個(gè)絕對(duì)路徑,而join方法只是簡(jiǎn)單將多個(gè)參數(shù)拼接到一起
let str = path.resolve("./utils", "./index.js");
console.log(str); // C:\Users\Administrator\Desktop\1-nodejs\utils\index.js
let str = path.join("./utils", "./index.js");
console.log(str); // utils\index.js
2.resolve方法,如果某個(gè)參數(shù)是以根路徑開(kāi)始的,那么這個(gè)參數(shù)前面的參數(shù)都將被刪除(覆蓋),而join不同
let str1 = path.resolve("c:", "D:", "a.txt");
console.log(str1); //D:\a.txt
let str2 = path.join("c:", "D:", "a.txt");
console.log(str2); //c:\D:\a.txt
- 全局變量
__dirname;代表當(dāng)前運(yùn)行的文件所在的目錄的絕對(duì)路徑
__filename;代表當(dāng)前運(yùn)行的文件所在的絕對(duì)路徑
console.log(__dirname); //C:\Users\Administrator\Desktop\1-nodejs\day01
console.log(__filename); //C:\Users\Administrator\Desktop\1-nodejs\day01\05-path.js
console.log(path.resolve(__dirname, "./utils/index.js")); //C:\Users\Administrator\Desktop\1-nodejs\day01\utils\index.js
console.log(path.join(__dirname, "./utils/index.js")); //C:\Users\Administrator\Desktop\1-nodejs\day01\utils\index.js
5.處理POST請(qǐng)求
const http = require("http");
const querystring = require("querystring");
const server = http.createServer((req, res) => {
// 處理一下 post 請(qǐng)求傳遞過(guò)來(lái)的參數(shù)
// 1. 我如何發(fā)送 post 請(qǐng)求 模擬請(qǐng)求工具(postman | insomina)
// 2. 如何得到前端傳遞過(guò)來(lái)的post請(qǐng)求的參數(shù) {username: 'admin', password: 123}
// 2.1 監(jiān)聽(tīng)請(qǐng)求傳輸?shù)倪^(guò)程
let raw = ""; // 請(qǐng)求體
req.on("data", chunk => {
// chunk 每次傳輸?shù)臅r(shí)候的數(shù)據(jù)
// data 事件,在請(qǐng)求體大的情況下,會(huì)多次進(jìn)入。
raw += chunk;
});
// 2.2 監(jiān)聽(tīng)請(qǐng)求傳輸完成
req.on("end", () => {
console.log(raw); // 查詢字符串
// querystring 模塊
let obj = querystring.parse(raw);
console.log(obj);
res.write("hello" + obj.username);
res.end();
});
});
server.listen(3000);
- require.on監(jiān)聽(tīng)請(qǐng)求(傳輸?shù)倪^(guò)程)
- data 事件,在請(qǐng)求體大的情況下,會(huì)多次進(jìn)入
- chunk 每次傳輸?shù)臅r(shí)候的數(shù)據(jù)
- require.on監(jiān)聽(tīng)請(qǐng)求(傳輸完成)
- end 事件 請(qǐng)求完成
- querystring
- 將類似(name=%E5%B0%8F%E8%8D%9F&year=3)的字符串轉(zhuǎn)成對(duì)象
- 不使用url是因?yàn)閡rl根據(jù)'?'來(lái)截取,此處不推薦使用
安裝nodemon可以讓nodejs啟動(dòng)的服務(wù)自己在文件修改后,自動(dòng)重新啟動(dòng)
- 全局安裝一個(gè)nodemon工具類
- npm install -g nodemon
- nodemon -v
- 將node命令換成nodemon命令來(lái)使用即可
- 問(wèn)題:
安裝之后,輸入nodemon -v 不能得到版本號(hào),重新啟動(dòng)命令提示符(終端)之后還是報(bào)錯(cuò)。需要按如下方法解決(環(huán)境變量問(wèn)題)- 通過(guò)npm全局安裝的模塊,安裝到:C:\Users\Administrator\AppData\Roaming\npm
- 將這個(gè)路徑添加到系統(tǒng)的環(huán)境變量中:右擊此電腦 -> 屬性 -> 高級(jí)系統(tǒng)設(shè)置 -> 環(huán)境變量 -> 找到系統(tǒng)變量path雙擊打開(kāi) -> 將安裝的模塊路徑添加進(jìn)去保存即可