Node基礎入門(二):模塊

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

1、全局模塊

1. 定義:什麼時候何地都能使用,不須要引入;node

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

3. process.argv:在D:nodeindex.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.jsapp

console.log(__dirname)

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

2、系統模塊

1. 定義:須要require,但不須要額外下載;工具

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

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', '鼠你好運')

3、自定義模塊

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() // 大海

4、HTTP模塊(核心)

服務器對象http.createServer(),快速搭建一個服務器,依然修改D:nodeindex.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基礎入門(三):數據交互》

相關文章
相關標籤/搜索