新手學習nodejs總結-01

什么是nodejs

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

tips:nodejs不是一個框架,也不是一門編程語言。

nodejs的作用

  • nodejs一般用于服務器開發(fā)。解決和創(chuàng)建高性能的網(wǎng)絡應用程序,這里就不得不提到nodejs的幾個特點了。
    • 事件驅動
      • 簡單的來說就是有事情觸發(fā)在執(zhí)行,如果你學習過java,那么你或多或少會知道觀察者模式,nodejs就相當于觀察者模式。
        由于JavaScript是單線程的,利用事件輪詢、任務隊列的異步操作來執(zhí)行。生動的說就像有一個死循環(huán),當有事物觸發(fā)循環(huán)中的某個條件時,再執(zhí)行該條件對應的邏輯。
    • 非阻塞 IO(異步) 模型
      • 了解JavaScript就一定知道異步操作,回調函數(shù)這是JavaScript語言的一種特性。tips:es6 promise鏈式編程者的福音。
    • 單線程
      • 這個沒得說JavaScript本生就是單線程。
    • 跨平臺
      • 只要有node環(huán)境就能運行node程序了。
  • 命令行工具
  • 爬蟲
  • ......

nodejs的發(fā)展歷史

  • node之父是Ryan Dahl

    tips: 現(xiàn)在去搞go

    • 2009年,Ryan Dahl發(fā)布了最初的 Node 版本
    • 2010年,Ryan Dahl 全職負責 Node 的發(fā)展
    • 2011年,Node 在微軟的支持下發(fā)布了 Windows 版
    • 2012年,Ryan Dahl 將node轉交給了 Isaac Z.Schlueter
    • 2015年,Node 與 io.js 合并,Node 的版本從 0.12.7 升級到了 4.0.0
      • 合并后的 io.js 和 Node 在 Joyent 公司的維護下并行了兩個版本:
      • 一個是4.x.x 還是原來的 Node,這個版本是穩(wěn)定版
      • 一個是5.x.x,目前已經(jīng)更新到了 6.8.1,其實就是 io.js,最新特性版,不建議生產(chǎn)環(huán)境使用
      • Node 計劃在 2016 年 10月底正式發(fā)布 Node 7.0
    • 7.0 已經(jīng)最大限度的支持了很多的 ES6 新語法
    • 而且提高了整體的執(zhí)行性能,提供了一些別的API

    tips:要學就用最新版本

安裝node環(huán)境

下載地址為https://nodejs.org/en/download/

  • 下載后一直點下一步,下一步就能安裝成功
    • 安裝成功后打開命令行輸入node --version,能顯示相應的版本表示安裝成功。

這時候我們可以試試nodejs的作用,你可以直接在命令行輸入node,這就相當于一個編寫頁一樣,你可以試著寫console.log('hello'),回車控制臺輸出 hello。

  • 其實node不僅可以跟命令還可以接js文件執(zhí)行

    • 你可以將代碼寫到文件中,node hello.js也是同樣的效果,前提是你當前路徑必須包含此文件,不然報錯
  • common.js

    • nodejs是采用了commonJS規(guī)范的。
      • 為什么會有這個規(guī)范呢,因為JavaScript天生就不支持模塊化。還沒有塊級作用域。

    本java程序員表示非常不解。
    * 所以瀏覽器的JavaScript和node中的JavaScript不是一樣的。
    + nodejs的模塊化
    * nodejs中使用require關鍵字來加載模塊,使用exports來導出模塊。
    * nodejs中內置了一些核心模塊,我們可以使用fs這個讀寫文件的模塊來簡單了解nodejs。

//引入fs模塊
var fs = require('fs');

//假設我要讀取一個名字問hello.txt的文件
fs.readFile('./hello.txt',function (err, data) {
    //如果讀取失敗
    if (err) {
        console.log('讀取文件失??!');
        return;
    }

    console.log(data);
})

這是一個簡單的異步的讀取文件
其實fs模塊還有寫文件等功能,這里就不一一說明。

  • 我們可以了解到var fs = require('fs');可以引入一個核心模塊,它也可以引入一個第三方模塊,還可以引入自己寫的模塊。
    • 假設我有個模塊叫hello.js那么它就是這樣。
        //后綴的.js可以省略,也可以不省,隨你的性子來,但是99%人都省了所以....
        var hello = require('./hello');
    
    • 加載的時候會執(zhí)行hello.js內的所有代碼。但是如果hello.js中沒有exports的話那這個hello就是空的。
  • nodejs中的模塊導出。
    • 你可以這樣寫hello.js來返回內容
        exports.say = function () {
                console.log('hello');
            }
    
    
    • 那么調用這個模塊的人就可以這樣用
        var hello = require('./hello');
    
        hello.say();
    
    
    • 這是導出一個say,當然你也可以導出任何js支持的數(shù)據(jù)格式
    • 但是這不是單個成員的時候
        var num = 1;
    
        exports.num = num;
    
        exports.fun = function () {
            
        }
        //........
    

exports我們不導出單個成員時能這么寫,導出單個成員就不能這么寫了。

  • exports的導出原理
    • 其實可以這樣理解
    • 很簡單我相信你一看代碼就懂了
//相當于每個模塊最前方有這幾句代碼
var module = {
    exports:{}
}
// 模塊中同時還有一個成員 exports 等價于 module.exports
var exports = module.exports;
/**
 *  你寫的代碼其實都在這里,懂了嗎?
 *  其實實際返回的是module.exports。exports只是module.exports的簡寫。
 *  當exports=時引用地址變了,而module.exports的引用地址沒有改變。
 *  實際返回的是module.exports
 **/

return module.exports;

+ 所以要返回單個成員必須這樣
```javascript
    module.exports = xx;
```

ok,今天就寫到這。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Node.js是目前非?;馃岬募夹g,但是它的誕生經(jīng)歷卻很奇特。 眾所周知,在Netscape設計出JavaScri...
    w_zhuan閱讀 3,736評論 2 41
  • Node.js是目前非?;馃岬募夹g,但是它的誕生經(jīng)歷卻很奇特。 眾所周知,在Netscape設計出JavaScri...
    Myselfyan閱讀 4,203評論 2 58
  • 系列文章導航 模塊(二) es6 module typescript module 本文參考Javascript模...
    合肥黑閱讀 9,029評論 0 14
  • 作者:馬齡陽efe.baidu.com/blog/nodejs-module-analyze/ Node.js 的...
    grain先森閱讀 1,231評論 2 17
  • 世界觀不只是把分散、獨立,無關的信念湊在一起,而是一個緊密交織的信念體系。 每一片拼圖片片相接,和旁邊的吻合,旁邊...
    鷹如來閱讀 510評論 0 2

友情鏈接更多精彩內容