欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Nodejs極簡入門教程(一):模塊機(jī)制

 更新時(shí)間:2014年10月25日 16:35:38   投稿:junjie  
這篇文章主要介紹了Nodejs極簡入門教程(一):模塊機(jī)制,本文講解了模塊基礎(chǔ)知識、模塊的加載、包等內(nèi)容,需要的朋友可以參考下

JavaScript 規(guī)范(ECMAScript)沒有定義一套完善的能適用于大多數(shù)程序的標(biāo)準(zhǔn)庫。CommonJS 提供了一套 JavaScript 標(biāo)準(zhǔn)庫規(guī)范。Node 實(shí)現(xiàn)了 CommonJS 規(guī)范。

模塊基礎(chǔ)

在 Node 中,模塊和文件是一一對應(yīng)的。我們定義一個(gè)模塊:

復(fù)制代碼 代碼如下:

// circle.js
var PI = Math.PI;
 
// 導(dǎo)出函數(shù) area
exports.area = function(r) {
    return PI * r * r;
}
 
// 導(dǎo)出函數(shù) circumference
exports.circumference = function(r) {
    return 2 * PI * r;
};

這里將需要導(dǎo)出的函數(shù)加入到 exports 對象。模塊的局部變量外部無法訪問(例如,上例中的 PI 變量)。調(diào)用 require 載入模塊 circle.js:
復(fù)制代碼 代碼如下:

var circle = require('./circle.js');
console.log('The area of a circle of radius 4 is '
           + circle.area(4));

附帶提及一下的是,模塊中,存在一個(gè) module 對象,表示模塊本身,exports 則為 module 的屬性。

模塊的加載

Node 會對加載過的模塊進(jìn)行緩沖,避免再次加載的開銷:

復(fù)制代碼 代碼如下:

// test.js
console.log("I'm here");

多次加載模塊 test.js

復(fù)制代碼 代碼如下:

// 僅僅輸出一次 "I'm here"
require('./test');
require('./test');

當(dāng)加載文件沒有后綴時(shí),Node 會嘗試添加后綴并加載:

1..js(JavaScript 源文件)
2..node(C/C++ 擴(kuò)展模塊)
3..json(JSON 文件)

模塊主要有幾類:

1.核心模塊。核心模塊已經(jīng)被編譯到了 Node 中,我們在其源碼中的 lib 目錄可以找到這些核心模塊。常見的核心模塊:net、http、fs 模塊等

2.文件模塊。文件模塊通過一個(gè)相對或者絕對路徑加載,例如我們上面看到的 circle.js

3.自定義模塊。自定義模塊位于 node_modules 目錄中,我們通過 npm 安裝的各種模塊就放置在 node_modules 目錄中

核心模塊總是優(yōu)先被加載,假如有一個(gè)自定義模塊 http,那么加載時(shí)仍然會加載核心模塊 http 而非自定義模塊 http。在加載自定義模塊時(shí),首先查找當(dāng)前目錄下的 node_modules 目錄,而后查找父目錄下的 node_modules 目錄,以此類推,直到根目錄。

require 加載的模塊不是一個(gè)文件,而是一個(gè)目錄時(shí),這樣的目錄被叫做包(package)。包中存在一個(gè)名為 package.json 的文件(包描述文件),例如:

復(fù)制代碼 代碼如下:

{ "name" : "some-library",
  "main" : "./lib/some-library.js" }

其中 main 指出需要被加載的模塊。如果包中不存在 package.json 或者 package.json 中未指定 main 模塊,那么 Node 將會嘗試加載 index.js、index.node、index.json。

在加載 JavaScript 模塊時(shí),被加載的模塊被包裹在一個(gè)函數(shù)中:

復(fù)制代碼 代碼如下:

function(module, exports, __filename, __dirname, ...) {
    JavaScript module
}

每個(gè) JavaScript 模塊訪問到的 module、exports、__filename、__dirname 等實(shí)際上是通過函數(shù)參數(shù)傳遞進(jìn)來的。由于這種包裹,才使得模塊的局部變量外部無法訪問。但有時(shí)候也會出現(xiàn)讓人難以理解的問題,例如:

test1.js

復(fù)制代碼 代碼如下:

exports = {
    name: 'Name5566',
}

test2.js

復(fù)制代碼 代碼如下:

module.exports = {
    name: 'Name5566',
}

加載這兩個(gè)模塊:

復(fù)制代碼 代碼如下:

var test1 = require('./test1.js');
console.log(test1.name); // undefined
var test2 = require('./test2.js');
console.log(test2.name); // Name5566

exports 作為參數(shù)傳遞給模塊,我們通過 exports.x 自然可以給 exports 對象添加屬性(或方法),但直接給 exports 賦值(例如,exports = x)僅僅是改變了形參而非實(shí)參的值,因此:

1.為 exports 添加屬性時(shí),使用 exports
2.為 exports 賦值時(shí),使用 module.exports

按 CommonJS 的規(guī)范,一個(gè)完整的包應(yīng)該包含有:

1.package.json 包描述文件
2.bin 二進(jìn)制文件目錄
3.lib JavaScript 代碼目錄
4.doc 文檔目錄
5.test 測試代碼目錄

NPM 是一個(gè) Node 的一個(gè)包管理工具。常見用法:

查看命令的文檔:

復(fù)制代碼 代碼如下:

npm help install

查看命令 install 的文檔。

安裝一個(gè)包:

復(fù)制代碼 代碼如下:

npm install redis

安裝 redis 這個(gè)包。install 命令會將包安裝在當(dāng)前目錄下的 node_modules 目錄中。

移除一個(gè)包:

復(fù)制代碼 代碼如下:

npm remove redis

移除 redis 這個(gè)包。remove 命令會將當(dāng)前目錄下的包移除掉。

相關(guān)文章

  • node.js中的fs.stat方法使用說明

    node.js中的fs.stat方法使用說明

    這篇文章主要介紹了node.js中的fs.stat方法使用說明,本文介紹了fs.stat的方法說明、語法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Node.js全局對象Global的實(shí)現(xiàn)

    Node.js全局對象Global的實(shí)現(xiàn)

    在Nodejs下全局變量和全局函數(shù)都是可以使用global來訪問到的,本文主要介紹了Node.js全局對象Global的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • 詳解nodeJS之二進(jìn)制buffer對象

    詳解nodeJS之二進(jìn)制buffer對象

    本篇文章主要介紹了nodeJS之二進(jìn)制buffer對象,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • 一次NodeJS內(nèi)存泄漏排查的實(shí)戰(zhàn)記錄

    一次NodeJS內(nèi)存泄漏排查的實(shí)戰(zhàn)記錄

    這篇文章主要給大家介紹了一次NodeJS內(nèi)存泄漏排查的實(shí)戰(zhàn)記錄,文中給出了詳細(xì)的排查過程以及內(nèi)存泄漏的解決方法,大家可以學(xué)習(xí)一下以備不時(shí)之需,需要的朋友可以參考下
    2022-03-03
  • Node.js實(shí)現(xiàn)斷點(diǎn)續(xù)傳

    Node.js實(shí)現(xiàn)斷點(diǎn)續(xù)傳

    上傳圖片、Excel等,畢竟幾M的大小可以很快就上傳到服務(wù)器。 針對于上傳視頻等大文件幾百M(fèi)或者幾G的大小,就需要等待比較長的時(shí)間。這就產(chǎn)生了對應(yīng)的解決方法,對于大文件上傳時(shí)的暫停、斷網(wǎng)、網(wǎng)絡(luò)較差的情況下, 使用切片+斷點(diǎn)續(xù)傳就能夠很好的應(yīng)對上述的情況
    2021-06-06
  • Node.js 實(shí)現(xiàn)簡單的接口服務(wù)器的實(shí)例代碼

    Node.js 實(shí)現(xiàn)簡單的接口服務(wù)器的實(shí)例代碼

    這篇文章主要介紹了Node.js 實(shí)現(xiàn)簡單的接口服務(wù)器的實(shí)例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-05-05
  • Node.js 如何利用異步提升任務(wù)處理速度

    Node.js 如何利用異步提升任務(wù)處理速度

    這篇文章主要介紹了Node.js 如何利用異步提升任務(wù)處理速度,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • 用nodejs搭建websocket服務(wù)器

    用nodejs搭建websocket服務(wù)器

    這篇文章主要介紹了用nodejs搭建websocket服務(wù)器,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • Node端異常捕獲的實(shí)現(xiàn)方法

    Node端異常捕獲的實(shí)現(xiàn)方法

    本文主要介紹了Node端異常捕獲的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • NPM命令運(yùn)行報(bào)錯(cuò):npm?v10.2.4?is?known?not?to?run?on?Node.js?v14.21.1解決辦法

    NPM命令運(yùn)行報(bào)錯(cuò):npm?v10.2.4?is?known?not?to?run?on?Node.js

    這篇文章主要給大家介紹了關(guān)于NPM命令運(yùn)行報(bào)錯(cuò):npm?v10.2.4?is?known?not?to?run?on?Node.js?v14.21.1的解決辦法,文中將解決辦法介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01

最新評論