NodeJS

前端開發的工具

編輯器:

  1. 輕量級的,依靠插件:sublime;atom(github);vs code(miscrosaft)
  2. 集成的:DW;webstorm;hbuild;

markdown

markdown是一個標記語言,能夠利用一些簡單的語法來對內容進行排版,能夠將markdown文件編譯成html,pdf,通常使用markdown寫筆記、文檔...javascript

eq:通常的項目中都會README.md文件來作項目標識。css

通常的編輯器均可以編寫markdown,語法簡單,也有專門的markdown編輯器html

使用gulp搭建markdown編譯環境

  1. 執行npm init 進行項目初始化獲得package.json前端

  2. 全局安裝gulp :npm install gulp --global;java

  3. 在項目中安裝gulp依賴:npm install gulp --save-dev;node

  4. 建立gulpfile.js文件設置任務:git

var gulp = require("gulp")
    var markdown = require('gulp-markdown');
    var mdpdf = require('gulp-markdown-pdf');


    gulp.task("compileMDToHtml",function () {
        gulp.src("./md/*.md")
            .pipe(markdown())
            .pipe(gulp.dest("./html"))
    })

    gulp.task("compileMDToPdf",function () {
        gulp.src("./md/*.md")
            .pipe(mdpdf())
            .pipe(gulp.dest("./pdf"))
    })

    gulp.task("watch:md",function(){
        gulp.watch("./md/*.md",['compileMDToHtml','compileMDToPdf'])
    })

    gulp.task("default",['compileMDToHtml','compileMDToPdf','watch:md'])
  1. 在命令行工具經過執行gulp指令來運行gulp中的默認任務

markdown的簡單語法

入門鏈接,來自簡書github


NodeJS

一個後端技術,研究web應用的開發模式...,但願能有能力開發一些簡單的web服務器,學會操做數據庫等等。web

NodeJS第一課

什麼是nodeJs

下面是對官網描述的解析:面試

Node.js 是一個基於 Chrome V8 引擎的 JavaScript 運行環境。

在Node裏面寫JS代碼,很開心~~,爲何基於引擎:在web前端中,js運行在瀏覽器中,js只是一個腳本語言,js文件也只是一個普通的文本文件,只有在瀏覽器中才能發揮應有的做用。瀏覽器內部有一個東西叫作內核,瀏覽器內核的類型:
IE :trident/microsoft/ms;chrome:blink(webkit)/google/webkit;firefox:gecko/mozillar/moz;opera:blink(presto)/opera/o; safari:webkit/apple/webkit
內核裏有兩個東西:渲染引擎(渲染DOM結構,CSS)、腳本引擎(編譯執行JS代碼)

Node.js 使用了一個事件驅動、非阻塞式 I/O 的模型,使其++輕量++又++高效++。

NodeJS的優勢:輕量、高效

node是使用C++編寫的基於V8引擎的JS運行環境,同時提供了不少基於ECMAScript的擴展對象。

node的底層語言是C++,JS是netscope公司創造出來的,誕生的目的是:在前端作表單驗證;netscope將js交給ECMA國際標準組織->ECMAScript 1.0;
ECMAScript是JS的語法規範;因此說:NODEjs裏的js語法和瀏覽器的語法是同樣的。且多出了不少對象;

Node.js 的包管理器 npm,成爲世界上最大的開放源代碼的生態系統。

npm是Node的一個小兄弟,會在安裝Node的時候一塊兒安裝,node package manager;npmjs這個網站上有不少不少的node的工具包來使用,免費的包就有470000+,通常需求的包均可以在這裏找到


NodeJS能夠幹什麼?

Node.js 能夠解析JS代碼(沒有瀏覽器安全級別的限制)提供不少系統級別的API,如:

瀏覽器運行JS的時候,例如AJAX,由於瀏覽器有同源策略,因此會出現跨域問題,這就是瀏覽器安全限制
瀏覽器端js不能操做文件系統,可是在NodeJs裏就能夠

  • 文件的讀寫
  • 進程的管理
  • 網絡通訊
  • ...

nodejs能夠編寫獨立的服務端應用,也能夠向客戶端提供Web內容,無需藉助與任何Web服務器(apache)能夠去鏈接文件系統,還能操做數據庫。

證實Node徹底能夠做爲後端服務器的開發工具
通常的應用分爲兩種架構:B/S(browser/server);C/S(client/server)
服務器的外觀上的話是千奇百怪的,內部分爲邏輯層(JS-NODE,PHP-APACHE,JAVA-VM)、資源層(文件系統,數據庫)

是Node選擇了JS,仍是JS選擇了Node?

是Node選擇了JS,由於JS的受衆較廣,且JS的特性和Node的理念較爲符合..


爲何要學習nodeJs

對於我們來講,一種語言通吃先後端,而且能夠增長我們的競爭力

且Node如今較火,它有以下的特色:

==nodejs適合高併發、I/O密集型,可伸縮的網路應用,數據寫入讀取的應用比較好==

I/O輸入輸出頻繁的應用就是I/O密集型

==nodejs不適合CPU密集型的應用,各類計算的就不太適合==

CPU密集型應用,通常計算量特別的大!

==nodej間服務器:==s適合開發中

> 將高併發的,I/O密集操做交由Node服務器來處理,Node服務器再向真正的Web服務器發送請求獲得響應後返回給前端

nodeJs 學習網站
  1. nodejs官網

咱們能夠在這裏下載node,查看api,版本更新日誌等動態

  1. npm官網

咱們能夠在這這裏查找不少不少的node模塊去學習

  1. github官網

  2. stackoverflow

  3. 掘金;sgmentFault

  4. 極客學院node文檔

nodeJs安裝

nodeJs版本:

LTS指的是long time support 也就是長期支持版本,推薦你們安裝

Current是如今最新的版本。

請安裝到C盤吧,它佔用的內存不是很大,不會卡,不然須要配置全局變量才能夠在任意一個盤下使用。


搭建第一個node服務器

咱們在項目目錄下創建一個server.js文件:

const http = require("http")

const port = 3000

const hostname = '127.0.0.1'

const server = http.createServer((req,res)=>{
    res.end('hai hai is handsome')
}).listen(port,()=>{
    console.log('server is listening')
})

這樣的話只要運行後,客戶端訪問這個服務器的時候就能夠接收到響應的信息

在控制檯裏輸入node 文件名+回車(腳本模式),這時,咱們的服務就啓動了

這只是一個簡單的例子,裏面的代碼咱們後面都會詳細再介紹


NodeJS運行JS代碼的方式
  1. 腳本模式:在命令行裏執行 node 文件名(不須要加後綴名) + enter就能夠運行腳本文件中的js代碼了。

若是是js文件的話,不須要加後綴名,若是是其餘後綴名的話必須得加

  1. REPL模式:在命令行中輸入node後回車,你們會發現這個時候咱們的控制檯就像chrome瀏覽器裏同樣能夠運行js代碼了,其實這裏就是node離的V8引擎解析js代碼的狀況。模式是讀一句返回一句。

注意,在Node裏運行alert會報錯:alert is not define,緣由是:

alert是屬於window對象的一個方法,window屬於BOM對象,BOM、DOM屬於宿主對象,在web前端JS中,瀏覽器就是JS的宿主,因此BOM/DOM是JS在瀏覽器中的宿主對象,在Node中,Node就是JS的宿主,Node的宿主對象可沒有BOM/DOM,更沒有window了。

好比process對象、global(角色定位至關於window對象)對象在瀏覽器裏就沒有


關於請求的面試題

當瀏覽器地址欄輸入www.baidu.com,敲下回車會發生什麼?

  1. 利用DNS域名解析系統進行域名解析,將域名解析成IP

    由於域名只是一個別名,計算機只認識IP,因此須要DNS解析一下

  2. 查找ip對應的主機服務器

    若是是第一次訪問該服務器,會向網絡供應商(移動、聯通...)請求

  3. TCP的三次握手,通過三次在客戶端和服務器之間傳遞報文,創建鏈接

  4. 發起http請求,請求入口文件,後端接收到請求相關信息,返回入口文件

  5. 解析入口文件,同時若是有資源請求繼續發送http請求...

  6. 入口文件渲染完成(TCP的四次揮手,斷開鏈接)


hello world

如今咱們來建立一個hello.js文件

ES6小知識:const能夠定義只讀常量readonly,let定義局部變量,只有用了這兩個,就會造成塊級做用域。

// 引入http模塊   說明Node給我們內置了不少模塊 
const http = require("http")
//定義端口
const port = 3000
//定義域名信息 10.9.166.65
// 假設有一個大商城(服務器主機),商城裏有不少商店(主機裏可能有不少服務器),每個商店都有本身的一個入口A1,A2(每個服務器都有一個端口),大商場可能也有一些名字(域名或者IP)

// 域名和IP:域名只是爲了方便用戶記憶,真正計算機識別的是IP,每個網段主機都會擁有一個ip,
// 127.0.0.1迴環地址對應的域名是localhost,每一個主機訪問此地址的時候都是訪問到的本身

const host = "127.0.0.1"

//建立服務(服務員) 傳入requestListener函數,當有客戶端訪問的時候就會執行
// req上保存的是這次訪問的請求相關信息,通常用來作判斷...
//res是專門作出響應的工具,有writeHead方法,statusCode屬性,setHeader方法,write方法,end方法
const server = http.createServer((req,res)=>{
    console.log(req.url)//這次請求的地址,獲得的就是整個請求地址中,域名端口後面的path路徑
    console.log(req.method)//這次請求的方法
    console.log(req.headers)//這次請求的請求頭信息例如cookie


    // res.statusCode=200//設置響應的狀態碼,爲瀏覽器而設置,200成功 404
    // res.setHeader("Content-Type","text/plain;charset=utf8")//設置響應頭
    //content-type特別重要,告訴瀏覽器我給你返回的是什麼東西,text/plain普通純文本,text/html,text/css,application/javascript
    
    // res.writeHead(200,{'Content-Type':'text/html;charset=utf8'})//是res.statusCode和res.setHeader的簡寫方式


    // res.write('海海帥嗎?<br/>') //寫入響應內容,能夠執行屢次,只能寫字符串
    // res.write('帥') 

    // res.end('!!!')//通知前端響應結束,其實在end裏也能夠寫入響應內容,可是end以後不能再write


    res.writeHead(200,{'Content-Type':'text/html;charset=utf8'})

    if(req.url=='/question'){
        res.end(Math.random()<0.8?'帥':'還行吧')
    }else if(req.url=='/random'){
        res.end(Math.random()+'')
    }else{
        res.end('<a href="http://10.9.166.65:3000/question">看看海海帥不帥</a><br/><a href="http://10.9.166.65:3000/random">來一個隨機數</a>')
    }


})
//監聽端口域名,跑起服務
server.listen(port,host,()=>{
    //會在監聽以後觸發
})

回調函數小知識

將一個函數做爲另外一個函數的參數或者對象的屬性值,這樣的函數就是回調函數

特色: 在某一個特定的時刻觸發

例如:

a.addEventListener("click",function(){
    alert(1)
})

$.ajax({
    success:function(){
        alert(1)
    }
})

模塊化及在Node中的應用

什麼是模塊化?

將系統功能分離成獨立的功能部分的方法就是模塊化。目的、優勢:代碼複用,便於維護!(八字金言,基本上百分之八十的技術點的優勢均可以用這八個字歸納)

在生活中,假設有這樣的場景:

如今咱們須要作一個雕像:變型金剛。有兩種方式:1. 直接在大的材料上進行雕刻 2.分開部分來雕刻最後再組裝到一塊兒;

通常都會使用第二種方式,由於第二種有這樣的優勢:1. 便於分工合做 2. 便於複用 3. 便於維護(由於複用了,一改都改;由於每個模塊都是獨立的,便於修改)

模塊劃分的原則:1. 此功能被複用次數較多 2. 此功能的邏輯較爲獨立

模塊應該具備的特性:

  1. 內聚度:模塊的獨立性,越高越好;

    例如,海賊王裏每個角色都有本身獨立的支線故事,他們的內聚度高

  2. 耦合度:模塊與模塊間的關係,越低越好;

    例如:葫蘆娃裏的七個娃,一個被抓,全軍覆沒,耦合度較高。

模塊化的規範:

在開發變形金剛的時候,每個部分最後都要鏈接到一塊兒,因此須要規定一些鏈接的相關規則,好比,螺釘的長寬高,螺孔的長寬高。螺釘的做用是爲了此模塊能夠導入到其餘模塊中,螺孔的做用是能夠將其餘模塊導入進來,也就說,模塊化的規範其實就是規定螺釘ヘ螺孔的相關信息,其實也就說:

如何導入模塊,和如何導出模塊

現有的幾種模塊化規範:

| 現有的規範     | AMD           | CMD    |CommonJS  |ES6 module  |
| ------------- |:-------------:| :-----:| :-------:| ----------:|
| 使用場景      | 前端 | 前端  |後端Node |先後端都行(須要編譯)|
| 工具或環境      | requierJs      |   SeaJs  |Node |在js引擎裏 |
| 同異步 | 異步(async module define 異步模塊定義)   | 同步,延遲加載 (commond module define 通用模塊定義) |同步 |同步|

AMD是requirejs工具裏定義的模塊化規範,requireJS在推廣的過程當中對本身的模塊化規範命名爲AMD,異步導入模塊,運行於瀏覽器端,不會阻塞頁面加載:

```
    //利用define函數來導出模塊,能夠經過require函數導入模塊(同步,不建議使用),在define函數的i一個參數數組裏也能夠指定須要導入的模塊,提早加載

    var c = require('c')
    console.log(c)
    define(['a','b'],function(a,b){
        console.log(a,b)
    })
    console.log(1)

```

CMD是seaJS工具裏定義的模塊化規範,同步可是延遲導入模塊,也不會阻塞,as lazy as possible

```
    //b模塊
    define(function(){
        var a = require('a')
        console.log(a)
    })
```

CommonJS是Node的模塊化規範,它是同步導入模塊,由於node的模塊都是本地的,因此模塊的加載速度等於硬盤的讀取速度,不會阻塞代碼的運行
CommonJS的模塊化與使用
CommonJS導入模塊的方式是:

1. 使用require方法,傳入目標模塊的路徑,返回值爲模塊導出的內容

注意:

模塊導入以後,模塊內的代碼會執行一次,

模塊裏的變量、函數都是私有的。若是須要使用,必須得在模塊中導出

默認的模塊導出的是module.exports這個對象,這是一個空對象

代碼:

```
    //math.js      
    const math = {
        add(num1,num2){
            return num1+num2
        },
        reduce(num1,num2){
            return num1-num2
        },
        mutiply(num1,num2){
            return num1*num2
        },
        divide(num1,num2){
            return num1/num2
        }
    }

    module.exports = math
    // module.exports.math=math
    // module.exports.add = math.add
    // module.exports.reduce = math.reduce
    // module.exports.mutiply = math.mutiply
    // module.exports.divide = math.divide

```

```
    // a.js
    const math = require('./modules/math')
    console.log(math.divide(6,2))

```

2. 能夠把一個大模塊作成一個目錄,直接引入這個目錄名至關於導入的是目錄裏的入口文件,默認狀況入口文件是index.js,若是目錄中存在package.json的話,json文件中配置的main選項的文件就是入口文件。

    若是此目錄在node_modules文件夾中的話,不須要寫路徑
相關文章
相關標籤/搜索