前端Node.js 基礎(chǔ)

一 .Node.js 基礎(chǔ)

目錄

Node開發(fā)概述
Node運(yùn)行環(huán)境搭建
Node.js快速入門

1. Node開發(fā)概述

1.1 為什么要學(xué)習(xí)服務(wù)器端開發(fā)基礎(chǔ)

能夠和后端程序員更加緊密的配合
網(wǎng)站業(yè)務(wù)邏輯前置,學(xué)習(xí)前端技術(shù)需要后端技術(shù)支撐(Ajax)
擴(kuò)寬知識視野失都,能夠站在更高的角度審視整個項(xiàng)目

1.2 服務(wù)器端開發(fā)要做的事情

實(shí)現(xiàn)網(wǎng)站的業(yè)務(wù)邏輯
數(shù)據(jù)的增刪改查

1.3 為什么選擇Node

使用JavaScript語法開發(fā)后端應(yīng)用
一些公司要求前端工程師掌握Node開發(fā)
生態(tài)系統(tǒng)活躍蚀同,有大量開源庫可以使用
前端開發(fā)工具大多基于Node開發(fā)

1.4 Node是什么

Node是一個基于Chrome V8引擎的JavaScript代碼運(yùn)行環(huán)境初茶。

運(yùn)行環(huán)境


1.png

瀏覽器(軟件)能夠運(yùn)行JavaScript代碼,瀏覽器就是JavaScript代碼的運(yùn)行環(huán)境
Node(軟件)能夠運(yùn)行JavaScript代碼翅娶,Node就是JavaScript代碼的運(yùn)行環(huán)境

2. Node運(yùn)行環(huán)境搭建

2.1 Node.js運(yùn)行環(huán)境安裝

官網(wǎng):https://nodejs.org/en/

Current 擁有最新特性 實(shí)驗(yàn)版LTS = Long Term

Support 長期支持版 穩(wěn)定版

2.2 Node環(huán)境安裝失敗解決辦法

1. 錯誤代號2502叉趣、2503

失敗原因:系統(tǒng)帳戶權(quán)限不足。

解決辦法:
以管理員身份運(yùn)行powershell命令行工具
輸入運(yùn)行安裝包命令 msiexec /package node安裝包位置

2. 執(zhí)行命令報(bào)錯

失敗原因:Node安裝目錄寫入環(huán)境變量失敗
解決辦法:將Node安裝目錄添加到環(huán)境變量中

2.3 PATH環(huán)境變量

存儲系統(tǒng)中的目錄吞加,在命令行中執(zhí)行命令的時(shí)候系統(tǒng)會自動去這些目錄中查找命令的位置。

3. Node.js快速入門

3.1 Node.js 的組成

JavaScript 由三部分組成,ECMAScript衔憨,DOM叶圃,BOM。

Node.js是由ECMAScript及Node 環(huán)境提供的一些附加API組成的巫财,包括文件盗似、網(wǎng)絡(luò)哩陕、路徑等等一些更加強(qiáng)大的 API平项。

2.png

3.2 Node.js基礎(chǔ)語法

所有ECMAScript語法在Node環(huán)境中都可以使用。
在Node環(huán)境下執(zhí)行代碼悍及,使用Node命令執(zhí)行后綴為.js的文件即可

3.3 Node.js全局對象global

在瀏覽器中全局對象是window闽瓢,在Node中全局對象是global。
Node中全局對象下有以下方法心赶,可以在任何地方使用扣讼,global可以省略。
console.log() 在控制臺中輸出
setTimeout() 設(shè)置超時(shí)定時(shí)器
clearTimeout() 清除超時(shí)時(shí)定時(shí)器
setInterval() 設(shè)置間歇定時(shí)器
clearInterval() 清除間歇定時(shí)器




二.模塊加載及第三方包

目錄

Node.js模塊化開發(fā)
系統(tǒng)模塊
第三方模塊
package.json文件
Node.js中模塊的加載機(jī)制

1. Node.js模塊化開發(fā)

1.1 JavaScript開發(fā)弊端

JavaScript在使用時(shí)存在兩大問題缨叫,文件依賴命名沖突椭符。

3.png

1.2 生活中的模塊化開發(fā)

4.png

1.3 軟件中的模塊化開發(fā)

一個功能就是一個模塊,多個模塊可以組成完整應(yīng)用耻姥,抽離一個模塊不會影響其他功能的運(yùn)行销钝。

5.png

1.4 Node.js中模塊化開發(fā)規(guī)范

Node.js規(guī)定一個JavaScript文件就是一個模塊,模塊內(nèi)部定義的變量和函數(shù)默認(rèn)情況下在外部無法得到
模塊內(nèi)部可以使用exports對象進(jìn)行成員導(dǎo)出琐簇, 使用require方法導(dǎo)入其他模塊蒸健。

6.png

1.5 模塊成員導(dǎo)出exports

// a.js
// 在模塊內(nèi)部定義變量
let version = 1.0;
// 在模塊內(nèi)部定義方法
const sayHi = name => `您好, ${name}`;
// 向模塊外部導(dǎo)出數(shù)據(jù) 
exports.version = version;
exports.sayHi = sayHi;

1.6 模塊成員的導(dǎo)入require

// b.js
// 在b.js模塊中導(dǎo)入模塊a
let a = require('./b.js');
// 輸出b模塊中的version變量
console.log(a.version);
// 調(diào)用b模塊中的sayHi方法 并輸出其返回值
console.log(a.sayHi('黑馬講師')); 

導(dǎo)入模塊時(shí)后綴可以省略

1.7 模塊成員導(dǎo)出的另一種方式module.exports

module.exports.version = version;
module.exports.sayHi = sayHi;

exportsmodule.exports的別名(地址引用關(guān)系),導(dǎo)出對象最終以module.exports為準(zhǔn)

1.8 模塊導(dǎo)出兩種方式的聯(lián)系與區(qū)別

7.png

exports是module.exports的別名 他們指向同一塊兒內(nèi)存空間 都是往同一塊兒空間添加屬性值
他們默認(rèn)指向的是同一塊兒內(nèi)存空間

當(dāng)exports對象和moudle.exports對象指向的不是同一個對象時(shí) 以module.exports為準(zhǔn)

// 當(dāng)exports對象和moudle.exports對象指向的不是同一個對象時(shí) 以module.exports為準(zhǔn)
module.exports = {
    name: 'zhangsan'
}

exports = {
    age: 20
}

2. 系統(tǒng)模塊

2.1 什么是系統(tǒng)模塊

Node運(yùn)行環(huán)境提供的API.
因?yàn)檫@些API都是以模塊化的方式進(jìn)行開發(fā)的, 所以我們又稱Node運(yùn)行環(huán)境提供的API為系統(tǒng)模塊

8.png

2.2 系統(tǒng)模塊fs 文件操作

f:file 文件 婉商,s:system 系統(tǒng)似忧,文件操作系統(tǒng)。

讀取文件內(nèi)容

應(yīng)用場景:客戶端請求 服務(wù)端需要先從本地磁盤中讀取文件丈秩,再放回
參數(shù)中帶有中括號:參數(shù)為可選參數(shù)
callback:回調(diào)函數(shù)
回調(diào)函數(shù)作用盯捌?讀取文件內(nèi)容需要時(shí)間,不能通過api返回值直接拿到讀取結(jié)果蘑秽,所以需要定義回調(diào)函數(shù)挽唉,硬盤會在在文件操作結(jié)束通過回調(diào)函數(shù)以參數(shù)的形式通知系統(tǒng)

fs.reaFile('文件路徑/文件名稱'[,'文件編碼'], callback);

// 1.通過模塊的名字fs對模塊進(jìn)行引用
const fs = require('fs');

// 2.通過模塊內(nèi)部的readFile讀取文件內(nèi)容
fs.readFile('./01.helloworld.js', 'utf8', (err, doc) => {
    // 如果文件讀取出錯err 是一個對象 包含錯誤信息
    // 如果文件讀取正確 err是 null
    // doc 是文件讀取的結(jié)果
    if (err) {
     console.log(err);
     return;
    }
    console.log(doc);
});
寫入文件內(nèi)容
fs.writeFile('文件路徑/文件名稱', '數(shù)據(jù)', callback);

const content = '<h3>正在使用fs.writeFile寫入文件內(nèi)容</h3>';
 fs.writeFile('../index.html', content, err => {
   if (err != null) { 
       console.log(err);
       return;
   }
   console.log('文件寫入成功');
 });

2.3 系統(tǒng)模塊path 路徑操作

為什么要進(jìn)行路徑拼接

不同操作系統(tǒng)的路徑分隔符不統(tǒng)一
/public/uploads/avatar
Windows 上是 \ /
Linux 上是 /

2.4 路徑拼接語法

path.join('路徑', '路徑', ...)
const fs = require('fs');
const path = require('path');

console.log(__dirname);
console.log(path.join(__dirname, '01.helloworld.js'))

/*
數(shù)據(jù)結(jié)果如下
/Users/dufangyi/Desktop/11-16 前后端交互/11-13node+express/day01/code

/Users/dufangyi/Desktop/11-16 前后端交互/11-13node+express/day01/code/01.helloworld.js
*/

fs.readFile(path.join(__dirname, '01.helloworld.js'), 'utf8', (err, doc) => {
    console.log(err)
    console.log(doc)
});

2.5 相對路徑VS絕對路徑

大多數(shù)情況下使用絕對路徑,因?yàn)橄鄬β窂接袝r(shí)候相對的是命令行工具的當(dāng)前工作目錄
在讀取文件或者設(shè)置文件路徑時(shí)都會選擇絕對路徑
使用__dirname獲取當(dāng)前文件所在的絕對路徑

3.第三方模塊

3.1 什么是第三方模塊

別人寫好的筷狼、具有特定功能的瓶籽、我們能直接使用的模塊即第三方模塊,由于第三方模塊通常都是由多個文件組成并且被放置在一個文件夾中埂材,所以又名包塑顺。

第三方模塊有兩種存在形式:
以js文件的形式存在,提供實(shí)現(xiàn)項(xiàng)目具體功能的API接口。
以命令行工具形式存在严拒,輔助項(xiàng)目開發(fā)

3.2 獲取第三方模塊

npmjs.com:第三方模塊的存儲和分發(fā)倉庫


9.png
  • 如何安裝node第三方模塊扬绪?
    npm (node package manager) : node的第三方模塊管理工具
    下載:npm install 模塊名稱
    卸載:npm unintall package 模塊名稱

  • 全局安裝與本地安裝
    命令行工具:全局安裝
    庫文件:本地安裝

3.3 第三方模塊 nodemon

nodemon是一個命令行工具,用以輔助項(xiàng)目開發(fā)裤唠。
在Node.js中挤牛,每次修改文件都要在命令行工具中重新執(zhí)行該文件,非常繁瑣

使用步驟
使用npm install nodemon –g 下載它
在命令行工具中用nodemon命令替代node命令執(zhí)行文件

3.4 第三方模塊 nrm

nrm ( npm registry manager ):npm下載地址切換工具
npm默認(rèn)的下載地址在國外种蘸,國內(nèi)下載速度慢
使用步驟
使用npm install nrm –g 下載它
查詢可用下載地址列表 nrm ls
切換npm下載地址 nrm use 下載地址名稱

3.5 第三方模塊 Gulp

基于node平臺開發(fā)的前端構(gòu)建工具
將機(jī)械化操作編寫成任務(wù), 想要執(zhí)行機(jī)械化操作時(shí)執(zhí)行一個命令行命令任務(wù)就能自動執(zhí)行了
用機(jī)器代替手工墓赴,提高開發(fā)效率。

3.6 Gulp能做什么

項(xiàng)目上線航瞭,HTML诫硕、CSS、JS文件壓縮合并
語法轉(zhuǎn)換(es6刊侯、less ...)
公共文件抽離(比如網(wǎng)站的頭部抽取)
修改文件瀏覽器自動刷新

3.7 Gulp使用

1章办、使用npm install gulp下載gulp庫文件
2、在項(xiàng)目根目錄下建立gulpfile.js文件
3滨彻、重構(gòu)項(xiàng)目的文件夾結(jié)構(gòu) src目錄放置源代碼文件 dist目錄放置構(gòu)建后文件
4藕届、在gulpfile.js文件中編寫任務(wù).
5、在命令行工具中執(zhí)行g(shù)ulp任務(wù)

3.8 Gulp中提供的方法

gulp.src():獲取任務(wù)要處理的文件
gulp.dest():輸出文件
gulp.task():建立gulp任務(wù)
gulp.watch():監(jiān)控文件的變化

1.編寫gulpfile.js

const gulp = require('gulp');
  // 使用gulp.task()方法建立任務(wù)
 gulp.task('first', () => {
    // 獲取要處理的文件
    gulp.src('./src/css/base.css') 
    // 將處理后的文件輸出到dist目錄
    .pipe(gulp.dest('./dist/css'));
 });

2.終端全局安裝gulp命令
npm install gulp-cli -g --registry=https://registry.npm.taobao.org

3.運(yùn)行g(shù)ulp任務(wù)
gulp first

3.9 Gulp插件

gulp是輕內(nèi)核的第三方模塊 提供方法很少亭饵,提供的內(nèi)容都是通過插件方式完成

gulp-htmlmin :html文件壓縮
gulp-csso :壓縮css
gulp-babel :JavaScript語法轉(zhuǎn)化
gulp-less: less語法轉(zhuǎn)化
gulp-uglify :壓縮混淆JavaScript
gulp-file-include 公共文件包含
browsersync 瀏覽器實(shí)時(shí)同步

插件使用下載
npm 下載
引入
使用

4. package.json文件

4.1 node_modules文件夾的問題

1.文件夾以及文件過多過碎休偶,當(dāng)我們將項(xiàng)目整體拷貝給別人的時(shí)候,,傳輸速度會很慢很慢.
2.復(fù)雜的模塊依賴關(guān)系需要被記錄冬骚,確保模塊的版本和當(dāng)前保持一致椅贱,否則會導(dǎo)致當(dāng)前項(xiàng)目運(yùn)行報(bào)錯

拷貝給別人項(xiàng)目時(shí)候 node_modules文件夾不用拷貝 node項(xiàng)目會根據(jù)項(xiàng)目描述文件下載package.json中依賴的模塊

4.2 package.json文件的作用

項(xiàng)目描述文件,記錄了當(dāng)前項(xiàng)目信息只冻,例如項(xiàng)目名稱庇麦、版本、作者喜德、github地址山橄、當(dāng)前項(xiàng)目依賴了哪些第三方模塊等。
使用npm init -y命令生成舍悯。

4.3 項(xiàng)目依賴

在項(xiàng)目的開發(fā)階段和線上運(yùn)營階段航棱,都需要依賴的第三方包,稱為項(xiàng)目依賴
使用npm install 包名命令下載的文件會默認(rèn)被添加到 package.json 文件的 dependencies 字段中

{
    "dependencies": {
        "jquery": "^3.3.1“
    }
 } 

4.4 開發(fā)依賴

在項(xiàng)目的開發(fā)階段需要依賴萌衬,線上運(yùn)營階段不需要依賴的第三方包饮醇,稱為開發(fā)依賴
使用npm install 包名 --save-dev命令將包添加到package.json文件的devDependencies字段中

{
    "devDependencies": {
        "gulp": "^3.9.1“
    }
 } 


4.5 package-lock.json文件的作用

鎖定包的版本,確保再次下載時(shí)不會因?yàn)榘姹静煌a(chǎn)生問題
加快下載速度秕豫,因?yàn)樵撐募幸呀?jīng)記錄了項(xiàng)目所依賴第三方包的樹狀結(jié)構(gòu)和包的下載地址朴艰,重新安裝時(shí)只需下載即可观蓄,不需要做額外的工作

5. Node.js中模塊加載機(jī)制

5.1 模塊查找規(guī)則-當(dāng)模塊擁有路徑但沒有后綴時(shí)

require('./find.js');
require('./find');

1.require方法根據(jù)模塊路徑查找模塊,如果是完整路徑祠墅,直接引入模塊侮穿。
2.如果模塊后綴省略,先找同名JS文件再找同名JS文件夾
3.如果找到了同名文件夾毁嗦,找文件夾中的index.js
4.如果文件夾中沒有index.js就會去當(dāng)前文件夾中的package.json文件中查找main選項(xiàng)中的入口文件
5.如果找指定的入口文件不存在或者沒有指定入口文件就會報(bào)錯亲茅,模塊沒有被找到

5.2 模塊查找規(guī)則-當(dāng)模塊沒有路徑且沒有后綴時(shí)

require('find');

1.Node.js會假設(shè)它是系統(tǒng)模塊
2.Node.js會去node_modules文件夾中
3.首先看是否有該名字的JS文件
4.再看是否有該名字的文件夾
5.如果是文件夾看里面是否有index.js
6.如果沒有index.js查看該文件夾中的package.json中的main選項(xiàng)確定模塊入口文件
7.否則找不到報(bào)錯

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市狗准,隨后出現(xiàn)的幾起案子克锣,更是在濱河造成了極大的恐慌,老刑警劉巖驶俊,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娶耍,死亡現(xiàn)場離奇詭異免姿,居然都是意外死亡饼酿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門胚膊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來故俐,“玉大人,你說我怎么就攤上這事紊婉∫┌妫” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵喻犁,是天一觀的道長槽片。 經(jīng)常有香客問我,道長肢础,這世上最難降的妖魔是什么还栓? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮传轰,結(jié)果婚禮上剩盒,老公的妹妹穿的比我還像新娘。我一直安慰自己慨蛙,他們只是感情好辽聊,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著期贫,像睡著了一般跟匆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上通砍,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天玛臂,我揣著相機(jī)與錄音,去河邊找鬼。 笑死垢揩,一個胖子當(dāng)著我的面吹牛玖绿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叁巨,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼斑匪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锋勺?” 一聲冷哼從身側(cè)響起蚀瘸,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎庶橱,沒想到半個月后贮勃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡苏章,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年寂嘉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纱昧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片现使。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖萧芙,靈堂內(nèi)的尸體忽然破棺而出并淋,到底是詐尸還是另有隱情寓搬,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布县耽,位于F島的核電站句喷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏兔毙。R本人自食惡果不足惜唾琼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瞒御。 院中可真熱鬧父叙,春花似錦、人聲如沸肴裙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜻懦。三九已至甜癞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宛乃,已是汗流浹背悠咱。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工蒸辆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人析既。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓躬贡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親眼坏。 傳聞我的和親對象是個殘疾皇子拂玻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

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

  • ??前端技術(shù)的發(fā)展主要還是Javascript推動,當(dāng)HTML+CSS+Javascript的發(fā)展到j(luò)Query的...
    楊強(qiáng)AT南京閱讀 252評論 0 1
  • 1.課程介紹與開發(fā)環(huán)境搭建 主要包括nodejs 基礎(chǔ)知識web 服務(wù)器異步 同步 阻塞 非阻塞 課程基礎(chǔ)java...
    shadow123閱讀 651評論 0 0
  • 1. node.js模塊概述 為了讓node.js的文件可以相互調(diào)用宰译,node.js提供了一個簡單的模塊系統(tǒng)檐蚜。模塊...
    flionel閱讀 502評論 4 4
  • 個人博客搭建完成,歡迎大家來訪問哦黎默丶lymoo的博客 什么是node.js JavaScript是一個腳本語言...
    黎默丶lymoo閱讀 414評論 0 4
  • 在現(xiàn)在的前端開發(fā)中沿侈,前后端分離闯第、模塊化開發(fā)、版本控制缀拭、文件合并與壓縮咳短、mock數(shù)據(jù)等等一些原本后端的思想開始...
    Charlot閱讀 5,433評論 1 32