node基礎(2)

 

NODE

是一個以webkit(V8)引擎來渲染和解析JS的平臺javascript

  • 在沒有NODE以前,JS是一門基於客戶端瀏覽器運行的腳本編程語言;JS是前端編程語言;
  • 在有了NODE以後,JS也能夠運行在NODE環境中了,咱們能夠把NODE安裝在服務器端,這樣咱們就能夠在服務器端執行JS,JS也能夠處理服務器端的業務邏輯了;JS是後臺編程語言;

JS是全棧編程語言html

JS運行在瀏覽器中,瀏覽器提供了不少內置的屬性和方法(window全局對象);JS若是運行在NODE環境下,它也提供了不少的屬性和方法(global全局對象);前端

如何在NODE環境下執行JS
  • 在WB的指定JS文件中,經過鼠標右鍵 Run xxx.js 來運行JS代碼(這樣是把JS在NODE環境中執行了);這種方式有些時候會出現緩存,尤爲是把執行的文件換目錄後,緩存出現的概率特別大。
  • 找到當前須要執行的JS所在文件目錄,在這個目錄中打開DOS窗口,在窗口中輸入 node xxx.js 的命令把對應JS執行;
傳統後臺語言和NODE的對比

傳統後臺語言:JAVA、PHP、C#、.NET… 
NODE做爲後臺運行的環境,拿JS編程的優點:
java

  • 快:基於V8引擎渲染
  • 無阻塞的I/O操做(異步對文件進行增刪改查)
  • 基於事件驅動的單線程異步編程

NODE中的模塊

node把全部的js按照模塊進行劃分,分爲:node

  • 內置模塊:node平臺天生提供的模塊
  • 自定義模塊:本身寫的模塊
  • 第三方模塊:別人寫的咱們調取使用
第三方模塊

一、下載安裝第三方模塊web

全部的第三方模塊都在npmjs.com上 
在命令窗口中執行 「npm install 模塊名」 來安裝,把須要使用的第三方模塊安裝到項目目錄下 
npm就是NODE中用來管理模塊的命令,npm install 是安裝,npm uninstall 是卸載…
npm

二、導入編程

require 
例如:var less = require(‘less’);
瀏覽器

三、使用緩存

less.render()

四、若是咱們想把LESS等第三方模塊添加到命令行中,咱們須要把LESS安裝在全局NODE環境下;

npm install less -g 
安裝成功後執行 lessc -v ,能夠查看到版本號

自定義模塊

在NODE環境下,咱們建立的每個JS均可以理解爲一個單獨的模塊,模塊和模塊之間沒有衝突。咱們常常須要實現模塊和模塊之間的相互調用(例如B調取A中的fn方法):

  • 首先在B模塊中導入A模塊:var A=require(‘./A’); 即便在同一級目錄下,咱們也須要加./,若是不加的話默認找的是node_modules下的模塊,而不是咱們自定義的模塊
  • 其次還須要在A模塊中把供外面使用的方法暴露出來:module.exports={fn:fn};
  • 最後在B模塊中就能夠經過使用:A.fn() 執行對應的方法了
//A.js
function fn() {
    console.log(1);
}

module.exports = {
    fn: fn
};
//B.js
function fn() {
    console.log(2);
}

var A = require('./A');
A.fn();

 

 

思考題:建立三個自定義模塊,A/B/C,A模塊中有一個方法」任意數求和sum」,B模塊中有一個方法「求平均數avg」,在B中須要調取A中的sum方法,在C模塊中點去B模塊中的avg方法,實現獲取:98 95 92 96 95 94 92 98 93 90 這十個分數的平均數… 

//A.js
function sum() {
    var total = null;
    arguments.__proto__ = Array.prototype;
    arguments.forEach(function (item, index) {
        item = Number(item);
        !isNaN(item) ? total += item : null;
    });
    return total;
}
module.exports = {
    sum: sum
};
//B.js
var a = require('./A');
function avg() {
    arguments.__proto__ = Array.prototype;
    arguments.sort(function (cur, next) {
        return cur - next;
    });
    arguments.pop();
    arguments.shift();
    //a.sum(arguments) -> a.sum([98,95,96...]) 目標:a.sum(98,95,96...)
    return (a.sum.apply(null, arguments) / arguments.length).toFixed(2);
}
module.exports = {
    avg: avg
};
//C.js
var b = require('./B');
console.log(b.avg(98, 95, 92, 96, 95, 94, 92, 98, 93, 90));

 

 

內置模塊

node天生提供好的模塊,node主要應用於服務器端開發,理解服務器端須要作的事情,咱們也就理解node內置模塊了。

服務器端須要作的事情

  • 建立服務,監聽端口號
  • 接收和解析客戶端的請求
  • 在服務器上把客戶端須要的內容找到(文件內容的讀取)
  • 把找到的內容返回

經常使用的內置模塊:http、url、fs…

一、http 
建立服務、監聽端口、接收信息、返回內容…

var server1=http.createServer([callback]); 建立一個服務,這塊的回調函數不是在服務建立成功就會執行,而是須要客戶端向當前的服務器發送請求,它纔會執行(客戶端只要發送一個請求,它就會被觸發一次執行)。

server1.listen([port],[callback]); 給建立的服務監聽端口號(0-65535之間),端口號不能重複,當服務建立成功端口號也監聽成功後就會執行對應的回調函數;

啓動服務後,服務在不出現意外或者錯誤的狀況下是不會中止的,隨時監聽客戶端的請求,完成咱們的響應操做。

二、服務建立成功後如何的向當前服務發送請求

三、url模塊

var url=require(‘url’); 
url.parse([string],[boolean]) : 解析一個URL地址,能夠把地址中的每一部分分別獲取到

  • [string] 要解析的URL地址字符串
  • [boolean] 設定是否把問號傳參的值解析爲對象,默認是false不解析,寫true則爲解析

案例:

var url = require('url');
var str = 'http://www.zhufengpeixun.com:80/student/index.html?name=zxt&age=30#haha';
var result = url.parse(str);
console.log(result);

//->結果以下
{
  protocol: 'http:',   //->協議
  slashes: true, //->是否有斜線
  auth: null, //->做者
  host: 'www.zhufengpeixun.com:80', //->域名+端口
  port: '80', //->端口
  hostname: 'www.zhufengpeixun.com', //->域名
  hash: '#haha', //->哈希值
  search: '?name=zxt&age=30', //->問號傳參
  query: 'name=zxt&age=30', //->問號傳參,不帶問號
  pathname: '/student/index.html', //->路徑名稱
  path: '/student/index.html?name=zxt&age=30', //->路徑名稱+問號傳參
  href: 'http://www.zhufengpeixun.com:80/student/index.html?name=zxt&age=30#haha' //->原始字符串
}
//若是第二個參數設爲true的話:
{
  ...
  query: { name: 'zxt', age: '30' },
  pathname: '/student/index.html'
  ...
}
//->query是以對象鍵值對的方式存儲的

 

四、fs模塊 
實現對服務器上的文件進行I/O操做的

var fs=require(‘fs’);

  • fs.readFileSync 同步讀取文件中的內容 
    var con=fs.readFileSync(‘./index.html’); 
    第一個參數是讀取文件的路徑地址 
    第二個參數是讀取文件內容的編碼格式 
    讀取出來的內容是字符串格式的
  • fs.readFile 異步讀取文件中的內容 
    fs.readFile(‘./index.html’,function(){ 
    讀取成功後觸發會發回調函數執行 
    });

除了讀取內容之外還能夠向文件中寫入內容

fs.writeFileSync([pathname],[content],[encode])

  • 第一個參數是路徑名稱
  • 第二個參數是須要寫入的內容(注意只能是字符串或者buffer格式的數據)
  • 第三個參數是編碼格式,通常經常使用’utf-8’
相關文章
相關標籤/搜索