了解node基本用法語法、fs文件系統模塊、path路徑模塊


Node.js簡介

概念:是一個基於 Chrome V8 引擎的 JavaScript 運行環境。
Node.js 的官網地址: https://nodejs.org/zh-cn/

Node.js 中的 JavaScript 運行環境

 注意:

瀏覽器是 JavaScript 的前端運行環境。
Node.js 是 JavaScript 的后端運行環境
③ Node.js 中無法調用 DOM 和 BOM 等
瀏覽器內置 API

 Node.js 環境的安裝

 Node.js 的官網首頁(https://nodejs.org/en/)雙擊下載

LTS 版本和 Current 版本的區別

① LTS 為長期穩定版,對於 追求穩定性企業級項目來說,推薦安裝 LTS 版本的 Node.js。
② Current 為新特性嘗鮮版,對熱衷於 嘗試新特性的用戶來說,推薦安裝 Current 版本的 Node.js。但是,Current 版本中可
能存在隱藏的 Bug 或安全性漏洞,因此不推薦在企業級項目中使用 Current 版本的 Node.js。

查看已安裝的 Node.js 的版本號 

使用快捷鍵( Windows徽標鍵 + R)打開運行面板,輸入 cmd 后直接回車,即可打開終端
打開終端,在終端輸入命令 node –v 后,即可查看下載的版本

終端中的快捷鍵 

① 使用 鍵,可以快速定位到上一次執行的命令
② 使用 tab 鍵,能夠快速補全路徑
③ 使用 esc 鍵,能夠快速清空當前已輸入的命令
④ 輸入 cls 命令,可以清空終端

fs 文件系統模塊 

fs 模塊是 Node.js 官方提供的、用來操作文件的模塊。它提供了一系列的方法和屬性,用來滿足用戶對文件的操作需求

JavaScript 代碼中,使用 fs 模塊來操作文件,則需要使用如下的方式先導入它:

 讀取指定文件中的內容

 1、 fs.readFile() 的語法格式

參數解讀:

• 參數1:必選參數,字符串,表示文件的路徑。

• 參數2:可選參數,表示以什么編碼格式來讀取文件。
• 參數3:必選參數,文件讀取完成后,通過回調函數拿到讀取的結果。
 
 示列:
 1 // 1. 導入 fs 模塊,來操作文件
 2 const fs = require('fs')
 3 // 2. 調用 fs.readFile() 方法讀取文件
 4   //  參數1:讀取文件的存放路徑
 5   //  參數2:讀取文件時候采用的編碼格式,一般默認指定 utf8
 6   //  參數3:回調函數,拿到讀取失敗和成功的結果  err  dataStr
 7 fs.readFile('./files/11.txt', 'utf8', function(err, dataStr) {
 8   // 2.1 打印失敗的結果
 9   // 如果讀取成功,則 err 的值為 null
10   // 如果讀取失敗,則 err 的值為 錯誤對象,dataStr 的值為 undefined
11   // console.log(err)
12   // console.log('-------')
13   // 2.2 打印成功的結果
14   console.log(dataStr)
15   // 判斷文件是否讀取成功
16   if (err) {
17     return console.log("讀取文件失敗!" + err.message)
18   }
19   console.log("讀取文件成功!" + dataStr)
20 })

向指定的文件中寫入內容

2、fs.writeFile() 的語法格式

參數解讀:

  •  參數1:必選參數,需要指定一個文件路徑的字符串,表示文件的存放路徑。

•  參數2:必選參數,表示要寫入的內容。

•  參數3:可選參數,表示以什么格式寫入文件內容,默認值是 utf8

•  參數4:必選參數,文件寫入完成后的回調函數。

   示列:
 1 // 1. 導入 fs 文件系統模塊
 2 const fs = require('fs')
 3 // 2. 調用 fs.writeFile() 方法,寫入文件的內容
 4 //    參數1:表示文件的存放路徑
 5 //    參數2:表示要寫入的內容
 6 //    參數3:回調函數
 7 fs.writeFile('./files/3.txt', 'ok123', function(err) {
 8 // 2.1 如果文件寫入成功,則 err 的值等於 null
 9 // 2.2 如果文件寫入失敗,則 err 的值等於一個 錯誤對象
10 console.log(err)
11 // 3判斷文件是否寫入成功
12 if (err) {
13     return console.log('文件寫入失敗!' + err.message)
14   }
15   console.log('文件寫入成功!')
16 })

  fs 模塊 - 路徑動態拼接的問題 

  在使用 fs 模塊操作文件時,如果提供的操作路徑是以 ./../ 開頭的相對路徑時,很容易出現路徑動態拼接錯誤的問題。

  原因:代碼在運行的時候,會以執行 node 命令時所處的目錄,動態拼接出被操作文件的完整路徑。

  解決方案:在使用 fs 模塊操作文件時,直接提供完整的路徑,不要提供 ./ 或 ../ 開頭的相對路徑,從而防止路徑動態拼接的問題。

path 路徑模塊

概念:是 Node.js 官方提供的、用來處理路徑的模塊

 1、path.join() 方法,用來將多個路徑片段拼接成一個完整的路徑字符串

 語法格式

參數解讀:

 • ...paths <string> 路徑片段的序列

 • 返回值: <string>
 
 代碼示例

注意:今后凡是涉及到路徑拼接的操作,都要使用 path.join() 方法進行處理。不要直接使用 + 進行字符串的拼接。

 2、path.basename() 獲取路徑中的文件名
 參數解讀:
 •  path <string> 必選參數,表示一個路徑的字符串
 •  ext <string> 可選參數,表示文件擴展名
 •  返回: <string> 表示路徑中的最后一部分
 
代碼示例

3、path.extname() 獲取路徑中的文件擴展名

語法格式

參數解讀:

•  path <string>必選參數,表示一個路徑的字符串
•  返回: <string> 返回得到的擴展名字符串
  代碼示例

綜合案例 - 時鍾案例

需求: 

將素材目錄下的 page.html 頁面,拆分成三個文件,分別是:
•  index.css
•  index.js
•  index.html 
 素材 page.html
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 
 4 <head>
 5     <meta charset="UTF-8">
 6     <meta http-equiv="X-UA-Compatible" content="IE=edge">
 7     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 8     <title>Document</title>
 9     <style>
10         html,
11         body {
12             margin: 0;
13             padding: 0;
14             height: 100%;
15             background-image: linear-gradient(to bottom right, red, gold);
16         }
17 
18         .box {
19             width: 400px;
20             height: 250px;
21             background-color: rgba(255, 255, 255, 0.6);
22             border-radius: 6px;
23             position: absolute;
24             left: 50%;
25             top: 40%;
26             transform: translate(-50%, -50%);
27             box-shadow: 1px 1px 10px #fff;
28             text-shadow: 0px 1px 30px white;
29 
30             display: flex;
31             justify-content: space-around;
32             align-items: center;
33             font-size: 70px;
34             user-select: none;
35             padding: 0 20px;
36 
37             /* 盒子投影 */
38             -webkit-box-reflect: below 0px -webkit-gradient(linear, left top, left bottom, from(transparent), color-stop(0%, transparent), to(rgba(250, 250, 250, .2)));
39         }
40     </style>
41 </head>
42 
43 <body>
44     <div class="box">
45         <div id="HH">00</div>
46         <div>:</div>
47         <div id="mm">00</div>
48         <div>:</div>
49         <div id="ss">00</div>
50     </div>
51 
52     <script>
53         window.onload = function () {
54             // 定時器,每隔 1 秒執行 1 次
55             setInterval(() => {
56                 var dt = new Date()
57                 var HH = dt.getHours()
58                 var mm = dt.getMinutes()
59                 var ss = dt.getSeconds()
60 
61                 // 為頁面上的元素賦值
62                 document.querySelector("#HH").innerHTML = padZero(HH)
63                 document.querySelector("#mm").innerHTML = padZero(mm)
64                 document.querySelector("#ss").innerHTML = padZero(ss)
65             }, 1000)
66         }
67         // 補零函數
68         function padZero(n) {
69             return n > 9 ? n : "0" + n
70         }
71 
72     </script>
73 </body>
74 
75 </html>

 拆分代碼如下所示:

 1 // 1 導入
 2 // 導入fs文件模塊
 3 const fs = require("fs")
 4 // 導入路徑
 5 const path = require("path")
 6 // const { join } = require("path/posix") 坑:敲resove這幾個字代碼后,會自動形成此句代碼,導致報錯,將其注釋或者刪除即可正常運行
 7 // 2 定義正在表達式
 8 // \代表轉義符,\s匹配空格(包含換行符、制表符空格符),\S非空格
 9 // []匹配方括號中的任意字符, *重復0次或更多次,
10 const regStyle = /<style>[\s\S]*<\/style>/
11 const regStcript = /<script>[\s\S]*<\/script>/
12 // 3 讀取文件
13 fs.readFile(path.join(__dirname, "./index.html"), "utf8", function (err, data) {
14   // 判斷文件是否讀取成功
15   if (err) {
16     // 讀取文件失敗
17     console.log("讀取文件失敗" + err.message)
18   } else {
19     // 讀取文件成功
20     console.log("讀取文件成功" + data)
21     // 讀取文件成功后,調用對應的 3 個方法,解析出 css、js、html 內容
22     resoveCss(data)
23     resoveJs(data)
24     resoveHTML(data)
25   }
26   // 3 寫入html.css樣式表
27   function resoveCss(htmlStr) {
28     // 使用正則提取頁面中的 <style></style>
29     const r1 = regStyle.exec(htmlStr)
30     // cnsole.log(r1[0])
31     // 將提取出來的樣式字符串,做進一步的處理
32     const newCss = r1[0].replace("<style>", "").replace("</style>", "")
 //###注意: 寫入文件時,需要先建個文件(如index.css),然后再終端運行 node .\clock.js,樣式表里才會顯示出來
33 fs.writeFile( 34 path.join(__dirname, "./index.css"), 35 newCss, 36 function (err, data) { 37 if (err) { 38 console.log("CSS樣式文件寫入失敗" + err.message) 39 } else { 40 console.log("CSS樣式文件寫入成功") 41 } 42 } 43 ) 44 } 45 // 4 寫入html.js樣式表 46 function resoveJs(htmlJs) { 47 // exec 檢索字符串 中的正在表達式的匹配 48 const r2 = regStcript.exec(htmlJs) 49 // r2[0]拿到匹配成功后索引為0的元素 50 const newJS = r2[0].replace("<script>", "").replace("</script>", "") 51 fs.writeFile( 52 path.join(__dirname, "./index.js"), 53 newJS, 54 function (err, data) { 55 if (err) { 56 console.log("JS文件寫入成功" + err.message) 57 } else { 58 console.log("JS文件寫入成功!") 59 } 60 } 61 ) 62 } 63 // 4 寫入index.html樣式表 64 function resoveHTML(html) { 65 const newHTML = html 66 .replace(regStyle, '<link rel="stylesheet" href="./index.css">') 67 .replace(regStcript, '<script src="./index.js"></script>') 68 fs.writeFile(path.join(__dirname, "./index.html"), newHTML, function (err) { 69 if (err) { 70 console.log("HTML文件寫入失敗!" + err.message) 71 } else { 72 console.log("HTML文件寫入成功!") 73 } 74 }) 75 } 76 })

 

 

 

 

 

 
 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM