markdown是一個標記語言,能夠利用一些簡單的語法來對內容進行排版,能夠將markdown文件編譯成html,pdf,通常使用markdown寫筆記、文檔...javascript
eq:通常的項目中都會README.md文件來作項目標識。css
通常的編輯器均可以編寫markdown,語法簡單,也有專門的markdown編輯器html
執行npm init 進行項目初始化獲得package.json前端
全局安裝gulp :npm install gulp --global;java
在項目中安裝gulp依賴:npm install gulp --save-dev;node
建立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'])
入門鏈接,來自簡書github
一個後端技術,研究web應用的開發模式...,但願能有能力開發一些簡單的web服務器,學會操做數據庫等等。web
下面是對官網描述的解析:面試
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+,通常需求的包均可以在這裏找到
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的理念較爲符合..
對於我們來講,一種語言通吃先後端,而且能夠增長我們的競爭力
且Node如今較火,它有以下的特色:
==nodejs適合高併發、I/O密集型,可伸縮的網路應用,數據寫入讀取的應用比較好==
I/O輸入輸出頻繁的應用就是I/O密集型
==nodejs不適合CPU密集型的應用,各類計算的就不太適合==
CPU密集型應用,通常計算量特別的大!
==nodej間服務器:==s適合開發中
咱們能夠在這裏下載node,查看api,版本更新日誌等動態
咱們能夠在這這裏查找不少不少的node模塊去學習
nodeJs版本:
LTS指的是long time support 也就是長期支持版本,推薦你們安裝
Current是如今最新的版本。
請安裝到C盤吧,它佔用的內存不是很大,不會卡,不然須要配置全局變量才能夠在任意一個盤下使用。
咱們在項目目錄下創建一個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 文件名+回車(腳本模式),這時,咱們的服務就啓動了
這只是一個簡單的例子,裏面的代碼咱們後面都會詳細再介紹
若是是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,敲下回車會發生什麼?
利用DNS域名解析系統進行域名解析,將域名解析成IP
由於域名只是一個別名,計算機只認識IP,因此須要DNS解析一下
查找ip對應的主機服務器
若是是第一次訪問該服務器,會向網絡供應商(移動、聯通...)請求
TCP的三次握手,通過三次在客戶端和服務器之間傳遞報文,創建鏈接
發起http請求,請求入口文件,後端接收到請求相關信息,返回入口文件
解析入口文件,同時若是有資源請求繼續發送http請求...
入口文件渲染完成(TCP的四次揮手,斷開鏈接)
如今咱們來建立一個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) } })
什麼是模塊化?
將系統功能分離成獨立的功能部分的方法就是模塊化。目的、優勢:代碼複用,便於維護!(八字金言,基本上百分之八十的技術點的優勢均可以用這八個字歸納)
在生活中,假設有這樣的場景:
如今咱們須要作一個雕像:變型金剛。有兩種方式:1. 直接在大的材料上進行雕刻 2.分開部分來雕刻最後再組裝到一塊兒;
通常都會使用第二種方式,由於第二種有這樣的優勢:1. 便於分工合做 2. 便於複用 3. 便於維護(由於複用了,一改都改;由於每個模塊都是獨立的,便於修改)
模塊劃分的原則: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導入模塊的方式是: 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文件夾中的話,不須要寫路徑