追求卓越一諾千金

藍藍設計__意彩官网注册,2011年成立--葫芦岛一高中家长汇,主創清華團隊|1号彩票网靠谱吗?,專注軟件和互聯網ui設計開發|_1分快3彩票合法吗。擅長企業信息化管理野兽与乡巴佬、監控|--波特卡斯d提娜、大數據軟件UIUE谘詢和設計開發服務-||八马赛珍珠5800价格。立足UI|__优彩国际彩票平台,好好學習__|试优网,天天進步--穆勒故意跪倒!


前端開發——NodeJs學習

2019-6-20 釋然 前端及開發文章及欣賞


如果您想訂閱本博客內容_18彩app官方下载,每天自動發到您的郵箱中|_潮水时间表, 請點這裏

NodeJs基礎
nodejs的本質_--恋恋不忘下载:不是一門新的編程語言|-_副镇长辞职,nodejs是javascript運行在服務端的運行環境---雪人大冒险,編程語言還是javascript

global模塊-全局變量
Node.js 中的全局對象是 global, 類似於瀏覽器中的window

常用的global屬性

console: 用於打印日誌
setTimeout/clearTimeout: 設置清除延時器
setInterval/clearInterval: 設置清除定時器

__dirname: 當前文件的路徑||-上海哪有蹦极的地方,不包括文件名
__filename-234彩票真假: 獲取當前文件的路徑--|108彩票靠谱吗,包括文件名

//與模塊化相關的|||分宜租房网,模塊化的時候會用到
require
exports
module

除了global模塊中的內容可以直接使用||上海情侣网吧门,其他模塊都是需要加載的|注册网址需要什么。
其他模塊不是全局的__白看网络电视,不能直接使用_||高辣快穿吃辣之旅。因此需要導入才能使用|__苟在松。
fs模塊
fileSystem-- 文件係統|__众发彩票计划群,提供了一係列操作文件的API接口__华录s9000,可以方便我讀寫文件

讀取文件
語法|_|10元可提现的棋牌:fs.readFile(path[, options], callback)

方式一--|永城彩票首页:不傳編碼參數

//參數1-中国军衔胸章: 文件的名字
//參數2|_-22彩票的真假: 讀取文件的回調函數
  //參數1-||银泰店庆时间:錯誤對象_|_海比网,如果讀取失敗-||众网彩,err會包含錯誤信息-__云顶娱乐有挂吗,如果讀取成功_-_仲博彩票平台靠谱吗,err是null
  //參數2_sky浪翻云:讀取成功後的數據(是一個Buffer對象)
fs.readFile("data.txt", function(err, data){
  console.log(err);
  console.log(data);
  // 可以通過data.toString() 把二進製數據轉成文本-361娱乐彩票平台登录,當然前提是讀取的文件本來就是文本|-_夫妻轩,如果是圖片獲取的二進製就無法轉換成文本
});

方式二||周村二手房:傳編碼參數

//參數1_|胆清强磁贴官网: 文件的路徑
//參數2-|_铁梨花结局: 編碼-_助赢永久免费计划版app,如果設置了_-_王翠明居士2013最新,返回一個字符串__注册了987彩票怎么注销,如果沒有設置-_亿彩投注赚钱是真的吗,會返回一個buffer對象
//參數3---金韵蓉博客: 回調函數
fs.readFile("data.txt", "utf8",function(err, data){
  console.log(err);
  console.log(data);
});

關於Buffer對象

1. Buffer對象是Nodejs用於處理二進製數據的-|-娱乐赌博软件大全。
2. 其實任意的數據在計算機底層都是二進製數據__冰火三重天,因為計算機隻認識二進製_-易中彩票代玩账号兼职。
3. 所以讀取任意的文件-_众发彩票赚钱吗?,返回的結果都是二進製數據|_云顶至尊app怎么样,即Buffer對象
4. Buffer對象可以調用toString()方法轉換成字符串--重庆公安局局长。

寫文件
語法-__别克赛欧srv怎么样:fs.writeFile(file, data[, options], callback)

//參數1_|_陌若安生是什么意思:寫入的文件名(如果文件不存在--掌上购彩破解,會自動創建)
//參數2__新商盟卷烟超市:寫入的文件內容(注意奇瑞s18d:寫入的內容會覆蓋以前的內容)
//參數3|-花都区教育局网:寫文件後的回調函數
fs.writeFile("2.txt", "hello world, 我是一個中國人", function(err){
  if(err) {
    return console.log("寫入文件失敗", err);
  }
  console.log("寫入文件成功");
});
1
2
3
4
5
6
7
8
9
注意-沈阳北站问事处电话:

寫文件的時候_-掌上彩票用不了,會把原來的內容給覆蓋掉
追加文件
語法|-丁丁网上海:fs.appendFile(path, data[, options], callback)

//參數1_-英皇娱乐:追加的文件名(如果文件不存在___强心脏20121127,會自動創建)
//參數2||陆地巡洋舰摩托车:追加的文件內容(注意-__封条格式:寫入的內容會覆蓋以前的內容)
//參數3|_沈阳调料市场:追加文件後的回調函數
fs.appendFile("2.txt", "我是追加的內容", function(err){
  if(err) {
    return console.log("追加文件內容失敗");
  }
  console.log("追加文件內容成功");
})


思考__|兰州 摸吧:如果沒有appendFile-_-013彩票,通過readFile與writeFile應該怎麼實現|-重庆ume官网?

文件同步與異步的說明
fs中所有的文件操作__众赢彩票是真的吗?,都提供了異步和同步兩種方式

異步方式-||优秀英文文章:不會阻塞代碼的執行
同步方式__镇江老兵事件最新进展:會阻塞代碼的執行
//同步方式
console.log(111);
var result = fs.readFileSync("2.txt", "utf-8");
console.log(result);
console.log(222);

總結-|黄牛课件网:同步操作使用雖然簡單---阜南教育网,但是會影響性能__殷佳心,因此盡量使用異步方法_|_256时时彩安卓版,尤其是在工作過程中|__角竹光寿打成语。

stream
stream是Node.js提供的又一個僅在服務區端可用的模塊||-青山湖教体局,目的是支持“流”這種數據結構-阎明。

什麼是流_|_立冬立秋诗句?流是一種抽象的數據結構--长城哈弗cuv。想象水流||_勇者斗恶龙怪兽篇joker2金手指,當在水管中流動時|||震南帮,就可以從某個地方(例如自來水廠)源源不斷地到達另一個地方(比如你家的洗手池)-|武松卡盟官网。我們也可以把數據看成是數據流|_银利半岛卡,比如你敲鍵盤的時候|-106官方彩票com,就可以把每個字符依次連起來|_注册下载app送28,看成字符流-|柯露玛。這個流是從鍵盤輸入到應用程序_-|诺氟沙星副作用,實際上它還對應著一個名字_-qq炫舞答题答案每日更新:標準輸入流(stdin)|3cp彩票官网。

如果應用程序把字符一個一個輸出到顯示器上--_鸣人堂,這也可以看成是一個流__7374小游戏,這個流也有名字|_易彩集团下载:標準輸出流(stdout)||-重庆城投集团董事长。流的特點是數據是有序的_镇江老兵被打事件,而且必須依次讀取|-|汤唯在韩国视频,或者依次寫入|__马丁路德金演讲视频,不能像Array那樣隨機定位-__1288彩票官方app。

有些流用來讀取數據-|_龙的对联,比如從文件讀取數據時|||长春高新交警大队,可以打開一個文件流--赢钱彩票,然後從文件流中不斷地讀取數據-沈阳市财政局财会之窗。有些流用來寫入數據_-优信彩票软件,比如向文件寫入數據時-|乐购卡盟,隻需要把數據不斷地往文件流中寫進去就可以了___高林生舒淇。

在Node.js中|_言语天堂,流也是一個對象_|-11选5彩票选号神器,我們隻需要響應流的事件就可以了-_|买什么车性价比高:data事件表示流的數據已經可以讀取了|--众彩彩票平台,end事件表示這個流已經到末尾了__|二手军用吉普车,沒有數據可以讀取了-_-构橘,error事件表示出錯了_-亿赢彩票客服。

下麵是一個從文件流讀取文本內容的示例_--玫琳凯之窗登录:

'use strict';

var fs = require('fs');

// 打開一個流:
var rs = fs.createReadStream('sample.txt', 'utf-8');

rs.on('data', function (chunk) {
    console.log('DATA:')
    console.log(chunk);
});

rs.on('end', function () {
    console.log('END');
});

rs.on('error', function (err) {
    console.log('ERROR: ' + err);
});

要注意_|金山升一艺能事务所,data事件可能會有多次-_亿彩彩票北京pk10,每次傳遞的chunk是流的一部分數據-|_奥特曼之超决战。

要以流的形式寫入文件--犇龙庙,隻需要不斷調用write()方法||-qq宠物猪猪领养,最後以end()結束|_|娱乐天地登录网页版:

'use strict';

var fs = require('fs');

var ws1 = fs.createWriteStream('output1.txt', 'utf-8');
ws1.write('使用Stream寫入文本數據...\n');
ws1.write('END.');
ws1.end();

var ws2 = fs.createWriteStream('output2.txt');
ws2.write(new Buffer('使用Stream寫入二進製數據...\n', 'utf-8'));
ws2.write(new Buffer('END.', 'utf-8'));
ws2.end();


所有可以讀取數據的流都繼承自stream.Readable--娱乐天地检点登录,所有可以寫入的流都繼承自stream.Writable-399彩票什么时候开始。

pipe
就像可以把兩個水管串成一個更長的水管一樣|_|北京哪有鸡,兩個流也可以串起來|_中国股神江林的博客。一個Readable流和一個Writable流串起來後_||众彩app怎么下载,所有的數據自動從Readable流進入Writable流_--雪域藏王散,這種操作叫pipe|_22选五开奖结果河南的。

在Node.js中_|_至尊app官方下载,Readable流有一個pipe()方法-_|可可西男装,就是用來幹這件事的-_-冷情王爷痴情妃。

讓我們用pipe()把一個文件流和另一個文件流串起來|_-阿玛拉王国武器锻造,這樣源文件的所有數據就自動寫入到目標文件裏了|-_青田信息港,所以-_北京466耳鼻喉专家,這實際上是一個複製文件的程序-|-360彩票导航彩票走势图:

'use strict';

var fs = require('fs');

var rs = fs.createReadStream('sample.txt');
var ws = fs.createWriteStream('copied.txt');

rs.pipe(ws);

默認情況下__河北区haobc,當Readable流的數據讀取完畢_|-红色警戒2全能王,end事件觸發後_--快乐大本营张惠妹,將自動關閉Writable流--九阴真经监狱。如果我們不希望自動關閉Writable流__永盛彩票正规吗,需要傳入參數-_注册送彩金的所有平台:

readable.pipe(writable, { end: false });
1
path模塊
路徑操作的問題
具體的說明可以參考 NodeJs學習.md

在讀寫文件的時候-陈德斌,文件路徑可以寫相對路徑或者絕對路徑

//data.txt是相對路徑-诺亚舟电子辞典,讀取當前目錄下的data.txt, 相對路徑相對的是指向node命令的路徑
//如果node命令不是在當前目錄下執行就會報錯|36远7走势图, 在當前執行node命令的目錄下查找data.txt-_152彩票怎么样,找不到
fs.readFile("data.txt", "utf8", function(err, data) {
  if(err) {
    console.log("讀取文件失敗", err);
  }

  console.log(data);
});

相對路徑||掌上永辉职工app考勤:相對於執行node命令的路徑

絕對路徑|--双色球66期开奖结果:__dirname: 當前文件的目錄___应用宝5 0,__filename: 當前文件的目錄|_038彩票合法吗,包含文件名

path模塊的常用方法
關於路徑静安寺大火,在linux係統中_鱼翅价格,路徑分隔符使用的是/腾龙山,但是在windows係統中-_maigoo中国十大品牌网,路徑使用的\

在我們拚寫路徑的時候會帶來很多的麻煩|七年级数学下册期末试卷,經常會出現windows下寫的代碼-|-123彩票app,在linux操作係統下執行不了_-|天才相师2,path模塊就是為了解決這個問題而存在的|青岛教育局人事处。

常用方法|小学优秀教师事迹材料:

path.join();//拚接路徑

//windows係統下
> path.join("abc","def","gg", "index.html")
"abc\def\gg\a.html"

//linux係統下
> path.join("abc","def","gg", "index.html")
'abc/def/gg/index.html'

http模塊
創建服務器步驟

// 移入http模塊
const http = require('http')
// 調用創建http 服務器的方法
const server = http.createServe()
// 給服務器注冊request事件監聽_-安万克,每次瀏覽器像服務器發送請求的時候都會被監聽到
server.on('request', function(request, response){
    // request 瀏覽器請求的數據|_|金章宗,包括請求方式method 請求的地址 url等
    // response 瀏覽器的響應|_-众购彩票导航网,可以設置響應頭-__撒旦缠爱、響應體||_龙玛显脉片、響應狀態碼
    const method = request.method
    const url = request.url
    
    // 設置響應的狀態碼
    response.StatusCode = 404
    // 設置響應的頭
    response.setHeader('Content-Type', 'text/html');
    // 設置響應體內容,write可以調用多次
    response.write('hello world!')
    // 響應結束
    response.end()
    
    // 如果在end(content)_||郭美美死了,這樣的寫法相當於是讓write和end的合寫
    response.end('hello world!')
})
// 給服務器設置監聽,相當於啟動服務器
server.listen(8888,function(){
    console.log('服務器啟動成功')
})

// 簡寫方式

http.createServer((req,res) => {
    ....
}).listen(8888,() => {
    ....
})

詳細說明

給服務器注冊request事件|-6厘米等于多少毫米,隻要服務器接收到了客戶端的請求_-22彩票官网地址,就會觸發request事件
request事件有兩個參數|荷兰朵奶粉价格,request表示請求對象||川子 钟,可以獲取所有與請求相關的信息|234彩票会被关了么,response是響應對象-|珠江钢琴2013价格表,可以獲取所有與響應相關的信息|-旁开口女裤。
服務器監聽的端口範圍為|雨丝风片:1-65535之間|_林嘉仪,推薦使用3000以上的端口|_|柳州音乐网,因為3000以下的端口一般留給係統使用
response對象詳解
常見的屬性和方法--_为什么女的会操出水:

res.write(data): 給瀏覽器發送請求體|-|嘉酒视窗,可以調用多次|读书郎f20,從而提供連續的請求體
res.end();   通知服務器__|青海明胶吧,所有響應頭和響應主體都已被發送___阿凡提物流查询,即服務器將其視為已完成_|无毒刷q币软件。
res.end(data); 結束請求-诺基亚7070拆机,並且響應一段內容__-长沙三毛妮休闲中心,相當於res.write(data) + res.end()
res.statusCode: 響應的的狀態碼 200 404 500
res.statusMessage: 響應的狀態信息_|_智彩电子走势图, OK Not Found ,會根據statusCode自動設置|注册账号彩金。
res.setHeader(name, value); 設置響應頭信息_-青苹果家园论坛, 比如content-type
res.writeHead(statusCode, statusMessage, options); 設置響應頭_-18136期七星彩开奖结果,同時可以設置狀態碼和狀態信息--|对子莲。
1
2
3
4
5
6
7
注意-_闭月堂:必須先設置響應頭--河南省实验中学校长,才能設置響應_-陈奎元。

實現靜態WEB服務器
服務器響應首頁
注意-||张柏芝约谈谢霆锋:瀏覽器中輸入的URL地址__兰西小屋论坛,僅僅是一個標識--_wifi密码破解软件,不與服務器中的目錄一致_-|苏州大润发超市网站。也就是說-|众发娱乐计划:返回什麼內容是由服務端的邏輯決定
server.on('request', function(req, res) {
  var url = req.url
  if(url === '/') {
    fs.readFile('./index.html', function(err, data) {
      if(err) {
        return res.end('您訪問的資源不存在~')
      }

      res.end(data)
    })
  }
})

根據根據不同url优彩网靠谱吗,響應不同文件
content-type設置-MIME類型
MIME(Multipurpose Internet Mail Extensions)多用途Internet郵件擴展類型 是一種表示文檔性質和格式的標準化方式
瀏覽器通常使用MIME類型(而不是文件擴展名)來確定如何處理文檔|||118彩票会员账号63475;因此服務器將正確的MIME類型附加到響應對象的頭部是非常重要的
MIME類型的通用處理-mime模塊
作用_|万峰网:獲取文件的MIME類型
安裝|_脚模图片:npm i mime
var mime = require('mime')

// 獲取路徑對應的MIME類型
mime.getType('txt')                    // ⇨ 'text/plain'
// 根據MIME獲取到文件後綴名
mime.getExtension('text/plain')        // ⇨ 'txt'
1
2
3
4
5
6
有了這個模塊我們就可以把設置響應頭的代碼改寫成下麵

// mime 不僅可以隻寫一個後綴名--|终难忘 秋夜雨寒,還可以通過url來解析出後綴名來-||运盛彩票提不了钱,因此這裏可以直接寫url
response.setHeader('content-type',mime.getType(request.url))
1
2
npm - Node包管理工具
初始化包
npm init;    //這個命令用於初始化一個包|_150期马会资料,創建一個package.json文件-|ncbc手机,我們的項目都應該先執行npm init
npm init -y;  //快速的初始化一個包_||长春市亚泰小学, 不能是一個中文名
1
2
安裝包
npm install 包名;  //安裝指定的包名的最新版本到項目中
npm install 包名@版本號;  //安裝指定包的指定版本

npm i 包名|-中国卫生人才网成绩查询2017; //簡寫

卸載包
npm uninstall 包名;  //卸載已經安裝的包
1
清除緩存
npm cache clean -f // 如果npm安裝失敗了_||2019年06期新粤彩,可以用這個命令來清除緩存
1
package.json文件
package.json文件|--满座网临平,包(項目)描述文件||_1号彩票网APP,用來管理組織一個包(項目)|_注册送彩的彩票APP大全,它是一個純JSON格式的||248彩票安卓版免费。

作用-优盈彩票是合法:描述當前項目(包)的信息|-58创业加盟网,描述當前包(項目)的依賴項
如何生成||-234彩票app:npm init或者npm init -y
作用
作為一個標準的包_|锦都游泳馆,必須要有package.json文件進行描述
一個項目的node_modules目錄通常都會很大--至尊联盟,不用拷貝node_modules目錄_-台风莫兰蒂登陆,可以通過package.json文件配合npm install直接安裝項目所有的依賴項
描述內容
{
  "name": "03-npm",  //描述了包的名字|_-长江电力电子商务网,不能有中文
  "version": "1.0.0",  //描述了包的的版本信息-|_金铁霖简历, x.y.z  如果隻是修複bug-||哈尔滨群力新区楼盘,需要更新Z位_-01彩票客服。如果是新增了功能|_两朝太岁,但是向下兼容-__盛大易购,需要更新Y位__-168彩票网站返现正规吗。如果有大變動|||抓住偷水贼,向下不兼容|_08彩票平台,需要更新X位__-艾尔之光狂心武者。
  "description": "", //包的描述信息
  "main": "index.js", //入口文件(模塊化加載規則的時候詳細的講)
  "scripts": {  //配置一些腳本_18150期双色球开奖结果,在vue的時候會用到_-|钢筋混凝土管规格,現在體會不到
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],  //關鍵字(方便搜索)
  "author": "",  //作者的信息
  "license": "ISC",  //許可證-__手机四核处理器,開源協議
  "dependencies": {   //重要_-少年进化论成员,項目的依賴-|好看的电影网站你懂的, 方便代碼的共享  通過 npm install可以直接安裝所有的依賴項
    "bootstrap": "^3.3.7",
    "jquery": "^3.3.1"
  }
}

注意--邓超暧昧短信:一個合法的package.json|_-248彩票安卓版免费,必須要有name和version兩個屬性

本地安裝和全局安裝
有兩種方式用來安裝 npm 包_--中兴彩票网是真的假的:本地安裝和全局安裝-快感方程式1。選用哪種方式來安裝--|网易云音乐网页版,取決於你如何使用這個包|_ume重庆。

全局安裝-_镇江老兵事件最新进展:如果你想將其作為一個命令行工具--不丹王妃,那麼你應該將其安裝到全局_-聚美优品网页打不开。這種安裝方式後可以讓你在任何目錄下使用這個命令|_|欣荣图片。比如less命令--|k mic,webpack命令||掌上购彩,hcc-md命令 ||ca6707。
本地安裝-_178国际娱乐:如果你自己的模塊依賴於某個包__赢彩彩票旧版,並通過 Node.js 的 require 加載|_|16楼影院,那麼你應該選擇本地安裝--淘玩偶,這種方式也是 npm install 命令的默認行為|_投票软件好喜福。
// 全局安裝,會把npm包安裝到C:\Users\HUCC\AppData\Roaming\npm目錄下--360双色球开奖号码查询,作為命令行工具使用
npm install -g 包名;

//本地安裝-诺顿最新激活码,會把npm包安裝到當前項目的node_modules文件中_-试卖网,作為項目的依賴
npm install 包名;  

常見的命令行工具
nrm
nrm--_1分时时彩规律:npm registry manager(npm倉庫地址管理工具)
安裝|-众购彩票登入:npm i -g nrm
# 帶*表示當前正在使用的地址

# 查看倉庫地址列表
nrm ls

# 切換倉庫地址
nrm use taobao

nodemon 自動重啟
作用_-197彩票平台:監視到js文件修改後--海马台风最新消息,自動重啟node程序
安裝--_魔泥官网:npm i -g nodemon
使用_||镜之大迷宫金手指:nodemon app.js 運行node程序
模塊化(module)
基本概念
在nodejs中---亿鑫彩票,應用由模塊組成|_不丹王妃,nodejs中采用commonJS模塊規範|_深圳福永砍人。

一個js文件就是一個模塊
每個模塊都是一個獨立的作用域-_众彩跟单靠谱吗,在這個而文件中定義的變量|__非洲色图、函數_|-具人同行家具网购、對象都是私有的-_|长沙坎城红毯,對其他文件不可見_李白谈爱原文。
node中模塊分類
1 核心模塊
由 node 本身提供__103彩票平台,不需要單獨安裝(npm)|-_金铭老公,可直接引入使用
2 第三方模塊
由社區或個人提供--360彩票导航走势图解,需要通過npm安裝後使用
3 自定義模塊
由我們自己創建_-|话剧奋斗,比如|现代诗精选:tool.js ||众乐彩票、 user.js
核心模塊
fs__淘宝股票代码:文件操作模塊
http-|河北省宁晋县郝庄村:網絡操作模塊
path|_百度词典发音:路徑操作模塊
url: 解析地址的模塊
querystring: 解析參數字符串的模塊
基本使用|免费刷q币软件下载:1 先引入 2 再使用
// 引入模塊
var fs = require('fs');
1
2
第三方模塊
第三方模塊是由 社區或個人 提供的
比如_|360彩票走势图:mime模塊/art-template/jquery…
基本使用|||德国球员:1 先通過npm下載 2 再引入 3 最後使用
用戶自定義模塊
由開發人員創建的模塊(JS文件)
基本使用||智彩平台:1 創建模塊 2 引入模塊
注意-|青岛华臣影讯:自定義模塊的路徑必須以./獲取../開頭
// 加載模塊
require('./a')     // 推薦使用-陆幽张斌,省略.js後綴掌上彩票官方网站!

require('./a.js')
1
2
3
4
模塊導入
/* 
  nodejs中模塊分為3大類
    1. nodejs本身提供的核心模塊   fs http path url querystring
      核心模塊不需要安裝||_情侣号名字,直接導入即可|-_贵州人和老板。
      核心模塊的加載語法-_你有一封信 深圳卫视: const fs = require('fs')
    
    2. 第三方模塊  mime art-template
      第三方模塊-_-俗人岛华人论坛: 必須先安裝(npm install XXX)  才能導入
      第三方模塊的加載語法||西安都市快报直播: npm install XXX   const mime = require('mime')
    
    3. 自定義的模塊 一個js文件 
      不需要安裝  隻需要自己創建一個js文件
      自定義模塊的加載語法--贵州兰花:  require('模塊的路徑')  模塊不能是名字_|恩施天气预报,必須是路徑  ./ ../ .js後綴是可以省略

  require加載規則(以mime模塊為例)
  1. 判斷是否是路徑_盈彩时时彩计划, 如果是  就是自定義模塊
  2. 如果是名字 判斷是否是核心模塊
  3. 如果是第三方模塊  在當前目錄找node_modules
  4. 在node_modules中查找mime文件夾
  5. 查找是否有package.json_冀东油田吧, 查看是否main屬性
  6. 判斷是否有main, 如果沒有-好看的电影你懂的,默認查找index.js  index.json index.node
  7. 如果沒有
  8. 如果找不到--|年利率是什么意思,就去上一層目錄---重庆城投集团董事长,一直找到根目錄
  9_|qq空间克隆下载, 如果還沒有|_瑟银矿哪里多,就說明模塊不存在
*/

模塊導出
/* 
  1. 模塊中定義的變量和函數都是私有的
  2. 任意的一個模塊中-易购彩票, 都有自帶一個屬性 module (全局屬性) module代表的就是當前的這個模塊_||奢侈品牌标志。
  3. module中有一個屬性  exports ,這個exports屬性是一個對象|_|万年屋日本料理,代表的就是當前模塊的導出 module.exports當前模塊唯一能夠被外界訪問到的

*/
//通過module.exports對外導出一些值
module.exports = 值  隻能導出一個值
module.exports = {}  可以把所有要導出的內容都放到一個新的對象中
module.export.xxx = 值
/* 
  在任意的模塊中 module.exports表示該模塊的導出
  為了我們方便導出__|运盛彩票注册, 每個模塊中還提供了 exports  
  exports 初始狀態下|-曰本里番老师工口acg,和module.exports指向了同一個對象-_|11086时时彩官网ip禁止。

  注意點__8万元左右买什么车好: 如果通過exports的方式來導出內容---中央领导人名单,隻能給對象增加屬性 不能替換這個對象
*/
// 我們真正到處的對象是module.exports指向的對象
exports = {} // 這樣隻是改了exports的指向_易赢在线注册,而module.exports的指向沒有改變|_克隆qq空间,所以這樣是不對的
// 以下這種是允許的
exports.xxx = '值'

express與mysql
首先需要安裝mysql模塊

npm i mysql
1
基本使用
// 導入第三方包
const mysql = require('mysql')
// 創建連接
var connection = mysql.createConnection({
  // 本地
  host: 'localhost',
  user: 'root',
  password: 'root',
  // 數據庫名稱
  database: 'mydb',
  port: 3306
})

// 連接數據庫
connection.connect()

// 執行sql語句
connection.query('select * from user where id = 8', (err, result) => {
  if (err) return console.log('查詢失敗', err)
  // result返回的是數組__|内地综艺节目男主持人排行榜, 數組中是一個對象
  console.log(result)
})

// 關閉連接
connection.end()


查詢語句
var name = 'zs'
// 使用?表示占位_-亿彩登录网址,可以防止sql注入
connect.query(`select * from user where name=?`, name, (err, result) => {
  if (err) return console.log('錯誤了', err)
  console.log(result)
})
1
2
3
4
5
6
插入語句
connect.query(
  'insert into user (name, age, gender, content) values (?, ?, ?, ?)',
  ['zs', 18, '男', '哈哈哈哈'],
  err => {
    if (err) return console.log('錯誤', err)
    console.log('添加成功了')
  }
)

// 方式2
connect.query(
  'insert into user set ?',
  {
    name: 'zs',
    age: 30,
    gender: '男',
    content: '哈哈哈'
  },
  (err, result) => {
    if (err) return console.log('錯誤', err)
    console.log('添加成功了', result)
  }
)


修改語句
connect.query(
  'update user set ? where id = ?',
  [
    {
      name: 'zs',
      age: 30,
      gender: '男',
      content: '哈哈哈'
    },
    10
  ],
  (err, result) => {
    if (err) return console.log('錯誤', err)
    console.log('添加成功了', result)
  }
)

刪除語句
connect.query('delete from user where id = ?', 10, (err, result) => {
  if (err) return console.log('失敗', err)
  console.log(result)
})
1
2
3
4
登錄狀態保持
http是無狀態的|--玩拍网,但是隨著技術的發展|-长春房地产报房源,我們需要記住某些東西--248彩票注册邀请码,但是因為http是無狀態的--_邯郸晚报电子版,無法讓服務器記住東西-vivos7t手机报价,因此就引入了cookie和session這兩個東西--|玉子金童,cookie用於瀏覽器端--芬迪斯,session用於服務器端-leledy8。

以用戶登錄為例||_定陶教育信息网:

當用戶登錄時___湖南卫视直播在线观看古剑奇谭,瀏覽器會給服務器發送請求---京东机票网,這時候服務器就會開辟一個空間用於存放session數據|-小学教师先进材料,並且會把生成的sessionId返回給瀏覽器||永胜国际快彩,存放在瀏覽器的cookie中--|卡通战争剑灵内购,之後瀏覽器在請求服務器的時候|--斗鱼mini叫声,就會去比對是否存在這個session_||随意贴。這樣你的登錄狀態就已經保持下來了

cookie的特點

cookie大小隻有4k
cookie每次請求的時候_|云购彩票骗局揭秘,都會自動攜帶
cookie可以設置過期時間
為了方便使用-天龙八部39,我們可以使用express-session這個包-|药酒是在哪个朝代之后出现的,可以很方便使用session

express-session步驟||-林娜冰21:
1. 下載  npm i express-session
2. 導入  const session = require("express-session")
3. 使用session中間件
app.use(session({
    secret: 'itcast',
    // 設置瀏覽器端cookie的名字_-最新钓鱼用具, 默認connect.sid
    name: 'itcast',
    resave: false,
    // 在瀏覽器和服務器連接的第一時間-酷派w706软件下载,分配session  給瀏覽器指定一個cookie
    saveUninitialized: true
}))
可以通過req.session訪問到session
4. 登錄成功-|娱乐天地点检官网注册,把登錄成功的用戶信息存儲到 req.session.xxx中
5. 提供一個中間件|_众发娱乐属于赌博吗,這個中間件在路由的前麵||上海哪有蹦极的地方,判斷 req.session.xxx是否有值_永盛彩票注册,有值_-|金陵女神,放走|_-234彩票靠谱吗,沒值|_冰心的原名是什么,去登錄||_单单堂,細節_|105彩票安卓2812版: 如果是/login 直接放走
6. 退出功能-众赢彩票的骗局:  把req.session.xxx 清空即可


瀏覽器登錄和退出
1. 登錄做什麼  把用戶名和密碼給服務器
2. 退出做什麼|||众彩国际彩票合法吗, 1. 告訴服務器|-阿皮亚古道,要退出   2.(清緩存也行)

yarn和npm的說明
官網|-亿彩彩票代理:https://yarn.bootcss.com/

Yarn是由Facebook|-|优衣库视频ed2k、Google_||芦荟棉是什么面料、Exponent 和 Tilde 聯合推出了一個新的 JS 包管理工具 |--亿客隆彩票网站合法吗,Yarn 是為了彌補 npm 的一些缺陷而出現的_|_王的第十七妾。

Yarn 緩存了每個下載過的包__英冠达,所以再次使用時無需重複下載__-自由篮球pf加点。
同時利用並行下載以最大化資源利用率___2018大乐透148期,因此安裝速度更快||钢八连。
yarn的用法和npm的用法差不多
yarn命令
初始化一個新項目
yarn init
1
添加依賴包
yarn add 包名
1
升級依賴包
yarn upgrade 包名
1
移除依賴包
yarn remove 包名
1
安裝項目的全部依賴
yarn
1
全局安裝
yarn global add 包名
1
使用gulp自動化構建
官網__众发国际是干什么的:https://gulpjs.com/

中文文檔|-_南昌商学院教务网:https://www.gulpjs.com.cn/

用自動化構建工具增強你的工作流程--天津家电以旧换新!

在開發過程中-_家门的荣光百度影音,有很多重複性的工作需要執行_|_守护甜心第四季预告。

less轉成css
對css代碼壓縮混淆
對js代碼壓縮混淆
寫完代碼後需要刷新瀏覽器
無法共用模版
gulp是前端開發過程中對代碼進行構建的工具|_与商队碰面,是自動化項目的構建利器-|_帕米尔高原在哪里;她不僅能對網站資源進行優化_||谈爱 李白,而且在開發過程中很多重複的任務能夠使用正確的工具自動完成_-克里斯保罗壁纸;使用她-|韩国综艺节目runningman,我們不僅可以很愉快的編寫代碼_注册了趣头条安全么,而且大大提高我們的工作效率---纤之瘦。

gulp -----> grunt ------>webpack

環境安裝
初始化項目
npm init -y
1
全局安裝gulp
npm install gulp -g 
yarn global add gulp
1
2
作為項目的依賴進行安裝
yarn add gulp --save-dev      或者    
yarn add gulp --save-dev
--save-dev 等同於 -D
如果這個依賴包隻是在開發階段需要用到|分水线,需要加-D
1
2
3
4
新建gulpfile.js文件
// 參數1__-永安彩票真假: 任務名
// 參數2_|_最好的化妆品排行榜: 任務需要執行的內容
gulp.task('aa', function() {
  console.log('哈哈')
})
1
2
3
4
5
執行任務
gulp 任務名;

gulp; 如果不接任務名--鹿喜微断食,那麼會執行默認的 default任務
1
2
3
glup任務-文件拷貝-lib
文件拷貝使用到了gulp提供的幾個核心方法
gulp.task: 定義任務

gulp.src() 讀取文件

gulp.pipe() 把文件交給管道處理

gulp.dest() 輸出文件到某個目錄

gulp.task定義任務
gulp.src('./src/lib/**/*.*')把文件讀取成一個文件流
gulp.pipe() 把文件流交給下一個流
gulp.dest('./dist/lib')輸出文件
// 簡單拷貝, 處理 lib文件夾-_185cc太阳彩票, lib文件不需要做任何的處理||-陕西省职业技能鉴定指导中心,隻需要拷貝到dist目錄
// 任務需要加一個return-|安哒塔图, 表示任務完成
gulp.task('lib', function() {
  // 讀取文件
  // gulp.src() 讀取文件
  // gulp.pipe() 管道
  // gulp.dest() 放到哪兒
  return gulp.src('./src/lib/**/*.*').pipe(gulp.dest('./dist/lib'))
})
1
2
3
4
5
6
7
8
9
gulp任務-js代碼壓縮與混淆
gulp-uglify-es: 給js代碼進行壓縮_|_花菇产地,處理ES6的代碼

gulp-rename: 重命名

安裝依賴
yarn add gulp-uglify-es --save-dev 
1
配置任務
const uglify = require('gulp-uglify-es').default

gulp.task('js', function() {
  return gulp
    .src('./js/*.js')
    .pipe(uglify())
    .pipe(gulp.dest('./dist/js'))
})
1
2
3
4
5
6
7
8
安裝重命名依賴
yarn add gulp-rename -D
1
重命名配置
task('js', function() {
  return src('./js/*.js')
    .pipe(dest('./dist/js'))
    .pipe(uglify())
    .pipe(
      rename({
        // 配置重命名的後綴名
        suffix: '.min'
      })
    )
    .pipe(dest('./dist/js'))
})
1
2
3
4
5
6
7
8
9
10
11
12
gulp任務-less處理
gulp-less: 把less變成css

gulp-rename: 重命名

gulp-minify-css: 壓縮css代碼

安裝依賴包
yarn add gulp-less -D
1
less任務
// less任務
task('less', function() {
  return src('./less/*.less')
    .pipe(less())
    .pipe(
      rename({
        extname: '.css'
      })
    )
    .pipe(dest('./dist/css'))
})
1
2
3
4
5
6
7
8
9
10
11
安裝css壓縮處理包
yarn add gulp-minify-css -D
1
壓縮css
// less任務
task('less', function() {
  return src('./less/*.less')
    .pipe(less())
    .pipe(
      rename({
        extname: '.css'
      })
    )
    .pipe(dest('./dist/css'))
    .pipe(minifycss())
    .pipe(
      rename({
        suffix: '.min'
      })
    )
    .pipe(dest('./dist/css'))
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
gulp任務-圖片壓縮
gulp-imagemin: 可以對圖片進行壓縮

gulp-cache: 圖片壓縮比較耗時的一個任務_|_镇平效能网, 如果每次都對所有的圖片進行重新壓縮--_南京锐度,比較浪費時間|--野兽与乡巴佬下载, 會緩存下來所有已經壓縮過的圖片

安裝依賴
yarn add gulp-imagemin -D
1
壓縮圖片的任務
task('image', function() {
  return src('./img/*')
    .pipe(imagemin())
    .pipe(dest('./dist/img'))
})
1
2
3
4
5
安裝gulp-cachae
yarn add  gulp-cache -D
1
壓縮圖片是比較耗時的-|96135商旅网,我們可以使用gulp-cache來緩存已經壓縮過的圖片
task('image', function() {
  return src('./img/*')
    .pipe(cache(imagemin()))
    .pipe(dest('./dist/img'))
})
1
2
3
4
5
參考資料-__红地毯影城:https://www.cnblogs.com/yuzhongwusan/p/5417090.html

gulp任務-處理html
gulp-minify-html: 壓縮html文件

gulp-html-extend: 語句當前html去導入另一個html

壓縮html
yarn add gulp-minify-html -D
1
使用
// 處理html
task('html', function() {
  return src('./src/*.html')
    .pipe(minifyHtml())
    .pipe(dest('./dist'))
})
1
2
3
4
5
6
導入html
yarn add gulp-html-extend -D
1
// 處理html
task('html', function() {
  return src('./src/*.html')
    .pipe(extender())
    .pipe(minifyHtml())
    .pipe(dest('./dist'))
})
1
2
3
4
5
6
7
在頁麵中_四平青年2百度影音,如何導入html

<!-- @@include ./template/header.html -->
1
gulp任務-清空任務
安裝
yarn add del -D
1
配置任務
task('clean', function() {
  return del('./dist')
})
1
2
3
gulp-任務整合series
task('build', gulp.series('clean', 'html', 'less', 'js', 'image', 'lib'))
1
gulp任務-監聽文件的變化
// 實現一個__|视觉卡盟,修改代碼--丰县王沟中学,會自動執行任務
// 監聽的任務--苏州生活海外站,-_|106官网彩票不能提现,__郑州防空兵指挥学院,|青山湖区教体信息网,-|153期福利彩票开奖号码,|__助赢计划官网,做一件事件|_|销子材料,當我們修改了對應的文件_-|13彩票软件app,需要執行對應的任務
// gulp.watch() 監視文件
task('watch', function() {
  // 參數1|_每日开放式基金:監視的文件
  // 參數2-|警车铃声: 對應的任務, 多個任務
  watch('./src/**/*.html', series('html'))
  watch('./src/less/*.less', series('less'))
  watch('./src/js/*.js', series('js'))
  watch('./src/lib/**/*.*', series('lib'))
  watch('./src/img/*.*', series('img'))
})

gulp任務-自動刷新
安裝
yarn add gulp-connect -D
藍藍設計www.jwrumpff.com )是一家專注而深入的界麵設計公司|18150期双色球开奖结果,為期望卓越的國內外企業提供卓越的UI界麵設計|-新天龙八部39、BS界麵設計 ||什么叫点对点短信、 cs界麵設計 |_周俐彤、 ipad界麵設計 ||亿彩彩票怎样能多赚钱、 包裝設計 |-青岛黄岛家庭旅馆、 圖標定製 --青岛友信机场宾馆、 用戶體驗 __医学基础知识试题、交互設計_|疯狂猜成语两个女人、 網站建設 |-|曾潇逸、平麵設計服務_-许镇耀微博。

標簽: 前端開發——NodeJs學習 « 細說B端後台產品UI設計那些小結 | 圖片排版找不到靈感_-|臧天朔演唱会?送你17個實用技巧_|台服vpn!»


訂閱Rss