Node基礎入門(二):模塊

上一篇《Node基礎入門(一):起步》

一、全局模塊

1. 定義:何時何地都能使用,不需要引入;

2. process.env:環境變量,執行Node命令console.log(process.env) ,類似於電腦的系統變量 :

3. process.argv:在D:\node\index.js中,輸入console.log(process.argv),然後在命令行工具中輸入node index.js,發現打印了一個長度爲2的數組,我們再試下在後面添加一些信息,輸入node index.js a b 12 34 大海,結果如下圖:

我們發現,a在數組的第2個位置,b在第3個位置……,也就是說這裏相當於收錄用戶的輸入內容?於是,我們可以利用這一點實現一個簡單的加法計算器!index.js代碼修改如下:

// 將數組第2位的數作爲被加數,注意將字符串轉爲整形
let num1 = parseInt(process.argv[2])

// 將數組第3位的數作爲加數
let num2 = parseInt(process.argv[3])

// 打印二者的和
console.log(num1 + num2)

命令行輸入node index.js 1 2,結果:3

4. __dirname:當前文件目錄,index.js

console.log(__dirname)

命令行輸入node index.js,結果:D:\node

二、系統模塊

1. 定義:需要require,但不需要額外下載;

2. path:用於處理文件路徑和目錄路徑的實用工具 ,index.js代碼修改如下:

let path = require('path')

console.log(path.dirname('/node/a/b/c/1.jpg')) // 文件路徑
console.log(path.basename('/node/a/b/c/1.jpg')) // 文件名
console.log(path.extname('/node/a/b/c/1.jpg')) // 文件擴展名
console.log(path.resolve('/node/a/b/c', '../../', 'd')) // 在c的上級的上級(即a下面)添加一個d
console.log(path.resolve(__dirname, 'index.js')) // 這樣可以得到index.js的絕對路徑

命令行輸入node index.js,結果如下:

/node/a/b/c
1.jpg
.jpg
D:\node\a\d
D:\node\index.js

3. fs:用於文件讀寫操作

(1). 讀文件fs.readFile()

let fs = require('fs')

// 第一個參數是文件路徑   
fs.readFile('./a.txt', (err, data) => {
  if (err) {
    console.log(err)
  } else {
    console.log(data)
    console.log(data.toString())
  }
})

在index.js同級目錄下新建a.txt,內容爲abc,命令行輸入node index.js,結果:

<Buffer 61 62 63> // abc的二進制格式
abc // 調用.toString()才能打印abc

(2). 寫文件fs.writeFile()

let fs = require('fs')

fs.writeFile('b.txt', '月薪2萬', (err) => {
  if (err) {
    throw err
  }
})

命令行輸入node index.js,結果:D:\node\下多了一個b.txt文件,內容爲“月薪2萬”。如果改成“月薪3萬”再執行一遍,b.txt文件內容就是“月薪3萬”,如何做到不覆蓋而是追加呢?加一個{flag: 'a'}(“a”表示append)即可:

fs.writeFile('b.txt', '月薪2萬', {flag: 'a'}, (err) => {...})

以上都是異步的(推薦),我們看看同步的方式:

// 同步讀
let data = fs.readFileSync('./a.txt')
console.log(data.toString()) // abc

// 同步寫  
fs.writeFileSync('b.txt', '鼠你好運')

三、自定義模塊

1. 定義:require自己封裝的模塊;

2. exports:導出模塊,我們在D:\node\下新建mod.js,向外暴露a和b:

exports.a = 1
exports.b = 2

修改index.js

const mod = require('mod') // .js可以省略

console.log(mod.a)
console.log(mod.b)

命令行執行index.js,發現報錯:找不到mod.js。原因是引用路徑不對,正確的路徑應該爲'./mod',這樣就能拿到a和b了。

其實,如果不加'./'具體路徑,Node默認從node_modules文件夾下加載該模塊。

如果既沒有指明路徑,又沒有node_modules文件夾,就會從Node的安裝目錄處找(裏面也有一個node_modules文件夾,安裝了一些全局的模塊)。

3. module:導出對象、方法、類,修改mod.js代碼:

// 通過導出對象以達到批量導出的目的
module.exports = {
  a: 1, 
  b: 2
}

// 或導出方法
module.exports = function () {
  console.log(123)
}

// 或導出類
module.exports = class {
  constructor (name) {
    this.name = name
  }
  show () {
    console.log(this.name)
  }
}

修改index.js

const mod = require('./mod')

// 若引入的是一個對象
console.log(mod.a) // 1
console.log(mod.b) // 2

// 若引入的是一個方法
mod() // 123

// 若引入的是一個類
let m = new mod('大海')
m.show() // 大海

四、HTTP模塊(核心)

服務器對象http.createServer(),快速搭建一個服務器,依然修改D:\node\index.js:

let http = require('http')

http.createServer(() => {
  console.log('我來啦')
}).listen(8080)

命令行執行node index.js,接着新開一個瀏覽器窗口,訪問localhost:8080,現在再打開命令行工具,發現已經打印了“我來啦”(訪問多少次就打印多少次),再繼續修改index.js

let http = require('http')

// 加入請求和響應參數    
http.createServer((req, res) => {
  // 在頁面上打印‘index’
  res.write('index')
  // 需要標明結束
  res.end()

  // 或直接
  res.end('index')
}).listen(8080)

命令行執行node index.js,瀏覽器訪問localhost:8080,頁面出現“index”:

爲了讓頁面內容豐富一點,我們在D:\node\下新建一個網頁文件a.html,內容爲一句話加一張圖(準備一張圖片blog.jpg放入D:\node\):

<!DOCTYPE html>
<html>
<head>
  <title>Page Title</title>
</head>
<body>
  <h1>Welcome To My Blog</h1>
  <img src='./blog.jpg' alt='img'/>
</body>
</html>

這裏需要使用上面講到的fs文件讀寫的內容,修改index.js

let http = require('http')
// 需要讀網頁和圖片文件
let fs = require('fs')

http.createServer((req, res) => {
  // req.url就是需要訪問的文件路徑:/a.html 和 /blog.jpg
  fs.readFile(`.${req.url}`, (err, data) => {
    if (err) {
      res.writeHead(404)
      res.end('404 page not found!')
    } else {
      res.end(data)
    }
  })
}).listen(8080)

命令行執行node index.js,瀏覽器訪問localhost:8080/a.html

也可以直接訪問圖片localhost:8080/blog.jpg

下一篇《Node基礎入門(三):數據交互》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章