Node.js_基礎知識(CommonJS模塊化)

CommonJS模塊化規范

  1. 加載時機:
    • 服務器端: 模塊的加載是運行時同步加載的,node.js實現了模塊化規范
    • 瀏覽器端: 模塊需要提前編譯打包處理,需使用Browserify編譯打包,推薦使用ESM
  2. 暴露模塊:module.exports、exports
  3. 導入模塊:require

模塊導出

  1. module.exports = 任意數據 (字符串、整數、布爾值、對象)
  2. exports.模塊名 = 任意數據 (字符串、整數、布爾值、對象),相當于exports={模塊名: 任意數據}
  3. module.exports 與 exports 的關系:
    • 在模塊內部存在一種隱式關系:exports = module.exports = {}
    • 模塊最終取的是module.exports的值
    • exports只能是引用類型數據,不能使用exports = 基本類型的數據。如果 exports = ‘abc’,不會改變模塊返回的結果,因為module.exports為{},所以模塊返回的是{}

模塊導入

  1. 使用require方法導入文件:

    • 自定義的模塊:路徑建議寫相對路徑 const m = require('./m.js');,并且不能省略./../
    • 內置的模塊:直接require('模塊名'),無需加./../
  2. 文件類型處理

    • jsjson類型的文件不用寫后綴
    • 其他類型的文件不寫后綴就會按js類型處理
  3. require導入自定義模塊的基本流程:

    • 將相對路徑轉為絕對路徑,定位目標文件
    • 緩存檢測
    • 讀取目標文件代碼
    • 包裹為一個函數并執行(自執行函數),通過arguments.callee.toString()查看自執行函數
    • 緩存模塊的值
    • 返回module.exports的值
    const path = require('path');
    const fs = require('fs');
    let caches = [];
    function require(file) {// 將相對路徑轉為絕對路徑,定位目標文件let absolutePath = path.resolve(__dirname, file);// 緩存檢測if(caches[absolutePath]) {return caches[absolutePath];}// 讀取目標文件代碼let code = fs.readFileSync(absolutePath).toString();// 包裹為一個函數并執行(自執行函數)let module = {};let exports = module.exports = {};(function(exports, require, module, __filename, __dirname){// eval(code)})(exports, require, module, __filename, __dirname)// 緩存模塊的值caches[absolutePath] = module.exports;// 返回module.exports的值return module.exports;
    }
    // 測試
    const m = require('./m.js');// m.js文件
    const mt = {name: '模塊1'
    };
    module.exports = mt;
    
  4. 導入路徑是文件夾的處理流程:

    • 先檢查該文件夾下package.json文件的main屬性對應的文件,如果main屬性或package.json文件不存在,則會檢查文件夾下的index.jsindex.json文件,如果還是找不到就會報錯
    Created with Rapha?l 2.3.0 require('../文件夾') 檢查文件夾下的package.json文件 存在? 檢查main屬性 存在? 導入成功 檢查文件夾下的index.js或index.json文件 存在? 導入失敗 yes no yes no yes no

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714622.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714622.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714622.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

“а”搭配使用更地道,柯橋外貿俄語培訓

1、а именно 就是說,就是,正是 例: в то время, а именно год назад. 那時, 也就是一年前。 не кто иной, а именно г-н Ван. 不是別人,就是王先生 2、а наоборот …

【嵌入式——QT】QListWidget

QListWidget類提供了一個基于項的列表小部件,QListWidgetItem是列表中的項,該篇文章中涉及到的功能有添加列表項,插入列表項,刪除列表項,清空列表,向上移動列表項,向下移動列表項。 常用API a…

C語言數據結構基礎——雙鏈表專題

前言 書接上回,雙鏈表便是集齊帶頭、雙向、循環等幾乎所有元素的單鏈表PLUS. 1.初始化、創建雙鏈表 typedef int LTDataType; typedef struct LTNode {LTDataType data;struct LTNode* next;struct LTNode* prev; }LTNode; 不同于單鏈表,此時每個節點應…

selenium初始學習--打開新標簽操作

selenium 打開新標簽操作 簡單說一下使用 環境 :python 3.9 selenium 4,18 初始化操作 目的 打開bilibilie網站并搜索視頻(電影) 并點擊觀看 操作 打開應用并搜索網址 from selenium import webdriver import timefrom selenium.webdr…

PySide6+VSCode Python可視化環境搭建

#記住在cmd中運行,不要在vscode里運行,否則env會裝到工程目錄下 python -m venv env #env\Scripts\activate.bat pip install pyside6 下載本期源碼 vscode裝一個PYQT Integration插件,設置好兩個路徑(下面有個腳本用于獲取路徑&…

MySQL 數據庫表設計和優化

一、數據結構設計 正確的數據結構設計對數據庫的性能是非常重要的。 在設計數據表時,盡量遵循一下幾點: 將數據分解為合適的表,每個表都應該有清晰定義的目的,避免將過多的數據存儲在單個表中。使用適當的數據類型來存儲數據&…

2020小學甲組--恢復數組

題目描述 有一個數組a[1..n]&#xff0c;但是這個數組的內容丟失了&#xff0c;你要嘗試恢復它。已知以下的三個事實&#xff1a; 1、對于1<i<n&#xff0c;都有a[i]>0&#xff0c;且所有的a[i]互不相同。即a數組保存的全部都是正整數&#xff0c;且互不相同。 2、…

挑戰杯 基于機器視覺的車道線檢測

文章目錄 1 前言2 先上成果3 車道線4 問題抽象(建立模型)5 幀掩碼(Frame Mask)6 車道檢測的圖像預處理7 圖像閾值化8 霍夫線變換9 實現車道檢測9.1 幀掩碼創建9.2 圖像預處理9.2.1 圖像閾值化9.2.2 霍夫線變換 最后 1 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分…

范偉:你們怎么老提1,200呢,有什么典故啊?趙本山:沒有啊!

范偉&#xff1a;你們怎么老提1,200呢,有什么典故啊?趙本山&#xff1a;沒有啊&#xff01; --小品《面子》&#xff08;中3&#xff09;的臺詞 表演者&#xff1a;趙本山 高秀敏 范偉 &#xff08;接上&#xff09; 范偉&#xff1a;哎吃啊 趙&#xff1a;哎呀這電視看的挺…

Acwing枚舉、模擬與排序(一)

連號區間數 原題鏈接&#xff1a;https://www.acwing.com/problem/content/1212/ 初始最小值和最大值的依據是題目給出的數據范圍。只要在數據范圍之外就可以。 連號的時候&#xff0c;相鄰元素元素之間&#xff0c;差值為1。那么區間右邊界和左邊界&#xff0c;的值的差&#…

cAdvisor+Prometheus+Grafana 搞定Docker容器監控平臺

cAdvisorPrometheusGrafana cAdvisorPrometheusGrafana 搞定Docker容器監控平臺1、先給虛擬機上傳cadvisor2、What is Prometheus?2.1、架構圖 3、利用docker安裝普羅米修斯4、安裝grafana cAdvisorPrometheusGrafana 搞定Docker容器監控平臺 1、先給虛擬機上傳cadvisor cAd…

MySQL事務和鎖機制

MySQL技術——事務和鎖機制 一、事務&#xff08;1&#xff09;概述&#xff08;2&#xff09;ACID特性&#xff08;3&#xff09;事務并發存在的問題&#xff08;4&#xff09;事務的隔離級別 二、鎖機制&#xff08;1&#xff09;鎖的力度&#xff08;2&#xff09;表的分類&…

網絡編程-編碼與解碼(Protobuf)

編碼與解碼 下面的文字都來自于極客時間 為什么要編解碼呢&#xff1f;因為計算機數據傳輸的是二進制的字節數據 解碼&#xff1a;字節數據 --> 字符串&#xff08;字符數據&#xff09; 編碼&#xff1a;字符串&#xff08;字符數據&#xff09;–> 字節數據 我們在編…

Python 實現海康機器人工業相機 MV-CS050-10GC 的實時顯示視頻流及拍照功能(實時顯示視頻流同時可以進行拍照)

參考鏈接&#xff1a; https://www.cnblogs.com/HanYork/p/17388506.html https://www.cnblogs.com/miracle-luna/p/16960556.html#5138211 Flask搭建流媒體服務器&#xff1a;使用Flask搭建一個流媒體服務器_multipart/x-mixed-replace; boundaryframe-CSDN博客

公共字段自動填充

在開發中經常面臨對于一些公共字段的賦值。 如在下表中&#xff1a; 如何讓程序自動為我們需要賦值的公共字段進行賦值&#xff0c;避免在業務代碼中重復寫這些公共字段的賦值代碼 如下圖所示&#xff1a; 實現思路&#xff1a; 1.自定義注解AutoFill&#xff0c;用于標識需…

linux環境安裝cuda toolkit

1 全新安裝 如果環境中沒安裝過cuda版本&#xff0c; 這種情況下比較簡單。 直接在https://developer.nvidia.com/cuda-toolkit-archive選擇對應版本下載安裝即可。 如下為安裝cuda toolkit 11.8. 2 環境中已經存在其他版本 這種情況下比較復雜一些。 首先要確認最高支持的…

李沐動手學習深度學習——4.2練習

1. 在所有其他參數保持不變的情況下&#xff0c;更改超參數num_hiddens的值&#xff0c;并查看此超參數的變化對結果有何影響。確定此超參數的最佳值。 通過改變隱藏層的數量&#xff0c;導致就是函數擬合復雜度下降&#xff0c;隱藏層過多可能導致過擬合&#xff0c;而過少導…

Git多人合作的推送流程

多人合作時&#xff0c;使用Git進行代碼推動&#xff08;push&#xff09;需要一定的協調和規范&#xff0c;以確保代碼庫的整體健康。以下是一個常見的多人合作時的Git代碼推動流程&#xff1a; 同步主分支&#xff1a; 在推送之前&#xff0c;確保你的本地主分支&#xff08;…

【Java】四大函數式接口

消費型接口Consumer 消費型接口接收一個輸入&#xff0c;沒有返回值 在stream流計算中 forEach() 接收一個消費型接口Consumer用于 遍歷元素 /*** 消費型接口* 接收一個輸入&#xff0c;沒有返回值*/ public class demo01 {public static void main(String[] args) {//TODO 消…

【MySQL】表的內連和外連(重點)

表的連接分為內連和外連。 一、內連接 內連接實際上就是利用 where 子句對兩種表形成的笛卡兒積進行篩選&#xff0c;前面學習的查詢都是內連接&#xff0c;也是在開發過程中使用的最多的連接查詢。 select 字段 from 表1 inner join 表2 on 連接條件 and 其他條件; 注意&…