01.什么是 Node.js
目標(biāo)
什么是 Node.js,有什么用,為何能獨(dú)立執(zhí)行 JS 代碼,演示安裝和執(zhí)行 JS 文件內(nèi)代碼
講解
-
Node.js 是一個(gè)獨(dú)立的 JavaScript 運(yùn)行環(huán)境,能獨(dú)立執(zhí)行 JS 代碼,因?yàn)檫@個(gè)特點(diǎn),它可以用來編寫服務(wù)器后端的應(yīng)用程序
-
Node.js 作用除了編寫后端應(yīng)用程序,也可以對(duì)前端代碼進(jìn)行壓縮,轉(zhuǎn)譯,整合等等,提高前端開發(fā)和運(yùn)行效率
-
Node.js 基于Chrome V8 引擎封裝,獨(dú)立執(zhí)行 JS 代碼,但是語法和瀏覽器環(huán)境的 V8 有所不同,沒有 document 和 window 但是都支持 ECMAScript 標(biāo)準(zhǔn)的代碼語法
-
想要得到 Node.js 需要把這個(gè)軟件安裝到電腦,下載安裝程序默認(rèn)下一步安裝即可
-
Node.js 沒有圖形化界面,需要使用 cmd 終端命令行(利用一些命令來操控電腦執(zhí)行某些程序軟件)輸入,node -v 檢查是否安裝成功
node -v
-
需求:新建 index.js 文件,編寫打印代碼和 for 循環(huán)打印 3 個(gè) 6
/** * 目標(biāo):編寫 js 代碼,用 node 命令執(zhí)行 * 終端作用:敲擊命令,調(diào)用對(duì)應(yīng)程序執(zhí)行 * 終端打開:目標(biāo)文件->右鍵->在集成終端中打開 * 命令:node xxx.js (注意路徑) */ console.log('Hello, World') for (let i = 0; i < 3; i++) { console.log(6) }
-
Node.js 執(zhí)行目標(biāo) JS 文件,需要使用 node xxx.js 命令來執(zhí)行(我們可以借助 VSCode 集成終端使用,好處:可以快速切換到目標(biāo) JS 文件所在終端目錄,利用相對(duì)路徑找到要執(zhí)行的目標(biāo) JS 文件
02.fs模塊-讀寫文件
目標(biāo)
了解模塊概念,使用 fs 模塊封裝的方法讀寫文件內(nèi)容
講解
-
模塊:類似插件,封裝了方法和屬性供我們使用
-
fs 模塊:封裝了與本機(jī)文件系統(tǒng)進(jìn)行交互的,方法和屬性
-
fs 模塊使用語法如下:
-
加載 fs 模塊,得到 fs 對(duì)象
const fs = require('fs')
-
寫入文件內(nèi)容語法:
fs.writeFile('文件路徑', '寫入內(nèi)容', err => { // 寫入后的回調(diào)函數(shù) })
-
讀取文件內(nèi)容的語法:
fs.readFile('文件路徑', (err, data) => { // 讀取后的回調(diào)函數(shù) // data 是文件內(nèi)容的 Buffer 數(shù)據(jù)流 })
-
-
需求:向 test.txt 文件寫入內(nèi)容并讀取打印
/** * 目標(biāo):使用 fs 模塊,讀寫文件內(nèi)容 * 語法: * 1. 引入 fs 模塊 * 2. 調(diào)用 writeFile 寫入內(nèi)容 * 3. 調(diào)用 readFile 讀取內(nèi)容 */ // 1. 引入 fs 模塊 const fs = require('fs') // 2. 調(diào)用 writeFile 寫入內(nèi)容 // 注意:建議寫入字符串內(nèi)容,會(huì)覆蓋目標(biāo)文件所有內(nèi)容 fs.writeFile('./text.txt', '歡迎使用 fs 模塊讀寫文件內(nèi)容', err => { if (err) console.log(err) else console.log('寫入成功') }) // 3. 調(diào)用 readFile 讀取內(nèi)容 fs.readFile('./text.txt', (err, data) => { if (err) console.log(err) else console.log(data.toString()) // 把 Buffer 數(shù)據(jù)流轉(zhuǎn)成字符串類型 })
03.path模塊-路徑處理
目標(biāo)
使用 path 模塊來得到絕對(duì)路徑
講解
-
為什么在 Node.js 待執(zhí)行的 JS 代碼中要用絕對(duì)路徑:
Node.js 執(zhí)行 JS 代碼時(shí),代碼中的路徑都是以終端所在文件夾出發(fā)查找相對(duì)路徑,而不是以我們認(rèn)為的從代碼本身出發(fā),會(huì)遇到問題,所以在 Node.js 要執(zhí)行的代碼中,訪問其他文件,建議使用絕對(duì)路徑
-
新建 03 文件夾編寫待執(zhí)行的 JS 代碼,訪問外層相對(duì)路徑下的文件,然后在最外層終端路徑來執(zhí)行目標(biāo)文件,造成問題
-
問題原因:就是從代碼文件夾出發(fā),使用
../text.txt
解析路徑,找不到目標(biāo)文件,報(bào)錯(cuò)了! -
解決方案:使用模塊內(nèi)置變量
__dirname
配合 path.join() 來得到絕對(duì)路徑使用const fs = require('fs') console.log(__dirname) // D:\備課代碼\2_node_3天\Node_代碼\Day01_Node.js入門\代碼\03 // 1. 加載 path 模塊 const path = require('path') // 2. 使用 path.join() 來拼接路徑 const pathStr = path.join(__dirname, '..', 'text.txt') console.log(pathStr) fs.readFile(pathStr, (err, data) => { if (err) console.log(err) else console.log(data.toString()) })
-
再次執(zhí)行查看問題就被修復(fù)了!以后在 Node.js 要執(zhí)行的 JS 代碼中訪問其他文件的路徑,都建議使用絕度路徑
04.案例-壓縮前端html
目標(biāo)
壓縮前端代碼,體驗(yàn)前端工程化的例子
講解
-
前端工程化:前端代碼壓縮,整合,轉(zhuǎn)譯,測試,自動(dòng)部署等等工具的集成統(tǒng)稱,為了提高前端開發(fā)項(xiàng)目的效率
-
需求:把準(zhǔn)備好的 html 文件里的回車符(\r)和換行符(\n)去掉進(jìn)行壓縮,寫入到新 html 中
-
步驟:文章來源:http://www.zghlxwxcb.cn/news/detail-727126.html
- 讀取源 html 文件內(nèi)容
- 正則替換字符串
- 寫入到新的 html 文件中,并運(yùn)行查看是否能正常打開網(wǎng)頁
-
代碼如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-727126.html
/** * 目標(biāo)一:壓縮 html 里代碼 * 需求:把 public/index.html 里的,回車/換行符去掉,寫入到 dist/index.html 中 * 1.1 讀取 public/index.html 內(nèi)容 * 1.2 使用正則替換內(nèi)容字符串里的,回車符\r 換行符\n * 1.3 確認(rèn)后,寫入到 dist/index.html 內(nèi) */ const fs = require('fs') const path = require('path') // 1.1 讀取 public/index.html 內(nèi)容 fs.readFile(path.join(__dirname, 'public', 'index.html'), (err, data) => { const htmlStr = data.toString() // 1.2 使用正則替換內(nèi)容字符串里的,回車符\r 換行符\n const resultStr = htmlStr.replace(/[\r\n]/g, '') // 1.3 確認(rèn)后,寫入到 dist/index.html 內(nèi) fs.writeFile(path.join(__dirname, 'dist', 'index.html'), resultStr, err => { if (err) console.log(err) else console.log('壓縮成功') }) })
05.案例-壓縮前端JS
目標(biāo)
體驗(yàn)前端工程化,壓縮,轉(zhuǎn)譯,整合代碼
講解
-
需求:把準(zhǔn)備好的 JS 文件代碼的回車符,換行符,打印語句去掉,并插入到之前 html 內(nèi)容之后
-
步驟:
- 讀取 js 文件內(nèi)容
- 正則表達(dá)式替換回車符,換行符,打印語句為空字符串
- 拼接 html 代碼和 js 代碼,寫入到新的 html 文件中
-
代碼如下:
/** * 目標(biāo)二:壓縮 js 里代碼,并整合到 html 中一起運(yùn)行 * 2.1 讀取 public/index.js 內(nèi)容 * 2.2 使用正則替換內(nèi)容字符串里的,回車符\r 換行符\n 打印語句console.log('xxx'); * 2.3 確認(rèn)后,拼接 html 內(nèi)容寫入到 dist/index.html 內(nèi) */ const fs = require('fs') const path = require('path') fs.readFile(path.join(__dirname, 'public', 'index.html'), (err, data) => { const htmlStr = data.toString() const resultStr = htmlStr.replace(/[\r\n]/g, '') // 2.1 讀取 public/index.js 內(nèi)容 fs.readFile(path.join(__dirname, 'public', 'index.js'), (err, data) => { const jsStr = data.toString() // 2.2 使用正則替換內(nèi)容字符串里的,回車符\r 換行符\n 打印語句console.log('xxx'); const jsResultStr = jsStr.replace(/[\r\n]/g, '').replace(/console.log\('.+?'\);/g, '') const result = `<script>${jsResultStr}</script>` console.log(result) // 2.3 確認(rèn)后,拼接 html 內(nèi)容寫入到 dist/index.html 內(nèi) fs.writeFile(path.join(__dirname, 'dist', 'index.html'), resultStr + result, err => { if (err) console.log(err) else console.log('壓縮成功') }) }) })
06.認(rèn)識(shí)URL中的端口號(hào)
目標(biāo)
認(rèn)識(shí) URL 中端口號(hào)的作用,以及 Web 服務(wù)的作用
講解
- URL 是統(tǒng)一資源定位符,簡稱網(wǎng)址,用于訪問網(wǎng)絡(luò)上的資源
- 端口號(hào)的作用:標(biāo)記服務(wù)器里對(duì)應(yīng)的服務(wù)程序,值為(0-65535 之間的任意整數(shù))
- 注意:http 協(xié)議,默認(rèn)訪問的是 80 端口
- Web服務(wù):一個(gè)程序,用于提供網(wǎng)上信息瀏覽功能
- 注意:0-1023 和一些特定的端口號(hào)被占用,我們自己編寫服務(wù)程序請(qǐng)避開使用
07.http模塊-創(chuàng)建Web服務(wù)
目標(biāo)
基于 Node.js 環(huán)境,使用內(nèi)置 http 模塊,創(chuàng)建 Web 服務(wù)程序
講解
-
需求:引入 http 模塊,使用相關(guān)語法,創(chuàng)建 Web 服務(wù)程序,響應(yīng)返回給請(qǐng)求方一句提示 ‘hello,world’
-
步驟:
- 引入 http 模塊,創(chuàng)建 Web 服務(wù)對(duì)象
- 監(jiān)聽 request 請(qǐng)求事件,對(duì)本次請(qǐng)求,做一些響應(yīng)處理
- 啟動(dòng) Web 服務(wù)監(jiān)聽對(duì)應(yīng)端口號(hào)
- 運(yùn)行本服務(wù)在終端進(jìn)程中,用瀏覽器發(fā)起請(qǐng)求
-
注意:本機(jī)的域名叫做 localhost
-
代碼如下:
/** * 目標(biāo):使用 http 模塊,創(chuàng)建 Web 服務(wù) * Web服務(wù):一個(gè)程序,用于提供網(wǎng)上信息瀏覽服務(wù) * 步驟: * 1. 引入 http 模塊,創(chuàng)建 Web 服務(wù)對(duì)象 * 2. 監(jiān)聽 request 事件,對(duì)本次請(qǐng)求,做一些響應(yīng)處理 * 3. 啟動(dòng) Web 服務(wù)監(jiān)聽對(duì)應(yīng)端口號(hào) * 4. 運(yùn)行本服務(wù)在終端,用瀏覽器訪問 http://localhost:3000/ 發(fā)起請(qǐng)求(localhost 是本機(jī)域名) * 注意:終端里啟動(dòng)了服務(wù),如果想要終止按 ctrl c 停止即可 */ // 1. 引入 http 模塊,創(chuàng)建 Web 服務(wù)對(duì)象 const http = require('http') const server = http.createServer() // 2. 監(jiān)聽 request 事件,對(duì)本次請(qǐng)求,做一些響應(yīng)處理 server.on('request', (req, res) => { res.end('hello, world') // 一次請(qǐng)求只能對(duì)應(yīng)一次響應(yīng) }) // 3. 啟動(dòng) Web 服務(wù)監(jiān)聽對(duì)應(yīng)端口號(hào) server.listen(3000, () => { console.log('Web 服務(wù)啟動(dòng)了') })
08.Web服務(wù)-支持中文字符
目標(biāo)
讓 Web 服務(wù),返回中文字符,瀏覽器正確解析加載
講解
-
需求:讓 Web 服務(wù)返回中文字符,瀏覽器能正確加載解析
-
步驟:給 Web 服務(wù)程序添加響應(yīng)頭,設(shè)置內(nèi)容類型和正確的編碼格式,重啟 Web 服務(wù)測試訪問即可
res.setHeader('Content-Type', 'text/html;charset=utf-8')
-
編碼:編碼是信息從一種形式或格式轉(zhuǎn)換為另一種形式的過程,指的把文字在計(jì)算機(jī)里的二進(jìn)制數(shù)據(jù),用什么形式展示出來
-
utf-8編碼:是一種關(guān)系映射表,也叫 utf-8 編碼表,可以把中文,英文等等很多字符準(zhǔn)確的展示出來
09.案例-省份列表接口
目標(biāo)
基于 Web 服務(wù),編寫代碼,把省份列表數(shù)據(jù)響應(yīng)給請(qǐng)求方
講解
-
需求:基于 Web 服務(wù),開發(fā)提供省份列表數(shù)據(jù)的接口,了解下后端的代碼工作過程
-
步驟:
- 基于 http 模塊,創(chuàng)建 Web 服務(wù)
- 使用 req.url 獲取請(qǐng)求資源路徑,并讀取 province.json 理論省份數(shù)據(jù)返回給請(qǐng)求方
- 其他路徑,暫時(shí)返回不存在的提示
- 運(yùn)行 Web 服務(wù),用瀏覽器發(fā)起請(qǐng)求測試,看是否可以獲取到省份列表數(shù)據(jù)
-
代碼如下:
/** * 目標(biāo):基于 Web 服務(wù),開發(fā)-省份列表數(shù)據(jù)接口 * 步驟: * 1. 創(chuàng)建 Web 服務(wù) * 2. 使用 req.url 獲取請(qǐng)求的資源路徑,讀取 json 文件數(shù)據(jù)返回 * 3. 其他請(qǐng)求的路徑,暫時(shí)返回不存在的提示 * 4. 運(yùn)行 Web 服務(wù),用瀏覽器請(qǐng)求地址查看效果 */ const fs = require('fs') const path = require('path') // 1. 創(chuàng)建 Web 服務(wù) const http = require('http') const server = http.createServer() server.on('request', (req, res) => { // 2. 使用 req.url 獲取請(qǐng)求的資源路徑,讀取 json 文件數(shù)據(jù)返回 if (req.url === '/api/province') { fs.readFile(path.join(__dirname, 'data/province.json'), (err, data) => { res.setHeader('Content-Type', 'application/json;charset=utf-8') res.end(data.toString()) }) } else { // 3. 其他請(qǐng)求的路徑,暫時(shí)返回不存在的提示 res.setHeader('Content-Type', 'text/html;charset=utf-8') res.end('你要訪問的資源路徑不存在') } }) server.listen(3000, () => { console.log('Web 服務(wù)啟動(dòng)了') })
10.案例-城市列表接口
目標(biāo)
體驗(yàn)城市列表接口開發(fā)效果,以及查詢參數(shù)如何傳遞給后端,后端是如何找到對(duì)應(yīng)的數(shù)據(jù)
講解
-
需求:基于剛剛的 Web 服務(wù),開發(fā)提供城市列表數(shù)據(jù)的接口,了解下后端代碼的工作過程
-
步驟:
- 判斷 req.url 資源路徑+查詢字符串,路徑前綴匹配 /api/city
- 借助 querystring 模塊的方法,格式化查詢字符串
- 讀取 city.json 城市數(shù)據(jù),匹配省份名字下屬城市列表
- 返回城市列表,啟動(dòng) Web 服務(wù)測試
-
代碼如下:
/** * 目標(biāo):基于 Web 服務(wù),開發(fā)-城市列表數(shù)據(jù)接口 * 步驟: * 1. 判斷 req.url 資源路徑+查詢字符串,路徑前綴匹配/api/city * 2. 借助 querystring 模塊的方法,格式化查詢參數(shù)字符串 * 3. 讀取 city.json 城市數(shù)據(jù),匹配省份名字下屬城市列表 * 4. 返回城市列表,啟動(dòng) Web 服務(wù)測試 */ const qs = require('querystring') const fs = require('fs') const path = require('path') const http = require('http') const server = http.createServer() server.on('request', (req, res) => { // 省份列表接口 if (req.url === '/api/province') { fs.readFile(path.join(__dirname, 'data/province.json'), (err, data) => { res.setHeader('Content-Type', 'application/json;charset=utf-8') res.end(data.toString()) }) // 1. 判斷 req.url 資源路徑+查詢字符串,路徑前綴匹配/api/city } else if (req.url.startsWith('/api/city')) { // 城市列表接口 // 2. 借助 querystring 模塊的方法,格式化查詢參數(shù)字符串 // req.url: '/api/city?pname=遼寧省' // 以?分隔符分割,拿到'pname=遼寧省'查詢參數(shù)字符串 const str = req.url.split('?')[1] // 把查詢參數(shù)字符串 轉(zhuǎn)成 JS 對(duì)象結(jié)構(gòu) const query = qs.parse(str) // 獲取前端發(fā)來的省份名字 const pname = query.pname // 3. 讀取 city.json 城市數(shù)據(jù),匹配省份名字下屬城市列表 fs.readFile(path.join(__dirname, 'data/city.json'), (err, data) => { // 把 JSON 文件內(nèi)對(duì)象格式字符串,轉(zhuǎn)成對(duì)象結(jié)構(gòu) const obj = JSON.parse(data.toString()) // 省份名字作為 key,去obj對(duì)象里取到對(duì)應(yīng)城市列表 value 值 const cityList = obj[pname] // 4. 返回城市列表,啟動(dòng) Web 服務(wù)測試 // 響應(yīng)的是 JSON 字符串內(nèi)容 res.setHeader('Content-Type', 'application/json;charset=utf-8') res.end(JSON.stringify(cityList)) }) } else { res.setHeader('Content-Type', 'text/html;charset=utf-8') res.end('你要訪問的資源路徑不存在') } }) server.listen(3000, () => { console.log('Web 服務(wù)啟動(dòng)了') })
11.案例-瀏覽時(shí)鐘
目標(biāo)
體驗(yàn) Web 服務(wù)除了接口數(shù)據(jù)以外,還能返回網(wǎng)頁資源等
講解
-
需求:基于 Web 服務(wù),開發(fā)提供網(wǎng)頁資源的功能,了解下后端的代碼工作過程
-
步驟:
- 基于 http 模塊,創(chuàng)建 Web 服務(wù)
- 使用 req.url 獲取請(qǐng)求資源路徑為 /index.html 的時(shí)候,讀取 index.html 文件內(nèi)容字符串返回給請(qǐng)求方
- 其他路徑,暫時(shí)返回不存在的提示
- 運(yùn)行 Web 服務(wù),用瀏覽器發(fā)起請(qǐng)求
-
代碼如下:
/** * 目標(biāo):編寫 web 服務(wù),監(jiān)聽請(qǐng)求的是 /index.html 路徑的時(shí)候,返回 dist/index.html 時(shí)鐘案例頁面內(nèi)容 * 步驟: * 1. 基于 http 模塊,創(chuàng)建 Web 服務(wù) * 2. 使用 req.url 獲取請(qǐng)求資源路徑,并讀取 index.html 里字符串內(nèi)容返回給請(qǐng)求方 * 3. 其他路徑,暫時(shí)返回不存在提示 * 4. 運(yùn)行 Web 服務(wù),用瀏覽器發(fā)起請(qǐng)求 */ const fs = require('fs') const path = require('path') // 1. 基于 http 模塊,創(chuàng)建 Web 服務(wù) const http = require('http') const server = http.createServer() server.on('request', (req, res) => { // 2. 使用 req.url 獲取請(qǐng)求資源路徑,并讀取 index.html 里字符串內(nèi)容返回給請(qǐng)求方 if (req.url === '/index.html') { fs.readFile(path.join(__dirname, 'dist/index.html'), (err, data) => { res.setHeader('Content-Type', 'text/html;charset=utf-8') res.end(data.toString()) }) } else { // 3. 其他路徑,暫時(shí)返回不存在提示 res.setHeader('Content-Type', 'text/html;charset=utf-8') res.end('你要訪問的資源路徑不存在') } }) server.listen(8080, () => { console.log('Web 服務(wù)啟動(dòng)了') })
到了這里,關(guān)于10-Node.js入門的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!