前端工程化(一) Node.js基礎

什么是前端工程化祈噪?前端工程化又有什么用呢粥鞋?前端工程化就是在構建一個前端項目的時候掂为,通過一些技術跟工具裕膀,來提升前端開發(fā)效率的過程。

Node.js 基礎

簡介

什么是node.js菩掏?

  • node.js是除了瀏覽器之外魂角,JavaScript的另一個運行環(huán)境。
  • 就像JavaScript可以在瀏覽器端運行一樣智绸,JavaScript也可以才node.js上運行野揪。區(qū)別在于:Node.js是根植于操作系統(tǒng)上的,提供的一些操作系統(tǒng)交互的APIs瞧栗,例如:文件操作斯稳,web服務發(fā)布等。

node.js的作用

  • 瀏覽器端的JS負責與瀏覽器端的功能交互迹恐,Node.js負責與服務器端的功能交互
  • node.js適合用于開發(fā)前端方向的各種工具

node.js運行方式

  • 腳本模式

在控制臺運行 node 代碼路徑/文件名.js
例如:node ./nodejs/heloworld.js

  • 交互模式(適合調(diào)試代碼挣惰,相當于瀏覽器上的控制臺)

在命令行中,node回車進入交互模式
運行代碼殴边,console.log(‘helloworld’); 回車輸入helloworld
退出交互模式憎茂,兩次ctrl+c或者輸入.exit

使用

全局變量

在瀏覽器的JS中,全局對象是window锤岸;在Node.js下竖幔,全局對象是global

  • 在交互模式下,聲明的變量和創(chuàng)建的函數(shù)都屬于global下的
    例:var a = 1; global.a //有值
  • 在腳本模式下是偷,聲明的變量和創(chuàng)建的函數(shù)都不屬于global下的
    例:var a = 1; console.log(global.a) //返回undefined

注意:DOM和BOM中的對象拳氢,在Node.js環(huán)境下不可使用募逞,Node.js和瀏覽器端的API不相通

全局函數(shù)

JavaScript提供的全局函數(shù)在Node.js環(huán)境下都可用。

  • JavaScipt語言 提供的APIs
    • parseInt/parseFloat/isNaN/evel...
    • 一次性定時器 :var timer = setTimeout(回調(diào)函數(shù)馋评,定時時間)放接,clearTimeout(timer)
    • 周期性定時器: var timer = setInterval(回調(diào)函數(shù),定時時間)留特,clearInterval(timer)
  • Node.js 環(huán)境提供的APIs
    • 立即執(zhí)行定時器(在事件隊列的開頭執(zhí)行)
      var timer = setImmediate(回調(diào)函數(shù))
      clearImmediate(timer)
    • 進程立即執(zhí)行定時器(在主進程的后邊執(zhí)行)
      process.nextTick(回調(diào)函數(shù))

同步與異步

JS 是單線程模型纠脾,代碼運行時,限制執(zhí)行主程序中的任務磕秤,主程序執(zhí)行完后再執(zhí)行事件隊列乳乌。
process.nextTick 是在主程序結束之后執(zhí)行,setImmediate 則是在事件隊列的頭部執(zhí)行

運行順序.PNG

模塊

模塊(包)是Node.js中具有特定功能的對象市咆,可以分成三類

  • 內(nèi)置模塊(核心模塊):
    • 對應web端JS的宿主對象汉操,例如:window,location蒙兰,history等
    • 隨著node.js一起安裝
    • 官方文檔 :http://nodejs.cn/api/
  • 自定義模塊:自己編寫的具有一定功能的模塊
    • 文件模塊:單獨JS文件組成的模塊
    • 目錄模塊:多個JS文件組成在一個目錄下的模塊
  • 第三方模塊
    • 對應web端的JS第三方庫磷瘤,例如jQuery,Bootstrap等
    • 使用必須先安裝
    • 在Node.js中搜变,大量的第三方模塊用 npm 來管理

內(nèi)置模塊

  1. console模塊提供了一個簡單的控制調(diào)試臺采缚,類似web瀏覽器提供的JavaScript控制臺。
//以表格方式展示數(shù)據(jù)
var obj = { name: 'judy', age:'10' }
console.table(obj)
// 計時
console.time('for')
 for(var i = 0;i <= 100000; i++) {
 }
console.timeEnd('for');
  1. process對象是全局變量挠他,提供有關當前Node.js進程信息并對其進行控制扳抽。不需要使用require()
//  獲取操作系統(tǒng)架構  x64
console.log(process.arch)
// 當前系統(tǒng)平臺信息 win32
console.log(process.platform)
// 獲取當前文件所在目錄
console.log(process.cwd())
// 環(huán)境變量
console.log(process.env)
// 自定義變量
process.env.NODE_ENV = "develop"
console.log(process.env.NODE_ENV)
// 獲取當前進程的編號
console.log(process.pid)
// 殺死進程 
process.kill(進程編號)

3.path模塊負責文件路徑

  • ./ 表示當前路徑
  • ../ 表示上一級目錄
  • __dirname 返回當前文件所在的目錄
  • __filename 返回當前文件的完整路徑(目錄+文件)
// 需要引入模塊
const path = require('path')
// join 用于拼接多個路徑部分
const temp = path.join(__dirname, "..")
// 獲取路徑中的文件名
console.log(path.basename(temp));
// 獲取一個路徑中的目錄部分
console.log(path.dirname(temp));
// 獲取一個路徑中最后的擴展名
console.log(path.extname(temp));
  1. fs模塊主要負責文件基本操作
  • 文件操作
// 引入
const fs = require("fs")
// 寫文件:清空寫入
fs.writeFile('文件路徑',' 寫入內(nèi)容', 回調(diào)函數(shù))
// 讀文件
fs.readFile('文件路徑', 回調(diào)函數(shù))
//刪除文件
fs.unlink('文件路徑, 回調(diào)函數(shù))
// 追加寫入
fs.appendFile('文件路徑', '寫入內(nèi)容', 回調(diào)函數(shù))
  • 目錄操作
// 創(chuàng)建目錄
fs.mkdir("./d", (err) => {
  if(err) throw err;
}
// 刪除目錄
fs.rmdir("./d", (err) => {
  if(err) throw err;
}
// 重命名目錄
fs.rename(__dirname+'/d1', __dirname+'/d2', (err) => {
  if(err) throw err;
}
// 讀取目錄
fs.readdir(__dirname, (err,data) => {
  if(err) throw err;
  // data是數(shù)組
  data.map((d) => {
    console.log(d)
  })
}
  • fs.stat 查看狀態(tài)
  // 查看文件狀態(tài)
  fs.stat(__dirname+"./a.txt", (err, stat) => {
    if (err) throw err;
    if (stat.isDirectory()) {
      // 判斷當前文件是否是目錄    
    } else if (stat.isFile()) {
      // 判斷當前文件是否是普通文件
    }
  })
  1. http模塊殖侵,我們使用Apache 或 Nginx 來搭建服務端贸呢。在Node.js中也有搭建服務器的模塊,就是http模塊拢军。
 // 引入 
const http = require("http")
// 創(chuàng)建服務器
const server = http.createServer((req, res) => {
  res.statusCode = 200
  res.setHeader('Content-Type', 'text.plain;charset=utf-8')
  res.end("hello,node.js")
})
// 發(fā)布web服務
const port = 3000
const host = 'localhost'
server.listen(port, host, () => {
  console.log(`服務器運行在 http://${host}:${port}`)
})

自定義模塊

在自定義模塊中楞陷,只有導出(exports)的屬性或方法才能被外部使用,沒有導出的屬性或方法是模塊的私有方法茉唉,只能在模塊內(nèi)部使用固蛾。

// circle.js 聲明的模塊
const PI = 3.14
const perimeter = (r) => {
  return 2 * PI * r
}
// 模塊內(nèi)容導出后,才能被外部調(diào)用
module.exports = {
  perimeter
}

module 變量代表當前模塊度陆,是一個對象艾凯,exports屬性是對外的接口。加載某個模塊懂傀,其實是加載該模塊的module.exports屬性

模塊的使用:

// 引入模塊時趾诗,需要寫入引入路徑,require('circle')會報錯
const circle = require("./circle")
// 調(diào)用模塊中的屬性或方法
const r = 10;
console.log(circle.perimeter(r));

注意鸿竖,引入自定義模塊沧竟,需要帶有引入路徑,否則報錯

模塊加載邏輯
模塊加載邏輯.PNG
  • package.json 是目錄模塊的描述文件

第三方模塊

node.js的第三方模塊是由社區(qū)維護的缚忧,需要單獨安裝悟泵,安裝需要借助npm命令

npm

npm是包管理工具,會隨著node.js一起安裝闪水,npm可以幫助我們下載(安裝)包和包的依賴

  • 默認npm鏡像源是國外的糕非,為了提高下載速度,可將npm鏡像源設置為國內(nèi)地址(淘寶鏡像源)
# 修改npm鏡像源
npm config set registry https://registry.npm.taobao.org
# 查看鏡像源
npm config get registry
  • 全局安裝
    • 命令:npm install <package-name> --global 簡寫npm i <package-name> -g
    • window下球榆,全局安裝的包默認存在:C:\Users\當前用戶名\AppData\Roaming\npm\node_modules
    • Mac 下朽肥,全局安裝的包默認存在 /usr/local/bin/lib/node_modules
  • 局部安裝(安裝項目包)
    1.創(chuàng)建項目目錄
    2.進入項目目錄
    3.初始化項目 npm init --yes (npm init會得到packaga.json文件)
    4.安裝包
    npm install <package-name> --save (簡寫:npm i <package-name> -S)開發(fā)生成環(huán)境都使用
    npm install <package-name> --save-dev (簡寫:npm i <package-name> -D)只在開發(fā)環(huán)境使用
  1. 命令行執(zhí)行
    如果包安裝在當前項目中(局部安裝),則命令的執(zhí)行路徑是當前項目下的 .\node_modules\.bin 目錄下持钉。
    # 局部安裝包的執(zhí)行路徑
    .\node_modules\.bin\lessc input.less output.css
    
    如果包是全局安裝衡招,則命令執(zhí)行的路徑也是全局的
    # 全局安裝包的執(zhí)行路徑
    lessc input.less output.css
    
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市每强,隨后出現(xiàn)的幾起案子始腾,更是在濱河造成了極大的恐慌,老刑警劉巖空执,帶你破解...
    沈念sama閱讀 212,332評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浪箭,死亡現(xiàn)場離奇詭異,居然都是意外死亡辨绊,警方通過查閱死者的電腦和手機奶栖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來门坷,“玉大人宣鄙,你說我怎么就攤上這事“莺祝” “怎么了框冀?”我有些...
    開封第一講書人閱讀 157,812評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長敏簿。 經(jīng)常有香客問我明也,道長,這世上最難降的妖魔是什么惯裕? 我笑而不...
    開封第一講書人閱讀 56,607評論 1 284
  • 正文 為了忘掉前任温数,我火速辦了婚禮,結果婚禮上蜻势,老公的妹妹穿的比我還像新娘撑刺。我一直安慰自己,他們只是感情好握玛,可當我...
    茶點故事閱讀 65,728評論 6 386
  • 文/花漫 我一把揭開白布够傍。 她就那樣靜靜地躺著甫菠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪冕屯。 梳的紋絲不亂的頭發(fā)上寂诱,一...
    開封第一講書人閱讀 49,919評論 1 290
  • 那天,我揣著相機與錄音安聘,去河邊找鬼痰洒。 笑死,一個胖子當著我的面吹牛浴韭,可吹牛的內(nèi)容都是我干的丘喻。 我是一名探鬼主播,決...
    沈念sama閱讀 39,071評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼念颈,長吁一口氣:“原來是場噩夢啊……” “哼泉粉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起榴芳,我...
    開封第一講書人閱讀 37,802評論 0 268
  • 序言:老撾萬榮一對情侶失蹤搀继,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后翠语,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叽躯,經(jīng)...
    沈念sama閱讀 44,256評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,576評論 2 327
  • 正文 我和宋清朗相戀三年肌括,在試婚紗的時候發(fā)現(xiàn)自己被綠了点骑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,712評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡谍夭,死狀恐怖黑滴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情紧索,我是刑警寧澤袁辈,帶...
    沈念sama閱讀 34,389評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站珠漂,受9級特大地震影響晚缩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜媳危,卻給世界環(huán)境...
    茶點故事閱讀 40,032評論 3 316
  • 文/蒙蒙 一荞彼、第九天 我趴在偏房一處隱蔽的房頂上張望魁瞪。 院中可真熱鬧稚失,春花似錦、人聲如沸虐先。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽癌压。三九已至,卻和暖如春荆陆,著一層夾襖步出監(jiān)牢的瞬間措拇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評論 1 266
  • 我被黑心中介騙來泰國打工慎宾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浅悉。 一個月前我還...
    沈念sama閱讀 46,473評論 2 360
  • 正文 我出身青樓趟据,卻偏偏與公主長得像,于是被迫代替她去往敵國和親术健。 傳聞我的和親對象是個殘疾皇子汹碱,可洞房花燭夜當晚...
    茶點故事閱讀 43,606評論 2 350

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