Node.js

Node是什么

Node.js是一個基于V8引擎運行環(huán)境。

- v8引擎:JS的渲染器

Node.js是一個服務(wù)器平臺掉瞳。

Node.js底層使用C++編寫的。

Node.js是安裝在操作系統(tǒng)上的一個程序,這個程序的工作的時候是跟操作系統(tǒng)在對話溺蕉。(交互)

Node執(zhí)行js的方式

在Node.js中奏属,運行js代碼的方式有兩種

  • 直接運行js文件:node app.js
  • 使用REPL模式運行js代碼
    • R:Read讀取js代碼
    • E: Execute執(zhí)行JS代碼
    • P:Print打印js代碼
    • L: Loop 循環(huán)js代碼

NodeJS VS 瀏覽器

Node和瀏覽器都是運行js的環(huán)境

Node.js 瀏覽器
語法相同 支持ECMAScript 支持ECMAScript
API不同 Global跨跨、module、buffer囱皿、domain等 BOM勇婴、DOM
老大不同 Global window
交互對象 在node.js運行js,是和操作系統(tǒng)對話 在瀏覽器中運行js嘱腥,耕渴,是和瀏覽器對話

module API是什么

  • module是一個內(nèi)置的全局對象。

  • module用于表示模塊齿兔。

  • 模塊:模塊就是封裝在一個js文件中的代碼塊橱脸。(在Node的模塊系統(tǒng)中,每一個js文件都是一個模塊)

    const sum = (a,b) => {
        return a + b
    }
    const minus = (a,b) => {
        return a - b
    }
    
  • module對象

> module
Module {
  id: '<repl>',
  path: '.',
  exports: {},
  filename: null,
  loaded: false,
  children: [],
  paths: [
    '/Users/zj/Desktop/7/0327/repl/node_modules',
    '/Users/zj/Desktop/7/0327/node_modules',
    '/Users/zj/Desktop/7/node_modules',
    '/Users/zj/Desktop/node_modules',
    '/Users/zj/node_modules',
    '/Users/node_modules',
    '/node_modules',
    '/Users/zj/.node_modules',
    '/Users/zj/.node_libraries',
    '/usr/local/lib/node'
  ]
}

NodeJS中的module系統(tǒng)分為幾種分苇?

模塊系統(tǒng)的背景

  • JS缺點1:沒有模塊

  • JS缺點2:存在命名沖突(set map 模塊)

    <head>
      <script src='./jquery.js'></script>
      <script scr='./tquery.js'></script>
      <script scr='./script.js'></script>
    </head>
    
  • CommonJS : 面向服務(wù)器 通過Require()

  • RequireJS: 基于CommonJS的一個包裝添诉。

  • AMD: Asynchrouns Module D? :面向瀏覽器

Node.js的模塊系統(tǒng)分為兩種

  • CommonJS: Node.js的默認(rèn)模塊系統(tǒng)。采用第三方的模塊系統(tǒng)组砚。
  • ECMAScript: 是Node.js的標(biāo)準(zhǔn)模塊系統(tǒng)吻商。(向原生語言看齊)

NodeJS中的module分為幾種?

  • 本地模塊:在項目中糟红,由開發(fā)者創(chuàng)建的模塊艾帐。
  • 內(nèi)置模塊:由Node.js提供的預(yù)設(shè)模塊乌叶。
    • 內(nèi)置模塊是全局模塊。
    • 內(nèi)置模塊是Node.js的核心模塊柒爸。
  • 第三方模塊: 在項目中准浴,由其他開發(fā)者創(chuàng)建的模塊。

NPM是什么

  • NPM: Node Package Manager Node軟件包管理器
  • NPM就是Node.js平臺的商店捎稚。

CommonJS模塊系統(tǒng)

module對象

定義

  • module對象表示一個模塊乐横。
  • 一個JS文件就是一個模塊。
  • 模塊是封裝在js文件中代碼塊今野,擁有獨立的作用域葡公。
  • module對象是一個全局對象。

module.prototype.require()

定義

require()方法用于加載外部模塊条霜。

  • require()是node的一個內(nèi)置函數(shù)催什。
  • require()在工作的時候,它用于包裹(讀取+執(zhí)行)模塊文件中的代碼塊宰睡。

語法

module.require(id)
require(id) //module是全局對象蒲凶,可省略

Id: 表示加載的模塊的文件名

返回值

返回從模塊文件中導(dǎo)出的模塊

示例


module.exports

定義

module.exports 用于暴露/導(dǎo)出/分享模塊。(暴露作用域)

  • module.exports是一個對象拆内。
  • Module.exports 用于包裹要導(dǎo)出的模塊旋圆。

語法

//語法1:導(dǎo)出單個變量(變量名、函數(shù)名麸恍、類名)
const sum = (a,b) => {
    return a + b
}
module.exports = sum //單個變量名

//語法2:導(dǎo)出單個直接量
module.exports = (a,b) => {
    return a + b
}

//語法3:導(dǎo)出多個變量
const sum = (a,b) => {
    return a + b
}
const minus = (a,b) => {
    return a - b
}
module.exports = {
    // sum:sum,
    // minus: minus
    sum,
    minus
}

//語法4:導(dǎo)出多個變量
module.exports.sum = (a,b) => {
    return a + b
}
module.exports.minus = (a,b) => {
    return a - b
}

//語法5:導(dǎo)出多個變量
module.exports = {
    sum : (a,b) => {
        return a + b
    },
    minus : (a,b) => {
        return a - b
    }
}
//語法6:導(dǎo)出多個變量
const obj = {
    sum : (a,b) => {
        return a + b
    },
    minus : (a,b) => {
        return a - b
    }
}
module.exports = obj

APP1.js

const math = module.require('./lib1')
// const {sum,minus} = math
console.log(math.sum(3,3));
console.log(math.minus(3,3));

// console.log(sumFn(3,3))

http 內(nèi)置模塊

http.createServer()

定義:用于創(chuàng)建node服務(wù)器

  • 創(chuàng)建服務(wù)端和客戶端通信的方式
  • res對象:使用響應(yīng)對象設(shè)置響應(yīng)頭
    • 響應(yīng)頭:用于通知瀏覽器:
      • 狀態(tài)碼
      • 數(shù)據(jù)類型是什么
      • 數(shù)據(jù)
      • 其他參數(shù)
  • req對象:使用請求對象解析請求頭
    • 請求頭:包含了請求的具體信息
    • 請求方法:get post put delete
    • 請求數(shù)據(jù)
    • 請求的地址
    • 瀏覽器信息
    • 等其他信息

語法

http.createServer((req,res)=>{
    //1.解析請求
    
    //2.處理響應(yīng)
})

返回值

示例

res.weiteHead()

定義:用于設(shè)置響應(yīng)頭信息

語法

返回值

示例

res.end()

定義:用于通知客戶端響應(yīng)結(jié)束灵巧。結(jié)束的時候可以攜帶一些數(shù)據(jù)

語法

返回值

示例

server.listen()

定義:用于設(shè)置服務(wù)器的監(jiān)聽端口

語法

返回值

示例

Node監(jiān)聽

定義:Node監(jiān)聽就是在不重啟服務(wù)器的情況下,自動刷新頁面

語法:

node --watch 文件地址

示例:

node --watch './app/index.js'

Content-Type

定義:Content-Type用于指定響應(yīng)頭的數(shù)據(jù)類型

語法:

{"Content-Type":屬性值}

屬性值:

  • text/plain:普通文本
  • text/html:HTML文本
  • application/json:JSON文本

全局變量

__dirname

定義:表示當(dāng)前文件(模塊)所在的目錄名稱

  • Dir:文件夾抹沪、目錄
  • name:名字

語法:

console.log(__dirname)//全局直接調(diào)用

示例:

console.log(__dirname);
//D:\web前端\2023第二期\三月\0329

絕對路徑 VS 相對路徑

# 絕對路徑
\Users\zj\Desktop\7\0329
\zj\Desktop\7\0329
\Desktop\7\0329
# 相對路徑有三種
images/aaa.jpg
./images/aaa.jpg
../images/aaa.jpg

__filename

定義:表示當(dāng)前文件(模塊)的名稱

  • file:文件
  • name:名字

示例:

console.log(__filename);
//D:\web前端\2023第二期\三月\0329\1.giobai.js

內(nèi)置模塊path

定義:node:path是一個內(nèi)置模塊孩等,它提供了處理路徑的API。路徑分為:

  • 文件路徑
  • 文件夾路徑

使用path模塊采够,第一步要做什么?

path.basename()

定義:

語法:

path.basename('路徑','刪除的后綴名')

返回值:返回路徑最后一部分

示例:

const path = require('node:path')
console.log(__filename);
console.log(path.basename(__filename));
console.log(path.basename(__filename,'.js'));
console.log(path.basename(__dirname));

輸出結(jié)果:

D:\web前端\2023第二期\三月\0329\2-path.js
2-path.js
2-path
0]\]]

path.dirname(path)

定義:用于返回當(dāng)前目錄的路徑

語法:

path.dirname('path')

返回值:

示例:

const path = require('node:path')
console.log(__dirname)
console.log(path.dirname(__dirname));

輸出結(jié)果

D:\web前端\2023第二期\三月\0329
D:\web前端\2023第二期\三月

path.extname(path)

定義:返回的是當(dāng)前文件的擴(kuò)展名

語法:


返回值:

path.parse()

定義:從路徑字符串返回一個對象

語法:

path.parse('路徑')

返回值:返回一個表示路徑的對象

示例:

const path = require('node:path')
console.log(__filename)
console.log(path.parse(__filename));

輸出結(jié)果:

D:\web前端\2023第二期\三月\0329\2-path.js
{
  root: 'D:\\',
  dir: 'D:\\web前端\\2023第二期\\三月\\0329',
  base: '2-path.js',
  ext: '.js',
  name: '2-path'
}

path.format()

定義:從路徑對象轉(zhuǎn)路徑字符串

語法

path.format(路徑對象)

返回值:返回路徑字符串

示例

const path = require('node:path')
console.log(__filename)
console.log(path.parse(__filename));
const obj = path.parse(__filename)
console.log(path.format(obj));

輸出結(jié)果

D:\web前端\2023第二期\三月\0329\2-path.js
{
  root: 'D:\\',
  dir: 'D:\\web前端\\2023第二期\\三月\\0329',
  base: '2-path.js',
  ext: '.js',
  name: '2-path'
}
D:\web前端\2023第二期\三月\0329\2-path.js

path.join()

定義:用于把路徑片段連接為規(guī)范路徑

語法:

path.join()
path.join('路徑片段1','路徑片段2',...)

返回值:

示例

const path = require('node:path')
const p1 = path.join('fold1', 'folder2', 'index.html')
console.log(p1);
const p2 = path.join('/fold1', 'folder2', 'index.html')
console.log(p2);
const p3 = path.join('/fold1', '/folder2', 'index.html')
console.log(p3);
const p4 = path.join('/fold1', '//folder2', 'index.html')
console.log(p4);
const p5 = path.join('/fold1', '//folder2', './index.html')
console.log(p5);
const p6 = path.join('/fold1', '//folder2', '../index.html')
console.log(p6);

輸出結(jié)果

fold1\folder2\index.html
\fold1\folder2\index.html
\fold1\folder2\index.html
\fold1\folder2\index.html
\fold1\folder2\index.html
\fold1\index.html

path.isAbsolute()

定義:用于檢測一個路徑是否是絕對路徑

語法

path.isAbsolute(path)

返回值:返回布爾值;true或false

示例

console.log(path.isAbsolute(__filename));
//true

path.resolve()

定義:用于解析絕對路徑

語法:

path.resolve([...paths])//路徑片段

返回值:返回絕對路徑字符串

示例:

const p1 = path.resolve('fold1', 'folder2', 'index.html')
console.log(p1);
const p2 = path.resolve('/fold1', 'folder2', 'index.html')
console.log(p2);
const p3 = path.resolve('/fold1', '/folder2', 'index.html')
console.log(p3);
const p4 = path.resolve('/fold1', '//folder2', 'index.html')
console.log(p4);
const p5 = path.resolve('/fold1', '//folder2', './index.html')
console.log(p5);
const p6 = path.resolve('/fold1', '//folder2', '../index.html')
console.log(p6);

輸出結(jié)果

D:\web前端\2023第二期\三月\0329\fold1\folder2\index.html
D:\fold1\folder2\index.html
D:\folder2\index.html
D:\folder2\index.html
D:\folder2\index.html
D:\index.html

FS模塊(FS系統(tǒng))

定義:FS文件系統(tǒng)模塊允許操作計算機(jī)系統(tǒng)上的文件冰垄。

具體操作如下:
  • 讀取
  • 創(chuàng)建
  • 修改
  • 刪除

引入FS文件系統(tǒng)

要使用fs文件系統(tǒng)蹬癌,請先引入fs模塊

語法:基于Promise API(標(biāo)準(zhǔn))

語法:基于回調(diào)函數(shù)(默認(rèn))

const fs = require('node:fs')

fs.readFile()

定義:用于異步讀取文件內(nèi)容

語法:

fs.readFile('文件路徑','callback')
fs.readFile('文件路徑','err,data') => {
    if(err) console.log(err)
    console.log(data)
}

返回值:返回讀取成功的內(nèi)容

數(shù)據(jù)類型:buffer

示例:

fs.writeFile

定義:用于異步的寫入文件數(shù)據(jù)

語法:

fs.writeFile(file, data[, options], callback)

返回值:

示例:

npm

定義:Node軟件包管理工具

  • npm的主要內(nèi)容
    • 安裝軟件包
    • 刪除軟件包
    • 分享你自己寫的軟件包(npmjs.com)
  • npm是世界上最大軟件包平臺
  • npm的構(gòu)成:
    • 官網(wǎng)(http://npmjs.com):查詢軟件包
    • CLI(Command Line Interface):命令行交互工具
    • 軟件注冊表:JS軟件包的倉庫

node_modules

  • 用于存儲第三方模塊的文件

package是什么

  • 意思:軟件包
  • 一個package由一個或多個模塊組成

package.json

  • 用于描述你的模塊文件
  • 用于配置你的模塊文件
  • package.json描述如何使用軟件包
  • 一個package(軟件包)必須包含一個package.json文件。

創(chuàng)建方法:

  • 手動創(chuàng)建
  • 半自動:npm init命令創(chuàng)建
  • 自動:npm init - yes命令創(chuàng)建

node_modules

  • 用于存儲第三方模塊的文件
  • 打包項目發(fā)給別人之前虹茶,可刪除node_modules文件夾逝薪,以減少文件體積
  • 注意:package.json 和 package-lock.json不能刪
  • 可使用npm install重新安裝模塊

module

  • 模塊就是一個js文件或文件夾
  • 所有的模塊必須擁有package.json文件

第三方模塊的使用方法

第一步:創(chuàng)建文件夾

mkdir buhaoqi-package  

第二步:創(chuàng)建index.js

cd buhaoqi-package
New-item index.js

第三步:安裝upper-case模塊

npm install upper-case

第四步:修改index.js內(nèi)容

const upperCase = require('upper-case').upperCase
function hello(name){
    console.log(upperCase(`hello ${name},good good study!`));
}
hello('zhangsan')
module.exports = hello

第五步:運行index.js

node index

輸出結(jié)果

HELLO ZHANGSAN,GOOD GOOD STUDY蝴罪!

版本號

npm采用的是Sementic Version Controls系統(tǒng)

語法

X.Y.Z

1.1.3
初始版本號一般默認(rèn):0.1.0
正式發(fā)布:1.0.0

X : Major Version 主版本號:較大變化

Y: Minor Version 副版本號:增加了一個函數(shù)

Z: patch Version Bug版本號:修復(fù)bug



待續(xù)……


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末董济,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子要门,更是在濱河造成了極大的恐慌虏肾,老刑警劉巖廓啊,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異封豪,居然都是意外死亡谴轮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門吹埠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來第步,“玉大人,你說我怎么就攤上這事缘琅≌扯迹” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵刷袍,是天一觀的道長翩隧。 經(jīng)常有香客問我,道長做个,這世上最難降的妖魔是什么鸽心? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮居暖,結(jié)果婚禮上顽频,老公的妹妹穿的比我還像新娘。我一直安慰自己太闺,他們只是感情好糯景,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著省骂,像睡著了一般蟀淮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钞澳,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天怠惶,我揣著相機(jī)與錄音,去河邊找鬼轧粟。 笑死策治,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的兰吟。 我是一名探鬼主播通惫,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼混蔼!你這毒婦竟也來了履腋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎遵湖,沒想到半個月后悔政,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡奄侠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年卓箫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垄潮。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡烹卒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弯洗,到底是詐尸還是另有隱情旅急,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布牡整,位于F島的核電站藐吮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏逃贝。R本人自食惡果不足惜谣辞,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沐扳。 院中可真熱鬧泥从,春花似錦、人聲如沸沪摄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杨拐。三九已至祈餐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哄陶,已是汗流浹背帆阳。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留屋吨,地道東北人舱痘。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像离赫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子塌碌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容