初學Node(三)模塊系統

来源:http://www.cnblogs.com/shinhwazt/archive/2016/11/15/6063964.html
-Advertisement-
Play Games

模塊系統 Node根據CommonJS規範實現了一套自己的模塊機制,可以使用require()導入一個模塊,使用module.exports導出一個模塊。 require使用 在Node中我們可以使用require()導入一個模塊,此時我們就會獲得一個被導入模塊的對象,我們就可以利用這個對象來完成一 ...


模塊系統

  Node根據CommonJS規範實現了一套自己的模塊機制,可以使用require()導入一個模塊,使用module.exports導出一個模塊。

require使用

  在Node中我們可以使用require()導入一個模塊,此時我們就會獲得一個被導入模塊的對象,我們就可以利用這個對象來完成一些操作,例如:

var fs = require("fs");
fs.readFile("content.txt",function(err,data){
    if(err){
        return console.log("讀取文件錯誤!");
    }
    console.log(data.toString());
})

  我們通過require()將fs模塊導入,此時我們就通過獲得的fs模塊的對象來實現對文件的操作。

  在Node中模塊分為核心模塊和文件模塊,核心模塊即被被編譯成二進位代碼的模塊,是Node自帶的一些模塊。文件模塊即我們自己編寫的模塊,無論哪種模塊都可以通過require()函數來引入。

  require()的參數有四種不同的形式,分別為:

  核心模塊:require("fs")

  相對文件路徑:require("../xxx")

  絕對文件路徑:require("/xxx")

  非核心模塊的文件模塊:require("xxx")

  載入模塊的過程如下圖所示:

require按照路徑載入模塊

  例如我們通過require("X")載入一個模塊,首先會去文件模塊緩存區中查找有沒有該模塊的緩存,如果緩存區中存在該模塊,則直接返回。如果不存在該模塊就會判斷X的類型,如果是載入一個原生模塊,就會按原生模塊緩存區,原生模塊這樣的順序去查找該模塊,如果在原生模塊緩存區中找到就會直接返回模塊對象,如果在原生模塊中找到就會在原生模塊緩存區中加入該模塊以方便下一次的使用,然後返回模塊。

  如果X是一個路徑類型首先把X當做文件按照X、X.js、X.json、X.node來查找該模塊,找到之後加入到文件模塊緩存區中然後返回該模塊。如果沒有找到,則把X當做是一個目錄,在X裡面按照index.js、index.json、index.node的順序依次查找,如果目錄中存在package.json則優先載入main屬性對應的文件,在找到之後將模塊加入到文件模塊緩存區中然後返回該模塊。

  我們在桌面上新建兩個文件夾,分別為first和second,在first中新建first.js文件,first.js內容如下:

var name = "zt"
module.exports.show = function(){
    console.log(name);
}

  在sencond中新建main.js文件,main.js文件內容如下:

var first = require("../first");
first.show();

  在命令行中進入sencond文件node main.js執行,會報Error,不能找到first。我們按照上面的過程來排除錯誤,第一次載入文件緩存區中沒有,也不是原生模塊,此時就會按照路徑的方式來載入first模塊,首先把它當成一個文件,即在桌面中按照first、first.js、first.json、first.node的順序來查找,都不存在,然後把first看錯一個目錄,然後在first文件內去查找,首先查看有沒有package.json文件,存在就會載入main屬性對應的文件,不存在就按照index.js、index.json、index.node的順序來查找,仍然找不到最終就會報錯。

  按照上面的流程我們可以通過三種方式來修改:

  1:在桌面上新建一個first.js,這時當按照文件來查找時就可以找到first.js,然後載入模塊。

  2:在first文件夾中將first.js改名為index.js,這樣在按照文件不能查找到,按照目錄查找時就可以找到index.js,然後載入模塊。

  3:在first文件夾中初始化一個package.json文件,main屬性值為first.js,這樣在按照目錄查找時在目錄中存在package.json文件就會載入main屬性對應的文件。

require按照模塊去查找

  例如在second的main.js中通過require("first")這種方式來載入first模塊,使用這種方式來載入模塊優先在當前文件夾(second文件夾)中查找node_modules文件夾,在node_modules文件夾中去查找first模塊(在node_modules文件夾中也是按照路徑的那個套路來查找),然後在sencond的父級下的node_modules文件下去查找first模塊,按照這種方式一直查找下去,我們可以通過module.paths來查看查找的路徑:

console.log(module.paths);

  在sencond文件夾中新建node_modules文件夾,然後把first文件夾放入到node_modules文件夾中,這樣main.js中的require("first")就可以找到first模塊了。

module.exports導出模塊

  可以在一個文件中使用module.exports導出一個模塊,這樣在require()時就可以使用導出的屬性或者方法。以上面的first.js為例我們在first.js中使用module.exports導出了show方法,這樣我們在使用require()之後獲取到的對象就可以使用show方法了。

  Node對module.exports的使用做了一些簡化處理讓我們在導出時可以使用exports:

module.exports = exports = {};

  module.exports和exports共用一個引用,這樣就可以通過exports來收集屬性:

var name = "zt"
exports.show = function(){
    console.log(name);
}

  通過module.exports = exports = {},這樣在使用require()函數時獲得的module.exports對象也就有了exports收集的屬性。

  如果module.exports重新賦值module.exports和exports的引用關係也就斷開了,而require()函數返回的是module.exports對象,也就不能得到exports收集的屬性了,所以在使用時不要混用。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、篩選沒有選中的覆選框:not("input:checked") 二、匹配有VARCHAR的字元串:".*VARCHAR.*?" 三、json取值的兩種方法 一個對象,有兩種取裡面值的方法,拿裡面的KEY做例子 第一種:data.KEY 第二種:data['KEY'] 相信我,瞭解這兩種方法絕對比 ...
  • 1. 可以說幾乎每個做過Web開發的人都問過,到底元素的ID和Name有什麼區別阿?為什麼有了ID還要有Name呢?! 而同樣我們也可以得到最classical的答案:ID就像是一個人的身份證號碼,而Name就像是他的名字,ID顯然是唯一的,而Name是可以重覆的。 上周我也遇到了ID和Name的問 ...
  • 這是一個令人激動的革新。 CSS 變數,顧名思義,也就是由網頁的作者或用戶定義的實體,用來指定文檔中的特定變數。 更準確的說法,應該稱之為 CSS 自定義屬性 ,不過下文為了好理解都稱之為 CSS 變數。 一直以來我們都知道,CSS 中是沒有變數而言的,要使用 CSS 變數,只能藉助 SASS 或者 ...
  • 方法一: 方法二:正則法 ...
  • webix的表格,頭部沒有tooltip的屬性支持 onmousemove只監聽了數據部分,對列頭沒有監聽。官網上演示的是在header屬性上寫個span 加個title的屬性,但是樣式不好看。然後我就直接參照寫了個。用的是監聽載入完成後的事件。用於載入後確定列的情況。 1、效果如下 代碼如下,拷貝 ...
  • 前言 作為一名前端開發人員,如果你告訴我你沒有看過任何關於前端的書籍,那麼我完全可以認為你不是一名合格的前端開發工程師。為什麼我要以“看書”來衡量合格前端的標準?因為前端作為一個特殊的極具變化與開拓性的工種,沒有較強的自我學習與思考能力,很難在這激烈又紛雜的環境里存活而不被淘汰,而“看書”則是最基本 ...
  • 基本演示 背景演示 迴圈演示 回調函數演示 綁定菜單演示 項目導航演示 自動滾動 slide自動滾動 響應式 下載地址 實例代碼 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <title>fullPage.js ...
  • 現在很多類似以微博發佈動態的效果,下麵為一個用 JavaScript寫的小小的類似微博發佈信息的案例 佈局出來的樣式,點擊藍色的刪除鏈接,會刪除對應的那一行內容 陌陌說:重要知識點:獲取輸入框的數值,創建子節點和給子節點添加內容,刪除對應的節點 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...