成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Node.js技術(shù)總結(jié)

SKYZACK / 2897人閱讀

摘要:使用了一個(gè)事件驅(qū)動(dòng)非阻塞式的模型,使其輕量又高效。依賴就近,延遲執(zhí)行。使用錯(cuò)誤處理中間件默認(rèn)情況下,給出的響應(yīng)是狀態(tài)碼,包含文本以及錯(cuò)誤自身詳細(xì)信息的響應(yīng)主體。

Node.js是什么

官網(wǎng)定義:

Node.js 是一個(gè)基于 Chrome V8 引擎的 JavaScript 運(yùn)行環(huán)境。  Node.js 使用了一個(gè)事件驅(qū)動(dòng)、非阻塞式I/O 的模型,使其輕量又高效。

非阻塞 I/O 模型(non-blocking I/O model),簡單點(diǎn)講就是每個(gè)函數(shù)都是異步的,最后由 Libuv 這個(gè) C/C++ 編寫的事件循環(huán)處理庫來處理這些 I/O 操作,隱藏了非阻塞 I/O 的具體細(xì)節(jié),簡化并發(fā)編程模型,讓你可以輕松的編寫高性能的Web應(yīng)用,所以它是輕量(lightweight)且高效(efficient)的。

Node.js能做什么

1)跨平臺(tái):覆蓋你能想到的面向用戶的所有平臺(tái),傳統(tǒng)的PC Web端,以及PC客戶端 nw.js/electron 、移動(dòng)端 cordova、HTML5、react-native、weex,硬件 ruff.io 等
2)Web應(yīng)用開發(fā):網(wǎng)站、Api、RPC服務(wù)等
3)前端:三大框架 React Vue Angular 輔助開發(fā),以及工程化演進(jìn)過程(使用Gulp /Webpack 構(gòu)建 Web 開發(fā)工具)
4)工具:npm上各種工具模塊,包括各種前端預(yù)編譯、構(gòu)建工具 Grunt / Gulp、腳手架,命令行工具,各種奇技淫巧等

Node核心:異步流程控制

其實(shí),一般使用是不需要掌握上圖中的所有技術(shù)的。對(duì)于初學(xué)者來說,先夠用,再去深究細(xì)節(jié)。所以,精簡一下,只了解3個(gè)就足夠足夠用了。

Promise 的最大優(yōu)勢是標(biāo)準(zhǔn)化,各類異步工具庫都按照統(tǒng)一規(guī)范實(shí)現(xiàn),即使是async函數(shù)也可以無縫集成。所以用 Promise 封裝 API 通用性強(qiáng),用起來簡單,學(xué)習(xí)成本低。在async函數(shù)普及之前,絕大部分應(yīng)用都是采用Promise來做異步流程控制的,所以掌握Promise是Node.js學(xué)習(xí)過程中必須要掌握的重中之重。

推薦學(xué)習(xí)資料
Node.js最新技術(shù)棧之Promise篇 https://cnodejs.org/topic/560...
理解 Promise 的工作原理 https://cnodejs.org/topic/569...
Promise 迷你書 http://liubin.github.io/promi...

異步和事件觸發(fā):瀏覽器

瀏覽器中非阻塞I/O的例子

異步和事件觸發(fā):服務(wù)器

Node中的非阻塞I/O示例

Node基于libuv實(shí)現(xiàn)跨平臺(tái)的架構(gòu)示意圖

Commonjs, AMD, CMD規(guī)范

CommonJS

通過 require 來加載模塊。

通過 exports 和 modul.exports 來暴露模塊中的內(nèi)容。

// moduleA.js
module.exports = function( value ){
return value * 2;

// moduleB.js
var multiplyBy2 = require("./moduleA");
var result = multiplyBy2(4);

CommonJS是同步加載模塊,服務(wù)器端的Node.js遵循CommonJS規(guī)范。

require("module");
require("../file.js");
exports.doStuff = function() {};
module.exports = someValue;

AMD
AMD是"Asynchronous Module Definition"的縮寫,意思就是"異步模塊定義"。AMD規(guī)范其實(shí)只有一個(gè)主要接口 define(id,dependencies,factory),它要在聲明模塊的時(shí)候指定所有的依賴dependencies,并且還要當(dāng)做形參傳到factory中,對(duì)于依賴的模塊提前執(zhí)行,依賴前置。

define("module", ["dep1", "dep2"], function(d1, d2) {
  return someExportedValue;
});
require(["module", "../file"], function(module, file) { /* ... */ });

CMD
CMD規(guī)范和AMD相似,盡量保持簡單,并且與CommonJS和NodeJS的Modules規(guī)范保持了很大的兼容性。依賴就近,延遲執(zhí)行。

define(function(require, exports, module) {
  var $ = require("jquery");
  var Spinning = require("./spinning");
  exports.doSomething = ...
  module.exports = ...
})
Node查找模塊的步驟

中間件

中間件組件是一個(gè)JavaScript函數(shù),按慣例會(huì)接受三個(gè)參數(shù):一個(gè)請求對(duì)象, 一個(gè)響應(yīng)對(duì)象,還有一個(gè)通常命名為next的參數(shù),它是一個(gè)回調(diào)函數(shù),表明這個(gè)組件已經(jīng)完成了它的工作,可以執(zhí)行下一個(gè)中間件組件了。

Connect
最小的Connect程序

var connect = require("connect");
var app = connect();
app.listen(3000);

日志中間件

var connect = require("connect");

function logger(req, res, next) {
  console.log("%s %s", req.method, req.url);
  next();
}

function hello(req, res) {
  res.setHeader("Content-Type", "text/plain");
  res.end("hello world");
}

connect()
  .use(logger)
  .use(hello)
  .listen(3000);
  

中間件的順序很重要

用中間件的順序執(zhí)行認(rèn)證

var connect = require("connect");
connect()
  .use(logger)
  .use(restrictFileAccess)
  .use(serveStaticFiles)
  .use(hello)
  .listen(3000);

掛載中間件和服務(wù)器

路由admin請求

function admin(req, res, next) {
  switch (req.url) {
    case "/":
      res.end("try /users");
      break;
    case "/users":
      res.setHeader("Content-Type", "application/json");
      res.end(JSON.stringify(["tobi", "loki", "jane"]));
      break;
  }  
}

掛載中間件或服務(wù)器

var connect = require("connect");
connect()
  .use(logger)
  .use("/admin", restrict)
  .use("/admin", admin)
  .use(hello)
  .listen(3000);

創(chuàng)建可配置中間件

function setup(options) {
  //  設(shè)置邏輯
  
  return function(req, res, next) {
    // 中間件邏輯
  }
}

app.use(setup({some: "options"}));

創(chuàng)建可配置的logger中間件組件

var app = connect()
  .use(logger(":method :url"))
  .use(hello);

構(gòu)建路由中間件組件

var connect = require("connect");
var router = require("./middleware/router");
var routes = {
  GET: {
    "/users": function(req, res) {
      res.end("tobi, loki, ferret");
    },
    "/user/:id": function(req, res, id) {
      res.end("user " + id);  
    }
  },
  DELETE: {
    "/user/:id": function(req, res, id) {
       res.end("deleted user " + id);
     }
  }
};

connect()
  .use(router(routes))
  .listen(3000);

因?yàn)槌绦蚶镏虚g件的數(shù)量沒有限制,中間件組件使用的次數(shù)也沒有限制,所以在一個(gè)程序中 有可能會(huì)定義幾個(gè)路由器。

var connect = require("connect");
var router = require("./middleware/router");

connect()
  .use(router(require("./routes/user")))
  .use(router(require("./routes/admin")))
  .listen(3000);

使用錯(cuò)誤處理中間件

var connect = require("connect")

connect()
  .use(function hello(req, res) {
    foo();
    res.setHeader("Content-Type", "text/plain");
    res.end("hello world");
  })
  .listen(3000);

默認(rèn)情況下,Connect給出的響應(yīng)是狀態(tài)碼500,包含文本“Internal Server Error”以及錯(cuò)誤自 身詳細(xì)信息的響應(yīng)主體。

function errorHandler() {
  var env = process.env.NODE_ENV || "development";
  return function(err, req, res, next) {
    res.statusCode = 500;
    switch (env) {
      case "development":
        res.setHeader("Content-Type", "application/json");
        res.end(JSON.stringify(err));
        break;
      default:
        res.end("Server error);
    }
  }
}

Connect自帶的中間件

cookieParser(): 解析HTTP cookie

bodyParser(): 解析請求主體

limit(): 請求主體的限制

query(): 查詢字符串解析

logger(): 記錄請求

session(): 會(huì)話管理

static(): 靜態(tài)文件服務(wù)

數(shù)據(jù)存儲(chǔ)
內(nèi)存, redis, mysql, mongodb, mongoose

express

渲染視圖
處理表單和文件上傳

koa egg 部署

阿里云,騰訊云,域名,pm2,nginx,集群,分布式,docker,微服務(wù)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/98781.html

相關(guān)文章

  • 前端每周清單年度總結(jié)與盤點(diǎn)

    摘要:前端每周清單年度總結(jié)與盤點(diǎn)在過去的八個(gè)月中,我?guī)缀踔蛔隽藘杉拢ぷ髋c整理前端每周清單。本文末尾我會(huì)附上清單線索來源與目前共期清單的地址,感謝每一位閱讀鼓勵(lì)過的朋友,希望你們能夠繼續(xù)支持未來的每周清單。 showImg(https://segmentfault.com/img/remote/1460000010890043); 前端每周清單年度總結(jié)與盤點(diǎn) 在過去的八個(gè)月中,我?guī)缀踔蛔隽?..

    jackwang 評(píng)論0 收藏0
  • 一些基于React、Vue、Node.js、MongoDB技術(shù)棧的實(shí)踐項(xiàng)目

    摘要:利用中間件實(shí)現(xiàn)異步請求,實(shí)現(xiàn)兩個(gè)用戶角色實(shí)時(shí)通信。目前還未深入了解的一些概念。往后會(huì)寫更多的前后臺(tái)聯(lián)通的項(xiàng)目。刪除分組會(huì)連同組內(nèi)的所有圖片一起刪除。算是對(duì)自己上次用寫后臺(tái)的一個(gè)強(qiáng)化,項(xiàng)目文章在這里。后來一直沒動(dòng),前些日子才把后續(xù)的完善。 歡迎訪問我的個(gè)人網(wǎng)站:http://www.neroht.com/? 剛學(xué)vue和react時(shí),利用業(yè)余時(shí)間寫的關(guān)于這兩個(gè)框架的訓(xùn)練,都相對(duì)簡單,有的...

    tangr206 評(píng)論0 收藏0
  • 第八期杭州NodeParty x Rokid技術(shù)分享會(huì)回顧

    摘要:月號(hào),杭州和聯(lián)合主辦的第八期技術(shù)分享會(huì),在公司如期舉行。張偉林,宋小菜資深前端開發(fā)工程師,年,霹靂迷,已手殘的紙牌魔術(shù)師,喜歡神奇的東西,技術(shù)棧從上向下不斷橫向縱向貫穿,目前在尋找前后端大一統(tǒng)思想的路上越走越偏。 showImg(https://segmentfault.com/img/bVbkWN4?w=3000&h=1686); 12 月 9 號(hào),杭州 NodeParty 和 Ro...

    gself 評(píng)論0 收藏0
  • node技術(shù)棧 - 收藏集 - 掘金

    摘要:異步最佳實(shí)踐避免回調(diào)地獄前端掘金本文涵蓋了處理異步操作的一些工具和技術(shù)和異步函數(shù)。 Nodejs 連接各種數(shù)據(jù)庫集合例子 - 后端 - 掘金Cassandra Module: cassandra-driver Installation ... 編寫 Node.js Rest API 的 10 個(gè)最佳實(shí)踐 - 前端 - 掘金全文共 6953 字,讀完需 8 分鐘,速讀需 2 分鐘。翻譯自...

    王偉廷 評(píng)論0 收藏0
  • 前端最實(shí)用書簽(持續(xù)更新)

    摘要:前言一直混跡社區(qū)突然發(fā)現(xiàn)自己收藏了不少好文但是管理起來有點(diǎn)混亂所以將前端主流技術(shù)做了一個(gè)書簽整理不求最多最全但求最實(shí)用。 前言 一直混跡社區(qū),突然發(fā)現(xiàn)自己收藏了不少好文但是管理起來有點(diǎn)混亂; 所以將前端主流技術(shù)做了一個(gè)書簽整理,不求最多最全,但求最實(shí)用。 書簽源碼 書簽導(dǎo)入瀏覽器效果截圖showImg(https://segmentfault.com/img/bVbg41b?w=107...

    sshe 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<