關於node.js的基礎

龜霸也是高達發表於2020-09-30

node.js 的一些基礎

前端的工程化,模組化,框架,需要有一套工具去支撐系統執行起來.而這套工具就是需要nodejs這個環境去實現的,因此, 首先需要先學習node.js開始

node.js 的簡單介紹

首先,什麼是node.js?

  • 是基於chrome V8 引擎的javascript執行環境(官網上這麼寫的)
  • 聽著有點抽象,下面舉例demo來加強理解

node.js 的用處

  • 開發網站的後臺,之前的做的小demo裡有用到,用來開啟一個本地伺服器https://github.com/gitgundam/server-mock
  • 開發網站後臺可以使用很多語言,但是如果只會js,那就很麻煩,還需要學習其他語言,現在有了node.js.直接使用js即可實現,學習成本更低
  • 開發本地工具,應用
  • 開發本地工具,應用,在node.js之前需要學習更多其他語言(例如 c語言).現在node.js即可實現,學習成本更低

node.js 的特點

  • 事件驅動,非阻塞式I/O模型
  • 強大的生態,第三方
    提到node.js,就不得不丟擲兩個概念

計算密集型

  • 大量的計算,消耗cpu資源,比如計算圓周率,對視訊進行高清解碼
  • c語言
  • 比如密碼破解

I0密集型

  • 網路/磁碟的讀寫
  • node.js
  • 比如網站展示,資料互動,對cpu運算要求不高

安裝node.js

進入官網下載安裝即可,安裝會附帶npm.
下面是簡單的例子加深對node.js 的理解

例子1

用最簡單的一個例子實現node.js 的功能

  • 本地dmoe資料夾 建立test-1.js檔案
let a = 1
let b = 2 
console.log(a+b)

  • 開啟終端,在資料夾目錄使用node.js 執行 test-1.js檔案
  • 結果如下圖,輸出3
    在這裡插入圖片描述

例子2 使用node.js的內建模組來做些事

讀取一個檔案A,再將檔案內容寫入檔案B中

  • 首先,從node.js的官方API文件中可以看到,非同步地讀取檔案的全部內容。
  • 在這裡插入圖片描述
  • 文件上寫了這麼用
  • 在這裡插入圖片描述js這麼寫
const fs = require('fs') //載入node.js的fs模組

fs.readFile('./A.md','utf-8',(err, data) => {
  if (err) throw err;
  console.log(data);
})

使用node.js環境執行test-1.js,讀取A.md檔案的內容並列印出來,得到結果

在這裡插入圖片描述- 使用
把A.md的內容轉成大寫並寫入B.md

const fs = require('fs') //載入node.js的fs模組

fs.readFile('./A.md','utf-8',(err, data) => {
  if (err) throw err;
  text = data.toUpperCase()
  fs.writeFile('./B.md',text,err=>{
    console.log(err)
    return
  })
  console.log('寫入完成');
})

在這裡插入圖片描述

例子3 引入本地模組

很多情況下,我們需要自己寫點東西來實現想要的功能,這時候就需要引入自己的模組

  • 定義一個模組
//util.js
//定義一個模組util,裡面是其功能
function sum(){
  return [...arguments].reduce((v1,v2)=>v1+v2)
}
//把自定義的fact繫結到module.exports這個物件上
module.exports.sum = sum

//其他檔案裡就可以引入這個模組,通過require('檔案路徑')
  • 呼叫這個模組
//text-2.js
const util = require('./util.js')//一定要寫相對路徑,否則node.js會先從內建模組中尋找
console.log(util.sum(1,2,3,4,5))

在這裡插入圖片描述

module.exports

module.exports理解為就是一個空物件,上面那段程式碼中,將sum繫結到這個空物件中.

  • 其實字面意思就是模組輸出.需要呼叫時,先載入模組,然後呼叫這個空物件中的方法

例子4 使用npm第三方模組

npm的最大優勢就是擁有一個強大的資料庫,擁有全世界的開發者開發的模組供使用
https://www.npmjs.com/可以在這個網站搜尋模組,然後根據文件使用.

  • 例如實現一個將markdown格式文字轉換為html格式文字
  • 比如使用下面這個人寫的模組
    在這裡插入圖片描述
  • 先根據文件寫的來

const fs = require('fs')//使用fs模組

//根據文件的設定來
const MarkdownIt = require('markdown-it')
let md = new MarkdownIt()
//先讀取內容
fs.readFile('./A.md', 'utf-8', (err, data) => {
  if (err) throw err
  let result = md.render(data)//文件中的api,轉換成htmml的內容
  //把內容輸入B.md
  fs.writeFile('./B.md', result, err => {
    if (err) throw err
    console.log('寫入完成')
  })
})

結果會發現: 直接報錯.為啥呢? 因為模組還沒下載到本地,因此需要先下載這個模組到本地

  • 使用npm install xxx來下載模組
    在這裡插入圖片描述

  • 可以發現當前資料夾內出現了個新的資料夾
    在這裡插入圖片描述

  • 再次終端中執行node test-3.js
    在這裡插入圖片描述

  • 這次內容寫入成功,輸出寫入完成,檢視B.md,可以發現內容確實轉換完成
    在這裡插入圖片描述

以上就是node.js模組化的使用方法

common js規範

下面說下common js規範,那麼什麼是common js規範呢?

一個檔案是一個模組

  • 變數/函式/類 都是私有的.

每個模組內部,module都是代表當前模組

剛才就用到了的module.exports,意思就是自己的模組對外輸出.這是一個對外介面,同時這是個空物件,在這個模組上(物件上)可以帶上自己模組本身的函式.

  • module.exports是一個對外介面.載入某個模組,其實就是在載入該模組的module.exports
  • 注意module.exportsexports的差異,預設module.exports = exports(簡寫)

require()方法用於載入模組

  • 需要注意載入模組路徑寫法的差
    注意注意!! 預設module.exports = exports,所以單獨exports是個物件,需要新增物件裡的屬性!!!然後再把模組裡的函式新增到這個屬性上!!!
  • 也可以module.exports直接等於 函式名稱, 這樣當require()時,require()就是模組本身.模組就是個函式,可以直接使用

Node.js 在require第三方包時

  • 先在當前專案的 node_modules裡查詢這個包
  • 如果當前專案的 node_modules裡找不到,再從上一級路徑的node_modules裡查詢
  • 最終會找到 /(根目錄),如果還找找不到,會報 “找不到模組”的錯誤

下面是node.js 模組化圖解

在這裡插入圖片描述

相關文章